41
* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service ) 1/41 페이지 서 진우([email protected]) 2. 리눅스 Server 구축 및 실무 운영 2.9. Mysql DB Server Admin 이 장에서는 Mysql DBA 에게 필요한 다양한 기술에 대해 소개 하도록 하겠습니다. 앞장의 [Apache, Php, Java(Tomcat), Mysql 개발 환경 웹 Server] 부분에서 기본적인 Mysql 설치 방법에 대해서는 다룬 적이 있습니다. 이 장에서는 보다 구체적인 Mysql 관리 방법에 대해 소개하도록 하겠습니다. 2.9.1 Mysql 최적화 설치 하기 2.9.1.1 소스 코드로 설치하기 Mysql 을 구할수 있는곳은 http://www.mysql.com/downloads/mirrors.html 을 방문하면 자신이 있는곳에서 가장 가까운 곳에서 소스코드를 다운 받을 수 있습니다. 소스로 mysql 이 설치하기전에 먼저 자신의 시스템이 rpm 으로 이미 설치 가 되어져 있는지 확인하시고 먼저 설치된 rpm 을 제거해 주시길 바랍니다. # rpm -qa | grep mysql # rpm -e mysql-x.xx.xx(verison) # tar xzvf mysql-version.tar.gz // 압축해제 # cd mysql-version // 압축이 풀린 Directory로 이동 # ./configure --prefix=/usr/local/mysql --with-charset=euc_kr // 옵션과 함께 configure 실행 # make // make 실행 # make install // make install 실행 # bin/mysql_install_db // 기본 DB와 테이블 생성 # chown -R mysql. /usr/local/mysql/data // Mysql DB 권한 변경

2. 리눅스 Server 구축 및 실무 운영 - syszone.co.krsyszone.co.kr/PDF/enterprise-linux-2-9.pdf · * 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

1/41 페이지 서 진우([email protected])

2. 리눅스 Server 구축 및 실무 운영

2.9. Mysql DB Server Admin

이 장에서는 Mysql DBA 에게 필요한 다양한 기술에 대해 소개 하도록 하겠습니다.

앞장의 [Apache, Php, Java(Tomcat), Mysql 개발 환경 웹 Server] 부분에서 기본적인

Mysql 설치 방법에 대해서는 다룬 적이 있습니다. 이 장에서는 보다 구체적인 Mysql

관리 방법에 대해 소개하도록 하겠습니다.

2.9.1 Mysql 최적화 설치 하기

2.9.1.1 소스 코드로 설치하기

Mysql 을 구할수 있는곳은 http://www.mysql.com/downloads/mirrors.html

을 방문하면 자신이 있는곳에서 가장 가까운 곳에서 소스코드를 다운 받을

수 있습니다.

소스로 mysql 이 설치하기전에 먼저 자신의 시스템이 rpm 으로 이미 설치

가 되어져 있는지 확인하시고 먼저 설치된 rpm 을 제거해 주시길 바랍니다.

# rpm -qa | grep mysql

# rpm -e mysql-x.xx.xx(verison)

# tar xzvf mysql-version.tar.gz // 압축해제

# cd mysql-version // 압축이 풀린 Directory로 이동

# ./configure --prefix=/usr/local/mysql --with-charset=euc_kr

// 옵션과 함께 configure 실행

# make // make 실행

# make install // make install 실행

# bin/mysql_install_db // 기본 DB와 테이블 생성

# chown -R mysql. /usr/local/mysql/data // Mysql DB 권한 변경

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

2/41 페이지 서 진우([email protected])

# bin/safe_mysqld -u mysql & // mysql Daemon 실행

2.9.1.2 설치 옵션

configure 옵션엔 위에 설치시 사용한 --prefix --with-charset 이외도

여러 옵션이 있다. 확인할려면 다음과 같이 문서를 만든뒤 살펴 보도록하자.

# ./configure --help > mysql_otion.txt

대표적인 기타 추가 옵션으로는 다음이 있다.

기타 추가 옵션

--with-unix-socket-dir=/usr/local/mysql/sock/socket.mysql

소켓정보파일을 /usr/local/mysql/sock/socket.mysql 로 지정생성하겠다

이 부분을 기술하지 않으면 /tmp/(디폴트 소켓이름) 으로 사용됩니다.

--localstatedir=/mysqldb : 이것은 데이타베이스파일을 어디에다가 생성

할것인지 지정해주는 것입니다.기술하지 않으면 mysql_path/var 에 DB가

생성된다.

2.9.1.3 mysql Directory 구조

bin : 클라이언트 프로그램, 각종 스크립트 프로그램

include : 개발에 필요한 헤더 파일

info : 각종문서

lib : 개발에 필요한 라이브러리

libexec : mysqld (Mysql 서버 실행 Daemon)

share/mysql : Mysql 운영관리 스크립트

sql-bench : 벤치마크프로그램

var : Mysql 의 데이터와 데이터베이스 생성장소,로그파일

2.9.1.4 시스템 부팅시 Mysql 자동 실행방법

BSD 계열의 시스템에서는 /etc/rc.d/rc.local 파일의 제일 하단에 실행 명령어를

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

3/41 페이지 서 진우([email protected])

적어준다.

/usr/local/mysql/bin/safe_mysqld &

혹은..

/bin/sh -c `cd /usr/local/mysql ; ./bin/fafe_mysqld &`

System V 계열에서는 share/mysql 안에 mysql.server 스크립트를 이용하면 된다.

# cd /usr/local/mysql mysql 프로그램 생성 위치로 가서

# bin/mysql_install mysql DB 를 생성시켜준다.

# cd /usr/local/mysql/share/mysql

# vi mysql.server mysql 제어 스크립트 수정

편집기로 열어서 safe_mysql이 실행되는 라인에 -- language=korean 옵션을 추가

$bindir/safe_mysqld --user=$mysql_daemon_user --pid-file=$pid_file \

--datadir=/usr/local/mysql/var --language=korean &

# chmod 700 mysql.server

# cp -p mysql.server /usr/bin

# cp mysql.server /etc/rc.d/init.d/mysql

# ln -s /etc/rc.d/init.d/mysql /etc/rc.d/rc3.d/S95mysqld

이와 같이 해주면 된다. 주의할것은 S95mysqld 에서 95 번호는 85~99 사이에

임시로 정하되 중복되면 안된다.

일반적으로 mysql 의 시작과 중지는 그냥..

# mysql.server start

# mysql.server stop

이런식으로 하면된다. (System V 계열에서만 적용)

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

4/41 페이지 서 진우([email protected])

2.9.1.5. 바이너리로 설치하기

Mysql 에서는 소스 코드 배포 이외에 각각의 플랫폼에 맞게 소스코드를 컴파일

하여 바이너리 형태로 Mysql을 배포합니다. 바이너리로 설치할 경우 간편할뿐

아니라 설치시에도 시간을 단축할수 있습니다. 일반적으로 프로그램을 설치시

는 소스로 설치하길 권장하지만 Mysql 의 경우는 최적화된 configure 옵션이

아니라면 바이너리로 설치하는것이 20%~30% 정도 더 빠르다고 합니다.

그이유는 Mysql 개발자들이 가장 최적화된 옵션을 이용하여 바이너리 배포본을

만들기 때문입니다.

http://www.mysql.com/downloads/ 에서 자신의 플랫폼에 맞는

바이너리를 다운

로드 합니다.

# cp Mysql-Version-OS.tar.gz /usr/local // 설치Directory로 복사

# tar xzvf Mysql-Version-OS.tar.gz // 압축해제

# mv Mysql-Version-OS mysql // mysql Directory명 변경

# cd mysql // mysql Directory 이동

# scripts/mysql_install_db // 기본 DB 생성

# chown -R mysql. /usr/local/mysql/data

# bin/safe_mysql -u mysql & // Mysql Daemon 실행

2.9.1.6 Mysql 업그레이드 시 주의할 점

Mysql 을 업그레이드 하다 보면 여러가지 문제점에 부딪히게 된다.

이전 버젼의 데이터와의 호환문제와 PHP와 Mysql 혹은 Perl 과 Mysql 연동시

기존의 PHP 나 Perl 이 문제없이 잘 실행되는지등의 문제가 있다.

따라서 Mysql을 업그레이드시엔 꼭 이전 버젼의 Mysql Daemon인 mysqld 와 라이브러리

를 백업해 두는것이 좋다. 문제가 발생할땐 이전의 mysqld 파일만 libexec/mysqld

로 대체해 준다. 그럼..왠만한거는 무난히 잘 호환될것이다. 이밖에 Perl 프로그램

에서 문제가 생기면 새로 DBI 모듈을 설치해준다. 기타 다른 프로그램에서도

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

5/41 페이지 서 진우([email protected])

라이브러리가 변경됨으로 해서 문제가 발생할수도 있다. 이때는 백업해둔 라이브러리

를 lib 밑에 복사함으로 해결할수 있다.

새로운 Mysql을 설치하면서 charset 을 변경하였을 경우엔 기존의 테이블들을

# myisamchk -r -q 명령어를 이용하여 인덱스를 변경해 주어야 한다.

2.9.2 Mysql Log 파일 관리 하기

Mysql 의 로그 파일은 다음과 같이 크게 3종류가 있습니다.

a. 에러로그

b. 일반적인 로그

c. UPDATE 로그

첫번째 에러 로그는 hostname.err 의 이름으로 서버 실행시 에러를 기록하는 파일입

니다. 두번째 로그파일은 mysql 에 접근하는 사용자와 그들이 파일과 관련된 쿼리를

실행할 경우에 기록되는 로그 파일로 /usr/local/mysql/var 밑에 host_name.log 으로

저장이 되어집니다. Mysql 데이터에 파일을 기록하므로 파일과 관련된 쿼리는 DB 생

성/삭제 , 테이블 생성/삭제 , 레크드 삽입/갱신 이 있습니다.

이 로그 파일은 Mysql 실행시 --log 옵션을 주어 활성화 시키면 된다.

# /usr/local/mysql/bin/safe_mysqld --log &

업데이터로그는 테이블이 변경될때마다 해당 쿼리가 기록 됩니다. 기본적으로 활성

화 되지 않고 Mysql 실행시 --log-update 옵션으로 가능하다.

# /usr/local/mysql/bin/safe_mysql --log-update &

업데이터 로그는 /usr/local/mysql/var 밑에 host_name.00X 식으로 서버가 다시

실행되거나 mysqladmin reflesh 혹은 mysqladmin flush-logs 명령을 내릴때마다

뒤의 번호가 1씩 증가 한다. 혹은 --log-update=mysql.log 와 같이 로그파일명을

정해줄수도 있다. Update 로그는 update 쿼리만 저장하거 같지만 ..

delete , create 등의 쿼리도 모두 저장한다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

6/41 페이지 서 진우([email protected])

mysql 의 사용량이 많은 사이트는 이런 로그파일이 쌓이므로 해서 디스크 용량에

문제가 생길수 있다. 관리자는 수시로 점검하여 삭제를 해어야 한다.

로그 파일을 관리하는 방법으로는 두가지가 있다.

먼저 /usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법과

간단한 스크립트를 작성하여 cron 에 등록한뒤 관리하는 방법이 있다.

/usr/local/mysql/share/mysql/mysql-log-rotate 파일을 이용하는 방법은 ..

--log-update=mysqld.log 와 같이 로그파일을 정해서 관리할때 이용하면 된다.

# vi /usr/local/mysql/share/mysql/mysql-log-rotate

-------------------------------------------------------------------------

# This logname is set in mysql.server.sh that ends up in /etc/rc.d/init.d/mysql

#

# If the root user has a password you have to create a

# /root/.my.cnf configuration file with the following

# content:

#

# [mysqladmin]

# password = <secret>

# user= root

#

# where "<secret>" is the password.

#

# ATTENTION: This /root/.my.cnf should be readable ONLY

# for root !

/usr/local/mysql/var/mysqld.log {

# create 600 mysql mysql

notifempty

daily

rotate 3

missingok

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

7/41 페이지 서 진우([email protected])

compress

postrotate

# just if mysqld is really running

if test -n "`ps acx|grep mysqld`"; then

/usr/local/mysql/bin/mysqladmin flush-logs

fi

endscript

}

-------------------------------------------------------------------------

위의 파일을 /etc/logrotate.d Directory에 복사만 하면 알아서 로테이트 하게 된다.

단..로그파일을 교체한후 mysqladmin flush-logs 를 적용하므로 root 홈Directory에

.my.cnf 파일을 만든후 MySQL 의 root 사용자의 암호와 사용자 명을 적어주어야 한

다.

vi /root/.my.cnf

--------------------------------------

[mysqladmin]

password = xxxxxxxxx

user = root

--------------------------------------

정상적인 로그 교체의 확인은 다음과 같이 하면 된다.

# logrotate -f mysql-log-rotate

이밖에 --log-update 등의 옵션을 이용하면 수시로 로그파일의 뒤에 001,002 씩으로

번호가 증가 되면서 저장이 되므로 별도의 스크립트를 작성하여 관리해야 한다.

이는 각자 머리를 잘 짜면 될거 같다.

#!/bin/sh

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

8/41 페이지 서 진우([email protected])

find /usr/local/mysql/var -name "*.[0-9]*" -type f -mtime +3 -exec rm -f {} \;

/usr/local/mysql/bin/mysqladmin flush-logs

위와 같은 만들면 된다. 이는 "3일 지난 파일은 지워라" 로 cron 에 등록한뒤 적절한

시간마다 실행해주면 된다.

2.9.3 Mysql 설치 시 발생 문제 해결 하기

보통 솔라리스에서 gcc 를 이용하여 컴파일 하는 경우 warning 하나 없이

설치가 가능합니다. 하지만 이외의 시스템에서는 헤더 파일이 조금씩 다르

기 때문에 warning 메세지가 간혹 나타나기도 한다.

보통 컴파일시 생기는 문제는 컴파일 단계에서 configure 명령을 여러번

내릴 경우 발생합니다.

confiure 명령을 내리면 configure 의 결과를 config.cache파일에저장한

다음에 다시 configure를 실행할때 시간을 절약하기 위하여 이전의

config.cache 내용을 읽게 되는데 이때 시스템 환경이 바뀌었을때는 이전의

config.cache 내용을 읽으므로 error 가 나게 된다. 이때는 config.cache

파일의 유무를 확인한후 지워버린뒤 새로 configure 를 실행해준다.

컴파일시 생기는 다른 문제로는 sql_yacc.cc 파일을 컴파일 하는 도중

다음과 같은 에러가 나는 경우가 있다.

Internal compiler error: program cclplus got fata signal 11

또는

Out out virtual memory

또는

Virtual memory exhausted.

sql_yacc.cc 파일은 인라인 함수(Inline Function)를 사용하므로 매우 많은

메모리를 필요로 합니다. 따라서 이 문제는 대개 메모리나 스왑 영역이 부

족한 경우에 생기게 됩니다. 이문제를 해결하기 위해서는 configure 를 적용

할 때 다음과 같이 --with-low-memory 옵션을 주면 됩니다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

9/41 페이지 서 진우([email protected])

# ./configure --with-low-memory

GNU make version 이 낮을 경우 생기는 에러 내용이다.

making all in mit-pthreads make: Fatal error in reader: Makefile, line

18: Badly formed macro assignment

또는

make: file 'Makefile' line 18: Must be separator

또는

pthread.h: No such file or directory

이와 같은 메세지와 함께 에러가 발생하면 최신 make 를 설치하길 바란다.

이밖에 GNU gcc 버젼 문제로 생기는 경우도 있다.

client/libmysql.c:273 parse error before '__attribute__'

GNU gcc version 이 2.8.1 이하인 경우는 반드시 업그레이드 하길 바란다.

이밖에 컴파일시 'C++ compiler connot create executables' 라는 메세지가

발생하는 경우도 있는데 이는 Mysql 이 C++ 을 컴파일러로 사용하는데 Mysql

설치하려는 시스템에서는 gcc 를 C++ 컴파일러로 사용하는 경우에 발생하는

에러 입니다. 이 문제를 해결하기 위해서는 g++,libg++,libstdc++ 을 설치해

야 한다. gcc 를 C++ 의 컴파일러로 그대로 사용하는 방법도 있는데 이는

configure 시 다음과 같이 gcc 를 컴파일러로 사용하겠다는 옵션을 적어주면

된다.

# CXX="gcc -O3" ./configure

Mysql Daemon을 실행시 발생하는 대표적인 에러는 다음과 같다.

mysqld: Can't find file: 'host.frm'

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

10/41 페이지 서 진우([email protected])

이는 mysql 설치후 DB 를 생성을 하지 않았을때 발생한다. mysql 설치후

반드시 초기 DB 를 생성해 주어야 한다. 다음과 같이 ..

# /usr/local/mysq/bin/mysql_install_db

Can't start server: Bind on TCP/IP port: Address already in use

위의 메세지는 Mysql 이 사용하는 port 를 이미 다른곳에 사용중에 있을때

발생하는 메세지 이다. mysql 는 기본적으로 3306 포트를 사용하는데 이 포

트를 다른 서비스가 사용중이라면 다음과 같이 다른 포트를 사용하여 포트

충돌을 피해야 한다.

# /usr/local/mysql/bin/safe_mysqld -P3333 &

이밖에도 여러가지 에러와 문제가 발생할수 있다.

이렇땐 /usr/local/mysql/var/hostname.err 파일을 참조하여 문제를 해결

하면 된다.

2.9.4 Mysql 옵션 my.cnf 사용 방법

옵션 파일은 다양한 옵션을 프로그램 실행시 지정하지 않고 파일에 저장하여

좀더 편리하게 Mysql 을 사용하도록 합니다. 옵션 파일에는 크게 두가지가 있

는데 '서버에 관련된 옵션' 과 '개인 사용자에게 관련된 옵션' 이렇게 두개가

있습니다.

옵션파일의 위치로는 다음과 같다.

▶ /etc/my.cnf : Mysql 에 관련된 모든 옵션을 저장하는 옵션파일

▶ DATADIR/my.cnf : Mysql 서버에 관련된 옵션만 지정할수 있는 옵션

▶ $HOMEDIR/.my.cnf : 개인 사용자의 옵션을 지정할수 있는 옵션 파일

옵션 파일 사용법

# : 주석을 의미합니다.

[group] : 옵션을 지정할 프로그램 또는 프로그램 그룹을 지정합니다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

11/41 페이지 서 진우([email protected])

[client] : 클라이언트 프로그램에 해당하는 옵션 적용

option=value : 커맨드 모드에서 mysql --option=value 와 동일하게 적용

set-variable = variable=value :

커멘트 모드에서 --set-variable variable=value 와 동일하고 Mysql 서버의

각종 변수 옵션을 줄때 사용됩니다.

간략한 예제입니다.

/etc/my.cnf

---------------------------------------------------

[client]

port=3306

socket=/tmp/mysql.sock

[mysqld]

port=3306

socket=/tmp/mysql.sock

set-variable = key_buffer_size=16M

set-variable = max_allowed_packet=1M

[mysqldump]

quick

--------------------------------------------------

$HOMEDIR/.my.cnf

--------------------------------------------------

[client]

user=user_name

password=my_password

--------------------------------------------------

.my.cnf 는 위의 예제와 같이 자신의 계정의 Mysql 접속 정보가 저장된다.

그러므로 다른 사람에게 공개되면 안된다. 파일의 퍼미션을 600 으로 주어

서 정보 유출을 막도록 한다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

12/41 페이지 서 진우([email protected])

$ chmod 600 $HOMEDIR/.my.cnf

2.9.5 Mysql 관리자 패스워드 관리

MySQL 초기 설치시 관리자 암호는 설정 되어져 있지 않다.실질적으로

서비스 할경우엔 반드시 관리자(root) 암호를 설정해야 한다.

root 암호 설정하는 방법에는 3가지가 있다.

a. UPDATE 문 이용하기

b. SET PASSWORD 이용하기

c. mysqladmin 이용하기

▶ UPDATE 문 이용하기

$ mysql -u root mysql

mysql> update user set password=password('new-passwd') where user='root';

mysql> flush privileges;

update 문 이용하여 암호를 변경할땐 꼭 flush privileges; 를 실행

하여 변경된 내용을 적용해야 한다. MYSQL 에서 사용자 권한에 관한

내용은 MYSQL 실행시 메모리에 불러놓고 이용되는데 이에 관해 변경

된 내용이 있을땐 반드시 서버에 변경된 내용을 갱신하라는 명령을

전달해야 한다.

▶ SET PASSWORD 이용하기

mysql> set password for root=password('new-passwd');

이 방법은 flush privileges 가 필요 없다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

13/41 페이지 서 진우([email protected])

▶ mysqladmin 이용하기

root 암호 초기 설정 시 :

$ mysqladmin -u root password new-passwd

root 암호 변경 시 :

$ mysqladmin -u root -p password new-passwd

Enter password:

2.9.6 Mysql 사용자 추가 하기

Mysql 를 작업하다 보면 root 로만 작업하진 않을것이다.

여러사람에게 각각의 DB 를 제공하기 위해서는 반드시 각 DB별로

사용자를 생성해야 한다.

Mysql 에 사용자를 추가하는 방법에는 GRANT 를 이용하는 방법과 INSERT

를 이용하는 방법이 있다.

$ mysql -u root -p mysql ( 먼저 mysql DB 에 접속하자.)

Enter password: ********

mysql> grant all privileges on *.* to alang@localhost

-> identified by 'password' with grant option;

위의 내용은 localhost 의 alang 에게 (to alang@localhost ) 모든 테이블에

( *.* ) 모든 권한을 ( all privleges ) 부여하는것을 의미 한다.

참고로 grant 를 이용하여 사용자 추가할때 flush privileges 를 할 필요 없음.

위의 권한을 INSERT 구문으로 하면..

mysql> insert into user values('localhost','alang',password

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

14/41 페이지 서 진우([email protected])

('password'),

-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

mysql> flush privileges;

위와 같이 한 사용자가 모든 DB 에 접근해선 곤란하다. 보통 한 사용자에게

하나의 DB 에만 접근 가능하게 하는것이 표준이다.

mysql> grant all privileges on test.* to alang@localhost

-> identified by 'password';

웹호스팅 업체와 같은 곳에서 사용자와 DB를 추가 하는 예를 들어보다.

# mysql -u root -p mysql ( root MYSQL 에 접속 )

mysql> create database DB ( 먼저 추가될 사용자가 사용할 DB 생성 )

mysql> grant all privileges on DB.* to USER@localhost

-> identified by 'password'; ( 생성된 DB 에

USER 사용자 권한주기 )

이와 같은 방법으로 사용자를 추가 할수 있다.

2.9.7 Mysql 기본 SQL 문 사용 방법

- 데이타 베이스 생성과 삭제

데이터베이스 생성및 삭제에 대해 간단히 알아보자.

데이터 베이스 생성과 삭제에 관련된 SQL 문은 create 와 drop 다.

create database 를 통해 생성하고, drop database 통해 삭제한다.

mysql> show databases;

+-----------+

| Database |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

15/41 페이지 서 진우([email protected])

+-----------+

| board |

| shopdb |

| sysmng |

| test |

| test1 |

+-----------+

5 rows in set (0.00 sec)

먼저 어떤 DB 가 있는지 살펴 본다.

mysql> create database test2;

Query OK, 1 row affected (0.01 sec)

create database 를 이용하여 test2 란 DB 를 생성했다.

다시 show databases 를 이용해 확인하자.

mysql> show databases;

+-----------+

| Database |

+-----------+

| board |

| shopdb |

| sysmng |

| test |

| test1 |

| test2 |

+-----------+

6 rows in set (0.01 sec)

mysql> drop database test2;

Query OK, 0 rows affected (0.00 sec)

drop database 를 통해 test2 DB 를 삭제하였다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

16/41 페이지 서 진우([email protected])

mysql> show databases;

+-----------+

| Database |

+-----------+

| board |

| shopdb |

| sysmng |

| test |

| test1 |

+-----------+

5 rows in set (0.01 sec)

이밖에 데이타 베이스의 생성과 삭제는 mysqladmin 이란 명령어를 통해서

도 가능하다.

$ mysqladmin -u root -p create test2 (test2 DB 생성)

$ mysqladmin -u root -p drop test2 (test2 DB 삭제)

이와 같이 데이터베이스를 생성하면 /usr/local/mysql/var 에 생성된 데이터

베이스 명의 Directory가 생성되어진다. 그리고 생성된 데이터베이스에서

테이블을 생성하면 생성된 테이블 이름의 파일이 3개가 만들어 지는데 다음과

같다.

테이블이름.frm : 테이블 정의에 대한 정보

테이블이름.ISM : 인덱스 관련 정보

테이블이름.ISD : 데이터 내용

이와 같이 SQL 문으로 인해 만들어진 데이터베이스는 파일로 만들어져 저장

되어진다.

- Mysql SQL 기본 관리

지금까지 다루어온 내용을 기본으로 하여 나만의 데이터 베이스를 만들어

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

17/41 페이지 서 진우([email protected])

보도록 하겠다.

먼저 앞으로 사용할 DB 를 생성한다.

mysql> create database test1;

Query OK, 1 row affected (0.00 sec)

(test1 이란 DB 를 생성하였다. )

이와 같이 DB 를 생성하였으면 사용하기 전에 이 DB 에 대한 사용권한을

정해 주어야 한다. 즉 어떤 사용자가 어떠한 권한을 이 DB 에서 행할수

있는지를 정해 주어야 한다.

mysql> grant all on test1.* to alang;

Query OK, 0 rows affected (0.01 sec)

test1 이란 DB 의 모든 사용권한을 alang 이란 사용자에게 준다는 뜻이다.

데이터베이스를 생성하면 앞에서 배운바와 같이 /usr/local/mysql/var

에 새로 생성한 DB 명과 같은 Directory가 생길것이다. 확인한후 정상적

으로 생성이 되어져 있으면 이제 DB 내에 데이타를 입력할 준비가 완료

되어진것이다.

먼저 DB 에 데이터를 입력하기 전에 꼭 짚고 넘어가야할 사항이 있다.

데이터베이스에서 데이터를 입력하는데는 열과 행의 형식막?데이터가

입력되어진다. 열을 '필드'라고 하고 행을 '레코드'라고 부른다.

NO NAME EMAIL SEX

1 서진우 [email protected] m

2 박창현 [email protected] m

3 신상철 [email protected] m

4 김승진 [email protected] m

5 김수경 [email protected] w

이와 같은 데이터를 입력할려고 한다.

NO,1,2,3,4,5 와 같은 열을 필드라고 한다.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

18/41 페이지 서 진우([email protected])

1,서진우,[email protected],m 와 같은 행을 레코드라고 한다.

레코드가 많아 질수록 데이터의 중복이 발생할 우려가 생긴다.

만일 레코드중 고유 식별 데이터가 없다면 검색시 정확한 검색을 할수가

없다. 그렇기 때문에 데이터베이스를 처음에 설계할때 반드시 고유식별

을 해줄수 있는 필드를 만들어 놓아야 한다. 이를 데이터 베이스에서는

Key(Primary Key) 라고 한다. Key 와 같은 필드엔 반드시 데이터가 들어

있어야 한다. 반대로 필드중 정보를 공개할수 없거나 비워두어도 되는

특성을 가진 필드엔 NULL 값을 가지게 된다. 이제 이론은 그만하고 진짜

로 테이블을 생성해 보도록 한다.

테이블생성은 아주 쉽다. 각 필드에 들어가는 데이터의 자료형과 함께

create table 문을 적어주면 된다.

테이블 생성 형식 :

-------------------------------------

create table 테이블명 (

필드이름1 (Data형) NOT NULL

필드이름2 (Data형)

..

.

PRIMARY KEY (필드이름);

-------------------------------------

NOT NULL 은 반드시 존재해야할 데이터의 경우에 지정한다.

즉 PRIMARY KEY로 사용될 필드에 대해서는 Date type 가 반드시 NOT NULL

이 되어야 겠다.

진짜로 만들어 보자.

mysql> create table member (

-> NO INT NOT NULL,

-> NAME VARCHAR(30),

-> EMAIL VARCHAR(50),

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

19/41 페이지 서 진우([email protected])

-> SEX VARCHAR(2),

-> PRIMARY KEY (NO));

Query OK, 0 rows affected (0.00 sec)

에러 없이 처리가 무사히 되었다면 show table 과 desc 를 이용하여 테이

블이 정상적으로 생성이 되었는지를 확인하자.

mysql> show tables;

+-----------------+

| Tables_in_test1 |

+-----------------+

| member |

+-----------------+

1 row in set (0.00 sec)

mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| NO | int(11) | | PRI | 0 | |

| NAME | varchar(30) | YES | | NULL | |

| EMAIL | varchar(50) | YES | | NULL | |

| SEX | varchar(2) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

4 rows in set (0.00 sec)

생성이 완료 되었다.

생성된 테이블을 삭제 할때는 아래와 같은 방식으로 삭제할 수 있다.

mysql> drop table member;

Query OK, 0 rows affected (0.00 sec)

mysql> show tables;

Empty set (0.00 sec)

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

20/41 페이지 서 진우([email protected])

Member 테이블이 삭제 된 것을 확인 할 수 있을 것이다.

하지만 앞으로의 데이터 입력구문을 배우기 위해서는 테이블이 꼭 필요하다.

테이블 생성 시 컬럼에 해당하는 데이터 형(속성)을 지정해야 한다.

데이터 형으로 너무나 많은 종류가 있는데 시스템 관리 시에는 대표적인 몇가지만 알아 두면

된다.

INT : 4byte 정수

CHAR (M) : M개의 문자

VARCHAR (M) : 최대 M개를 넘지 않는 문자

TEXT : 최대 65535 개의 문자

그럼 다음엔 데이터 입력에 대해 살펴보도록 하겠다.

- 데이터 입력

테이블에 데이터를 입력하는 방법엔 insert 문과 load data 문을 사용할수

있다. 먼저 insert 문을 이용하여 데이터를 입력해 보도록 한다.

형식은 아래와 같다.

형식)

insert into 테이블명 (필드명1,필드명2,...) values ("데이터1","데이터2",..);

실제로 입력해 보자.

mysql> insert into member (NO,NAME,EMAIL,SEX) values

-> ("1","서진우","[email protected]","m");

Query OK, 1 row affected (0.00 sec)

별다른 에러 없이 처리가 되었으면 재대로 입력이 되었는지 살펴 보자.

테이블의 내용을 검색하는데는 앞에 언급한바와 같이 select 구문을 이용한다.

형식)

select 검색필드명.. from 테이블명

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

21/41 페이지 서 진우([email protected])

mysql> select NO,NAME,EMAIL,SEX from member;

+----+--------+-----------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+-----------------+------+

| 1 | 서진우 | [email protected] | m |

+----+--------+-----------------+------+

1 row in set (0.00 sec)

select 구문에서 모든 필드값을 검색할때 아스키 문자를 사용할수 있다.

mysql> select * from member;

+----+--------+-----------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+-----------------+------+

| 1 | 서진우 | [email protected] | m |

+----+--------+-----------------+------+

1 row in set (0.00 sec)

load data 는 데이터베이스 테이블을 초기화 할때 주로 사용 되어 진다.

먼저 입력할 데이터를 필드와 레코드에 맞주어 정렬하여 text 파일로 만들

어 놓는다.

member.txt

----------------------------------------------

0 서진우 [email protected] m

1 박창현 [email protected] m

2 신상철 [email protected] m

3 김승진 [email protected] m

4 김수경 [email protected] w

----------------------------------------------

텍스트 파일을 만들때 반드시 "방향키(->)"를 사용하여 데이터를 구분해야

한다. space bar 를 사용해선 절대 안된다. 명심해야 한다. 그리고 마지막

행에 공백이 있어서도 안된다. 이 점만 명심하고 데이터 파일을 만들면 된

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

22/41 페이지 서 진우([email protected])

다. 리눅스의 vi 편집기로 작성할때는 tab 을 사용하여 구분하면 됩니다.

mysql> load data local infile "member.txt" into table member;

mysql> select * from member;

+----+--------+-------------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+-------------------+------+

| 0 | 서진우 | [email protected] | m |

| 1 | 박창현 | [email protected] | m |

| 2 | 신상철 | [email protected] | m |

| 3 | 김승진 | [email protected] | m |

| 4 | 김수경 | [email protected] | w |

+----+--------+-------------------+------+

이와 같이 많은 데이터를 한번에 입력할수가 있다.

- 데이터 수정하기

저장된 데이터에 잘못된 부분이 있어서 수정할 경우에도 두가지 방법이

있다. delete 구문을 이용하여 테이블에 입력된 모든 데이터를 지워버리고

load data 문을 이용하여 다시 입력하는 방법과 update 문을 이용하는 방법

이 있다. 먼저 delete 와 load data 를 이용하는 방법에 대해 알아보자.

mysql> delete from member;

mysql> load data local infile "member.txt" into table member;

형식)

delete from 테이블명 ;

위와 같이 명령을 하면 테이블 내의 모든 데이터가 삭제 된다. where 구문

을 이용하여 부분적으로 삭제도 가능하나, where 구문은 나중에 다루도록

하겠다.

이제 update 문을 이용하는 방법을 알아보자.

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

23/41 페이지 서 진우([email protected])

형식)

update 테이블명 set 해당 필드명="수정데이터" where 조건문

mysql> update member set EMAIL="alang at

sysmng.com"

-> where NO="0";

Query OK, 1 row affected (0.00 sec)

일치하는 Rows : 1개 변경됨: 1개 경고: 0개

위의 구문은 NO 가 0 인 필드에서 EMAIL 값을 alang at

sysmng.com 으로 변경

한다는 의미를 갖는다.

재대로 변경이 되었는지 확인을 해보도록 하자.

mysql> select * from member;

+----+--------+-------------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+-------------------+------+

| 0 | 서진우 | [email protected] | m |

| 1 | 박창현 | [email protected] | m |

| 2 | 신상철 | [email protected] | m |

| 3 | 김승진 | [email protected] | m |

| 4 | 김수경 | [email protected] | w |

+----+--------+-------------------+------+

5 rows in set (0.00 sec)

이로써 데이터 변경에 대해서 마치도록 하겠습니다.

다음편엔 select 구문에 대해서 보다 자세하게 알아 보도록 하겠습니다.

- SELECT 문 사용하기

데이터양이 많이 지면..막연히 [ select * from table_name ] 와 같이 검색

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

24/41 페이지 서 진우([email protected])

하면..눈과 기억력이 무척 좋아야 겠죠..!! 그렇기 때문에 대량의 DB 를 검

색할땐 자신이 원하는 내용만을 검색할수 있는 select 구문을 이용하여야

합니다. 이제 select 구문과 같이 사용할수 있는 조건문에 대해 알아 보도

록 하겠습니다.

a. 원하는 행만 검색하기

원하는 행 검색이란..검색하고자 하는 컬럼 값을 포함하는 행만을 검색하

도록 하는 방법이다.

일단 member 테이블의 모든 내용을 검색합니다.

mysql> select * from member;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

이번엔 회원중 여자분 만을 검색하도록 하겠습니다.

mysql> select * from member where sex='w';

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

25/41 페이지 서 진우([email protected])

+----+--------+-------------------+------+------+--------+

2 rows in set (0.00 sec)

여기서 where 구문을 이용하여 원하는 행만을 검색할수 있는 예제이다.

위의 구문을 풀이 하면 member 란 테이블에서 sex 컬럼값이 w 인 행만

검색하란 의미이다.

b. 원하는 열만 검색하기

이번엔 원하는 열만 검색하는 방법이다. 원하는 열 검색이란..

검색하고자 하는 컬럼값만을 출력하도록 하는 것이다.

즉 만일 회원들의 이름만 검색하고자 한다. 혹은 회원들의 email 만

검색하고자 한다.. 이럴경우 사용하는 방법이다.

컬럼중 NAME 컬럼열만 검색

mysql> select name from member;

+--------+

| name |

+--------+

| 서진우 |

| 박창현 |

| 김수경 |

| 신상철 |

| 김승진 |

| 이필유 |

| 우서준 |

+--------+

7 rows in set (0.00 sec)

컬럼중 EMAIL 컬럼열만 검색

mysql> select email from member;

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

26/41 페이지 서 진우([email protected])

+-------------------+

| email |

+-------------------+

| [email protected] |

| [email protected] |

| [email protected] |

| [email protected] |

| [email protected] |

| [email protected] |

| [email protected] |

+-------------------+

7 rows in set (0.00 sec)

컬럼중 NAME 과 EMAIL 만 검색

mysql> select name,email from member;

+--------+-------------------+

| name | email |

+--------+-------------------+

| 서진우 | [email protected] |

| 박창현 | [email protected] |

| 김수경 | [email protected] |

| 신상철 | [email protected] |

| 김승진 | [email protected] |

| 이필유 | [email protected] |

| 우서준 | [email protected] |

+--------+-------------------+

위와 같이 [ select 검색컬럼명 from 테이블명 ] 형식으로 원하는 열만

검색할수 있다.

원하는 컬럼가 여러개 일경우는 (,) 로 구분하면 된다.

- 고급 SELECT 문 사용하기..

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

27/41 페이지 서 진우([email protected])

a. 중복행 제거

각 컬럼에서 중복된 행을 없애기 위하여 select 구문의 "검색컬럼명"

앞에 distinct 를 넣어 주면 된다.

mysql> select distinct sex from member;

+------+

| sex |

+------+

| m |

| w |

+------+

sex 컬럼값에 중복된 행을 제거하고 대표대는 값만을 출력하게 된다.

수학의 교집합에 해당하는 것이다.

mysql> select distinct sex,name from member;

+------+--------+

| sex | name |

+------+--------+

| m | 서진우 |

| m | 박창현 |

| w | 김수경 |

| m | 신상철 |

| m | 김승진 |

| w | 이필유 |

| m | 우서준 |

+------+--------+

위의 예문은 distinct 를 이용하여 컬럼값을 그룹별로 묶어서 출력하는

예이다.

b. where 구문에서 논리 연산과 관련 연산 사용하기

만일 where 구문 사용에서 여러가지 연산구문을 이용하여 다양한 검색을 행할수

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

28/41 페이지 서 진우([email protected])

있다. 사용되는 기호엔 or, and, =, !=, <, > 등이 있다.

no 컬럼값이 1 혹은 3 인 행을 검색하는 구문예이다.

mysql> select * from member where no='1' or no='3';

+----+--------+-------------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+-------------------+------+

| 1 | 박창현 | [email protected] | m |

| 3 | 김승진 | [email protected] | m |

+----+--------+-------------------+------+

no 컬럼값이 1보다 크고 4보다 작은 행은 검색하는 구문예이다.

mysql> select * from member where no < 4 and no > 1 ;

+----+--------+------------------+------+

| NO | NAME | EMAIL | SEX |

+----+--------+------------------+------+

| 2 | 신상철 | [email protected] | m |

| 3 | 김승진 | [email protected] | m |

+----+--------+------------------+------+

2 rows in set (0.00 sec)

no 컬럼값이 1 인 필드를 제외한 나머지 필드를 검색한다.

mysql> select * from member where no != '1';

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

29/41 페이지 서 진우([email protected])

+----+--------+-------------------+------+------+--------+

6 rows in set (0.00 sec)

c. 내림차순, 오름차순 정렬 검색

DB 를 검색하다 보면 테이블에 저장된 값들을 컬럼별로 정렬해서 출력해야 할

경우가 생긴다. 이때 사용되는것이 [ ORDER BY ] 이다.

ORDER BY 컬럼명 ASC : 내림차순(정)

ORDER BY 컬럼명 DESC : 오름차순 (역)

내림차순에서 ASC 는 생략 가능하다.

차순은 영문은 abc... 한글은 ㄱ,ㄴ,ㄷ.. 숫자는 1,2,3.. 순으로 정해진다.

mysql> select * from member order by no asc;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

mysql> select * from member order by sex asc;

mysql> select * from member order by sex asc;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

30/41 페이지 서 진우([email protected])

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

mysql> select * from member order by name;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

위의 예제들은 각각 no,sex,name 컬럼들을 내림차순으로 정렬한것이다.

다음예는 오름차순으로 정렬을 해 보도록 하자.

mysql> select * from member order by no desc;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

31/41 페이지 서 진우([email protected])

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

mysql> select * from member order by sex desc;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.01 sec)

mysql> select * from member order by name desc;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 2 | 김수경 | [email protected] | w | 서울 | |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

- ALTER 구문 사용하기

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

32/41 페이지 서 진우([email protected])

a. 필드 추가 하기

더 많은 데이터가 증가 되면서 필드의 개수를 추가 해야 할 경우가 종종

발생하게 된다. 이때 사용되는 구문이 alter 구문이다.

mysql> select * from member;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동 |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

위의 출력문과 같이 현재 no,name,email,sex,area,bob 의 필드로 구성된

테이블이 member 이다. 여기에 나이에 관련된 age 필드를 추가 한다고

가정하면..

mysql> alter table member add age varchar(3);

Query OK, 7 rows affected (0.00 sec)

레코드: 7개 중복: 0개 경고: 0개

mysql> select * from member;

+----+--------+-------------------+------+------+--------+------+

| NO | NAME | EMAIL | SEX | AREA | HOB | age |

+----+--------+-------------------+------+------+--------+------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동 | NULL |

| 1 | 박창현 | [email protected] | m | 서울 | 운동 | NULL |

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 | NULL |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

33/41 페이지 서 진우([email protected])

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 | NULL |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 | NULL |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 | NULL |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 | NULL |

+----+--------+-------------------+------+------+--------+------+

7 rows in set (0.00 sec)

위와 같이 [ alter table member add age varchar(3) ] 구문을 사용하면

된다. alter 구문의 형식은 다음과 같다.

형식)

ALTER TABLE [테이블 이름] ADD [추가필드명] [변수타입]

위의 예제에서 보는 바와 같이 alter table 필드를 추가 하면 행당 필드

값은 무조건 NULL 로 표시된다.

b. 필드 삭제 하기

필요없는 필드를 제거 하는 것도 alter 구문으로 한다. 형식은 다음과

같다.

형식 )

ALTER TABLE [테이블 이름] DROP [삭제필드명]

mysql> alter table member drop age;

Query OK, 7 rows affected (0.00 sec)

레코드: 7개 중복: 0개 경고: 0개

mysql> select * from member;

+----+--------+-------------------+------+------+--------+

| NO | NAME | EMAIL | SEX | AREA | HOB |

+----+--------+-------------------+------+------+--------+

| 0 | 서진우 | [email protected] | m | 서울 | 운동

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

34/41 페이지 서 진우([email protected])

| 1 | 박창현 | [email protected] | m | 서울 | 운동

| 2 | 김수경 | [email protected] | w | 서울 | 컴퓨터 |

| 3 | 신상철 | [email protected] | m | 경기 | 컴퓨터 |

| 4 | 김승진 | [email protected] | m | 서울 | 컴퓨터 |

| 5 | 이필유 | [email protected] | w | 경기 | 요리 |

| 6 | 우서준 | [email protected] | m | 서울 | 운동 |

+----+--------+-------------------+------+------+--------+

7 rows in set (0.00 sec)

c. 필드정보 변경하기

필드 속성을 변경할때도 alter 구문을 이용한다. 형식은 다음과 같다.

형식 )

ALTER TABLE [ 테이블 이름 ] CHANGE [현재 필드명] [변경할 필드명] [변수타입]

예) 필드명 변경

먼저 member 테이블 정보를 확인하자.

mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| NO | int(11) | | PRI | 0 | |

| NAME | varchar(30) | YES | | NULL | |

| EMAIL | varchar(50) | YES | | NULL | |

| SEX | char(2) | YES | | NULL | |

| AREA | varchar(8) | YES | | NULL | |

| HOB | varchar(10) | YES | | NULL | |

| age | char(3) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

7 rows in set (0.00 sec)

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

35/41 페이지 서 진우([email protected])

age 필드명을 "나이" 로 바꾸어 보자.

mysql> alter table member change age 나이 varchar(3);

Query OK, 7 rows affected (0.01 sec)

레코드: 7개 중복: 0개 경고: 0개

확인하자.

mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| NO | int(11) | | PRI | 0 | |

| NAME | varchar(30) | YES | | NULL | |

| EMAIL | varchar(50) | YES | | NULL | |

| SEX | char(2) | YES | | NULL | |

| AREA | varchar(8) | YES | | NULL | |

| HOB | varchar(10) | YES | | NULL | |

| 나이 | char(3) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

7 rows in set (0.00 sec)

예) 변수타입 변경

mysql> alter table member change 나이 나이 varchar(10);

Query OK, 7 rows affected (0.00 sec)

레코드: 7개 중복: 0개 경고: 0개

mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| NO | int(11) | | PRI | 0 | |

| NAME | varchar(30) | YES | | NULL | |

| EMAIL | varchar(50) | YES | | NULL | |

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

36/41 페이지 서 진우([email protected])

| SEX | char(2) | YES | | NULL | |

| AREA | varchar(8) | YES | | NULL | |

| HOB | varchar(10) | YES | | NULL | |

| 나이 | varchar(10) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

7 rows in set (0.00 sec)

예) 필드명과 변수타입 변경

mysql> alter table member change 나이 age varchar(3);

Query OK, 7 rows affected (0.00 sec)

레코드: 7개 중복: 0개 경고: 0개

mysql> desc member;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| NO | int(11) | | PRI | 0 | |

| NAME | varchar(30) | YES | | NULL | |

| EMAIL | varchar(50) | YES | | NULL | |

| SEX | char(2) | YES | | NULL | |

| AREA | varchar(8) | YES | | NULL | |

| HOB | varchar(10) | YES | | NULL | |

| age | char(3) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

7 rows in set (0.00 sec)

이것을 Mysql 관리에 필요한 기본 SQL 문 설명을 마치도록 하겠습니다.

다음은 Mysql DB 백업 및 복구에 대해 알아보겠습니다.

2.9.8 Mysql DB 백업 및 복구

Database 에서 백업과 복구는 매우 중요한 부분이다.

시스템 불안및 외부 영향으로 데이타에 손상이 갔을때 백업이 재대로 되어

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

37/41 페이지 서 진우([email protected])

있지 않을경우 정말 막연할것이다. 이밖에 서버를 이전한다던지 기타 한꺼

번에 DB 전체를 재 갱신 할때 백업과 복구에 관련된 기술은 필수적이라 할

수 있다.

Mysql 에서 백업 명령어로 대표적인 것은 mysqldump 를 들수 있다.

2.9.8.1 백업하기

형식 )

mysqldump -u [ DB user ] -p [ password ] [ DB_name ] > backup_file_name

[alang@arhdev alang]$ mysqldump -u alang -p test1 > test.dat

Enter password:

위와 같이 Mysql 백업을 할수가 있다. 백업된 파일의 내용을 보도록 하자.

[alang@arhdev alang]$ vi test.dat

---------------------------------------------------------------------

# MySQL dump 8.13

#

# Host: localhost Database: test1

#--------------------------------------------------------

# Server version 3.23.37

#

# Table structure for table 'member'

#

CREATE TABLE member (

NO int(11) NOT NULL default '0',

NAME varchar(30) default NULL,

EMAIL varchar(50) default NULL,

SEX char(2) default NULL,

AREA varchar(8) default NULL,

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

38/41 페이지 서 진우([email protected])

HOB varchar(10) default NULL,

PRIMARY KEY (NO)

) TYPE=MyISAM;

#

# Dumping data for table 'member'

#

INSERT INTO member VALUES (5,'이필유','[email protected]','w','경기','요리');

INSERT INTO member VALUES (6,'우서준','[email protected]','m','서울','운동');

--------------------------------------------------------------------------

이와 같이 DB 의 내용이 dump 되어져서 text 파일로 만들어져 있으면

백업이 무사히 되어진것이다.

만일 대용량의 DB 를 전체적으로 백업하기엔 부담스러울수도 있다.

그리고 필요한 부분은 일부분인데 전체로 백업하는것도 힘들것이다.

하지만 이런 문제로 크게 걱정할 필요는 없다.

mysqldump 는 원하는 table 만 백업할수도 있다.

형식)

mysqldump -u [DB_user] -p [password] [DB_name] [table_name] > backup_file_name

[alang@arhdev alang]$ mysqldump -u alang -p test1 member > member.sql

위 구문은 test1 DB 의 member 테이블만을 member.sql 파일로 백업 하는 구문이다.

2.9.8.2. 백업 파일 복구 하기

백업파일을 복구 하는 방법은 매우 간단하다.

앞에 mysql 접속하는 방법과 매우 유사 하다.

형식 )

mysql -u [ DB_ser ] -p [ DB_name ] < backup_file_name

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

39/41 페이지 서 진우([email protected])

예 )

mysql -u alang -p test2 < member.sql

위와 같이 백업파일을 복구 할수가 있습니다.

2.9.9 Mysql Replication으로 엔터프라이즈 Mysql 구축 하기

- svr1, svr2 서버에 mysql 을 버전은 3.23 이상으로 설치 한다.

- mysql replication 설정하기

svr1 서버를 master 서버로 지정 함.

svr2 서버를 slaver 서버로 지정 함.

- master 서버에 DB 복제를 해주는 역할의 User 를 만든다.

mysql > GRANT FILE ON *.* TO cluster@"%" IDENTIFIED BY '<password>';

여기서 % 대신에 slave 서버 주소를 적어 주어도 상관없음.

master 의 /etc/my.cnf

-------------------------------------------------------------------

[mysqld]

log-bin

binlog-do-db=syszone

server-id=1

-------------------------------------------------------------------

binlog-do-db='DB 이름'

slaver 의 /etc/my.cnf

-------------------------------------------------------------------

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

40/41 페이지 서 진우([email protected])

[mysqld]

server-id=2

master-host=192.168.133.165

master-user=repli

master-password=root///

master-port=3306

-------------------------------------------------------------------

master-user=repli 가 잘 안되면 그냥 root 로 한다.

단..root 역시 원격 DB 접속을 가능토록 해주어야 한다.

mysql> select User,Host from user;

+---------+-----------+

| User | Host |

+---------+-----------+

| root | % |

| www | % |

| | localhost |

| root | localhost |

| sahak21 | localhost |

| www | localhost |

| www | svr2 |

+---------+-----------+

svr1, svr2 서버의 mysql deamon 을 차례로 start 시킨다.

확인 절차 --master server ( svr1 )

mysql > show master status;

+--------------+----------+--------------+------------------+

| File | Position | Binlog_do_db | Binlog_ignore_db |

+--------------+----------+--------------+------------------+

| svr1-bin.023 | 79 | syszone | |

+--------------+----------+--------------+------------------+

* 실무 관리자를 위한 Linux Enterprise Server ( To construct Linux Service )

41/41 페이지 서 진우([email protected])

확인 절차 --slave server ( svr2 )

| Master_Host 192.168.133.165

| Master_User root

| Master_Port 3306

| Connect_retry 60

| Master_Log_File svr1-bin.023

| Read_Master_Log_Pos 79

| Relay_Log_File svr2-relay-bin.025

| Relay_Log_Pos 271

| Relay_Master_Log_File svr1-bin.023

| Slave_IO_Running Yes

| Slave_SQL_Running Yes

| Replicate_do_db

| Replicate_ignore_db

| Last_errno 0

| Last_error

| Skip_counter 0

| Exec_master_log_pos 79

| Relay_log_space 271

여기서 master pos 에 관련된것이 master status 의 position 값과 일치해야 한다.

이제 Mysql master 서버에 insert 작업을 한 후 slave 서버에서 확인을 해보면 역시 데이터가

추가되었을 것이다.