레이블이 데이터베이스인 게시물을 표시합니다. 모든 게시물 표시
레이블이 데이터베이스인 게시물을 표시합니다. 모든 게시물 표시

2009년 9월 17일 목요일

KLDPWiki: MySQL리플리케이션 (REPLICATION OR CLUSTER)

KLDPWiki: MySQL리플리케이션




1.1 Replication 이란?

Replication은 3.23.15부터 지원되기 시작한 기능으로 ‘복제’라는 사전적 의미에 맞게 마스터의 MySQL 서버의 데이터를 여러 대의 슬레이브 MySQL 서버의 데이터와 동기화 시켜주는 기능이다. 주로, MySQL의 데이터를 실시간으로 백업하거나, 데이터 서버의 부하분산을 하고자 할 때 많이 사용된다.


Dual-Master Replication을 구축하기 위해, 먼저 Master-Slave로 구성된 Replication 상태를 만들어야 한다.

1.2 How to Set Up Replication

1.2.1 MASTER 와 SLAVE 설치

MySQL을 master 와 slave 서버에 설치한다. 안정성을 위해 두 서버의 버전을 맞춰주는 것이 좋다. Replication 기능은 3.23.15부터 지원되기 시작하였으나 3.23.32부터 안정화되었다고 알려져 있으므로, 그 이상 혹은 최신 버전의 MySQL 을 설치하길 권장한다.

1.2.2 MASTER 계정생성

slave 서버에서 master 서버에 접속할 수 있도록, master 서버에 계정을 만든다. 사용자를 추가해 주어야 한다는 말이다. 이 계정에 REPLICATION SLAVE 권한을 주어야 한다. replication에만 사용할 계정이라면 추가적인 권한은 주지 않아도 된다. slave 서버에서master 서버에 접속할 계정과 패스워드에 권한을 부여하는 명령은 다음과 같다.

master mysql > GRANT REPLICATION SLAVE ON *.*
-> TO 'user_name'@'user_host' IDENTIFIED BY 'user_password';


여기서 user_name은 중복되지 않는 이름이면 되며, user_host 는 slave로 만들 서버의 주소 혹은 도메인 네임을 적어준다. 이 주소의 slave 유저만 master 서버로 접속할 수 있다. 4.0.2 이전 버전의 MySQL에서는, REPLICATION SLAVE 권한이 없으므로, 다음과 같이 FILE 권한으로 대신한다.

master mysql > GRANT FILE ON *.*
-> TO 'user_name'@'user_host' IDENTIFIED BY 'user_password';

1.2.3 MASTER 데이터 SLAVE 에 복사

master 서버의 기본 데이터를 백업 받아, slave 서버의 데이터베이스에 복사한 후, 데이터 디렉토리에서 압축을 푼다.


HOT 백업

master mysql > FLUSH TABLES WITH READ LOCK;
master shell > tar -cvf /tmp/mysql-snapshot.tar .
slave shell > tar -xvf /tmp/mysql-snapshot.tar
master mysql > UNLOCK TABLES;


mysqldump 이용 백업

master Shell > mysqldump -u root -p ‘password’ -B db_name > dump_file.sql

1.2.4 MASTER 환경설정

Master 와 Slave 의 데이터 베이스 환경을 설정한다. 우선 master 서버를 설정하도록 한다.

master shell> vi /etc/my.cnf


master 서버는 디폴트로 구성이 되어 있을 것이므로, mysqld 섹션에 log-bin이 있는 지 확인한다.

[mysqld]
log-bin
server-id = 1

1.2.5 SLAVE 환경설정

다음은 slave 서버의 환경설정이다.

slave shell> vi /etc/my.cnf


mysqld 섹션으로 가서 server-id를 master 서버의 server-id와 다르게 설정한다. 본 문서에서는 2로 설정하도록 하겠다. slave 서버를 여러 대로 구축하고자 할 때에 각 slave 서버의 server-id는 각각 달라야 한다는 것에 주의하자. 2^32-1까지 가능하다.

[mysqld]
server-id = 2
master-host = xxx.xxx.xxx.xxx(user_host)
master-port = 3306
master-user = user_name
master-password = user_password


master 서버의 데이터를 백업 받았다면, slave 서버를 시작하기 전에 slave 서버의 데이터 디렉토리에 master 서버의 데이터를 복사해 둔다. mysqldump를 사용했다면, 다음으로 가서 먼저, slave 서버를 스타트한다.

1.2.6 SLAVE 서버 스타트

slave 서버를 스타트한다.

slave shell > /etc/init.d/mysqld start

1.2.7 SLAVE 덤프파일 LOAD

mysqldump를 사용해 백업 파일을 만들었다면, slave 서버에 덤프 파일을 로드시킨다.

slave shell > mysql -u root -p < dump_file.sql

1.2.8 MASTER 계정 설정

slave 서버에서 master-host, master-user, master-password 등의 설정을 다음과 같이 바꿀 수도 있다. 물론 /etc/my.cnf에서 설정하지 않았을 경우에도 쓸 수 있다.

slave mysql >  CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;

각 옵션의 최대 길이는 다음과 같다.

MASTER_HOST 60
MASTER_USER 16
MASTER_PASSWORD 32
MASTER_LOG_FILE 255

1.2.9 SLAVE 쓰레드 스타트

slave 쓰레드를 스타트한다.

slave mysql > START SLAVE;

1.2.10 SUCCESS CERTIFICATION

mysql/data/slave.err을 확인하여 다음과 같은 메시지가 있으면 성공적으로 설정된 것이다.

Slave I/O thread: connected to master 'user_name@user_host:3306',  replication started in log 'FIRST' at position 4

1.3 How to Set Up Dual-Master Replication

우선 이후에서는 지금까지 master 라고 칭했던 서버를 mysql1 서버라고 하고, slave라 칭했던 서버를 mysql2 서버라 하겠다. 듀얼 마스터 리플리케이션을 구축할 두 대의 서버에는 동일 버전의 최신 MySQL이 설치되어 있으며, Master-Slave 리플리케이션이 구축된 상태에 있다고 간주한다.

이미 앞에서 리플리케이션 구축에 대해 자세히 설명하였으므로, 과정에 대해서만 기술하기로 하겠다.

1.3.1 SLAVE STOP

mysql2 서버로 이동한 후, mysql2 서버의 mysql 구동을 멈춘다.

mysql2 shell > /etc/init.d/mysqld stop

1.3.2 SLAVE LOG DELETE

mysql2 서버의 -bin log를 삭제한다.

1.3.3 SLAVE RESTER

mysql2 서버의 mysql을 구동시킨다.

mysql2 shell > /etc/init.d/mysqld start

1.3.4 GRANT REPLICATION SLAVE

d. mysql2 서버에서 GRANT REPLICATION SLAVE명령을 실행한다. Dual-Master란 것이 서로가 서로의 master이자 slave가 되는 것이므로, 이전의 설치에서 slave였던 mysql2가 mysql1 서버의 유저를 slave 유저로 갖게 된다.

mysql2 mysql > GRANT REPLICATION SLAVE ON *.*
-> TO 'users_name'@'users_host' IDENTIFIED BY 'users_password';

1.3.5 MASTER SETUP

이제 mysql1 서버로 이동하여, 설정을 계속한다. 우선, mysql1 서버의 mysql 구동을 멈춘다.

mysql1 shell > /etc/init.d/mysqld stop

1.3.6 MASTER CONFIGURATION

mysql1 서버의 /etc/my.cnf 파일을 수정한다. mysqld 섹션으로 가서 mysql2 서버를 마스터로 간주하도록 정보를 추가한다.

[mysqld]
server-id = 1 <= 그대로 두고, 아래 내용을 추가한다.
master-host = users_host
master-port = 3306
master-user = users_name
master-password = users_password

1.3.7 MASTER START

mysql1 서버의 mysql을 구동시킨다.

mysql1 shell > /etc/init.d/mysqld start

1.3.8 SUCCESS CERTIFICATION

mysql/data/mysql1.err을 확인하여 다음과 같은 메시지가 있으면 성공적으로 설정된 것이다.

Slave I/O thread: connected to master 'ccotti@222.112.137.172:3306',  replication started in log 'FIRST' at position 4

지금까지 별다른 문제없이 설치를 진행하였다면, 각 서버의 mysql 모니터에서 데이터를 입력하고, 두 서버가 서로 연동이 되는 것을 확인할 수 있을 것이다.

1.4 장애복구

위의 설정에서 두 대의 서버 중 한 대가 장애를 일으키는 경우 한 서버를 리부팅한다고 가정할 때, 별도의 설정이 없다면 기존의 MySQL 리플리케이션 구성에서는 두 서버 간의 동기화가 원활히 일어나지 않았다. 그런 경우 다음을 순서대로 진행하며, 장애를 복구할 수 있다. 우선 mysql1 서버를 재시작해야 한다고 가정하자.

1. mysql1의 mysql/data/ 의 mysql1-bin.*를 지운다.

2. mysql1의 mysqld를 시작한다.

mysql1 shell > /etc/init.d/mysqld start

3. mysql2의 mysql 모니터에서 다음 명령어를 실행한다.

mysql2 mysql > slave stop;
mysql2 mysql > slave reset;
mysql2 mysql > slave start;

1.5 참고

● master와 slave 데이터 일치 방법

- master mysql을 정지시키고 대상 파일들을 백업(복사) - master mysql을 구동

-> 이 후 변경사항들이 bin-log에 기록됨

- slave에 백업한 DB 파일들을 복사 후 구동

-> master의 bin-log를 참고하여 데이터 일치됨 ※ 이 때, 복사한 파일의 소유자(mysql인지?) 확인 철저 ※ my.cnf 설정에서 특정 DB를 선택한 경우 master와 slave 모두 동일하게 설정해야 함

(한 쪽은 설정하지 않고 한 쪽은 설정한 경우 오동작)

※ my.cnf 주의사항 : mysql_safe 실행 시 DB_DIR 옵션에 따라 불러오는 위치 달라짐

● slave에서 'LOAD TABLE FROM MASTER' 나 'LOAD DATA FROM MASTER' 명령을

사용하기 위해서는 replication 계정에 다음은 권한 추가 필요

- SUPER, RELOAD, SELECT 권한을 replication 계정에 부여 ● 다음 명령을 통해 mysql의 내부cache를 clear시키고 쓰기 방지 가능

※ mysql 기본 테이블인 MyISAM 테이블을 사용할 경우 - mysql> FLUSH TABLES WITH READ LOCK;

● 쓰기 방지 해제 명령

- mysql> UNLOCK TABLES;

● slave의 mysql을 replication 미적용하고 구동 방법

- /usr/local/bin/mysqld_safe --skip-slave-start ● slave 동작 구동 방법 - mysql> start slave;

※ slave 설정 미인식 등의 문제 발생 시

mysql> change master to 명령을 사용하여 설정

● replication 정상동작 확인

- mysql> show processlist;

또는 mysql> show processlist\G ; 상세한 내용 확인

- mysql> show slave status;

또는 mysql> show slave status\G ; 상세한 내용 확인 또는 mysql> show master status;

- error 로그 확인



마스터에서는 mysql>show master status 라고 해보면

mysql> show master status;

*************************** 1. row ***************************

File: www-bin.001

Position: 12476

Binlog_do_db:

Binlog_ignore_db:

1 row in set (0.00 sec)


슬래이브에서는 mysql> show slave status

mysql> show slave status;

*************************** 1. row ***************************

Master_Host: 211.57.173.XXX

Master_User: repli

Master_Port: 3306

Connect_retry: 60

Master_Log_File: www-bin.001

Read_Master_Log_Pos: 12476

Relay_Log_File: king-relay-bin.001

Relay_Log_Pos: 12514

Relay_Master_Log_File: www-bin.001

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: 12476

Relay_log_space: 12518

1 row in set (0.00 sec)


등으로 나온다. 그러면 정상적으로 동작하는것이다.

위에서 12476 이라는 포지션 숫자가 보이는가? 이게 똑같이 나와야 한다.

mysql 다중 서버 관리

리눅스포털


mysql 다중 서버 관리


운영체제 : Linux, Unix, Windows 등
홈페이지 : www.mysql.com
라이센스 : 상업용, GPL

소속 : 리눅스포털(주)수퍼유저코리아
제작자 : 이재석


1. mysql 다중 서버란 ?

mysqld를 소켓과 포트 데이터베이스를 달리하여
여러개의 MySQL 서버를 구동하는 것을 말한다.

myqld_safe를 이용하는 방법과 mysql_multi를 이용하는
두가지 방법이 있다.

하지만 mysqld_safe를 이용하는 것은 번거로은 면이 많아
실행시 주의를 요한다.


2. mysql 다중서버운영시 장단점

- 장애시 전체 디비서버에 영향을 미치지 않는다.
- 각 디비서버별 root사용자를 지정할 수 있다.
- 서로 상이한 설정의 디비서버를 같은 장비에서 운영가능하다.
- 하나의 mysqld로 서비스가 포화 상태인 경우


3. myqld_safe를 이용하는방법

추가로 컴파일할 필요없이 기존에 사용하는 mysqlDB를 그대로
이용가능하다.

[첫번째 mysqld의 설정파일]
[client]
port = 3306
socket = "/tmp/mysql.sock"

[mysqld]
port = 3306
socket = "/tmp/mysql.sock"

[두번째 mysqld의 설정파일]
[client]
port = 3307
socket = "/tmp/mysql2.sock"

[mysqld]
port = 3307
socket = "/tmp/mysql2.sock"


[첫번째 mysqld 실행]
# mysqld_safe --defaults-file=/etc/my.cnf &

[두번째 mysqld 실행]
# mysqld_safe
--defaults-file=/etc/my1.cnf
--pid-file=/usr/local/mysql/data/hostname.pid1
--socket=/tmp/mysql.sock1
--skip-network &

[첫번째 mysqld 접속 방법]
mysql -u [username] -p [databasename]

[두번째 mysqld 접속 방법]
mysql -u [username] -p -S [/path/to] [databasename]

4. mysql_multi를 이용하는방법
[설정 방법]
[client]
(생략)...

[mysql]
(생략)...

[mysqld]
default-character-set = euc_kr
skip-name-resolve
skip-network ## only localhost access
datadir = /usr/local/mysql/data
language = /usr/local/mysql/share/mysql/english
user = mysql
(생략)...

[mysqld_multi]
mysqld = /usr/local/mysql/bin/safe_mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
#user = root

[mysqld1]
socket = /tmp/mysql.sock1
port = 3307
datadir = /usr/local/mysql/data1
pid-file = /usr/local/mysql/data1/mysqld1.pid
log = /usr/local/mysql/data1/mysqld1.log

[mysqld2]
socket = /tmp/mysql.sock2
port = 3308
datadir = /usr/local/mysql/data2
pid-file = /usr/local/mysql/data2/mysqld2.pid
log = /usr/local/mysql/data2/mysqld2.log

[myisamchk]
(생략)...

[mysqladmin]
(생략)...

[mysqldump]
(생략)...

[실행방법]
mysql_multi 사용법
mysql_multi [OPTIONS] {start|stop|report} [GRN,GRN...]

전체 MySQL 서버실행시
mysqld_multi start

특정 MySQL 서버 실행시
mysqld_multi start 1

[다중서버 관리자 추가 하기]
#mysql -u root -S /tmp/mysql.sock -proot_password -e
"GRANT SHUTDOWN ON *.* TO multi_admin@localhost
IDENTIFIED BY 'multipass'"

위와 같이 멀티서버 어드민을 지정하여 사용가능하나 root를 사용하면 됨으로
필수 사항은 아니다.


[첫번째 mysqld 접속 방법]
mysql -u [username] -p -S [/path/to] [databasename]

[두번째 mysqld 접속 방법]
mysql -u [username] -p -S [/path/to] [databasename]


5. php에서 세팅방법

아파치 설정파일에서 서정해주거나 php에서 설정하여 사용가능하다.

[아파치 설정파일에 설정 할 경우]
vi httpd.conf
...

...
php_value mysql.default_socket "/tmp/mysql.sock1"



...
php_value mysql.default_socket "/tmp/mysql.sock2"

MySQL 설정 및 innoDB 설정

[Fedora 9] MySQL 설정 및 innoDB 설정 - 위즈군의 라이프로그


2.1 innodb 설정

이 글에서는 간단한 설명과 설정 위주로 하고, 넘어 가겠습니다. mysql에서 스토리지 엔진(Storage Engine)으로 사용하는 방식은 기본으로 MyISAM입니다. MyISAM은 일반적인 입출력 상황에 최적화된 기본 엔진 입니다. 하지만 웹서비스와 같이 로딩이 많은 서비스에서 더 좋은 성능을 위한 다른 스토리지 엔진이 innodb입니다. 간단하게 innodb는 데이터를 처리하는 엔진으로 로딩이 많은 데이터처리 엔진이라고 생각하면 됩니다.
스토리지 엔진에 대해 자세히 알고 싶으시면 "MySQL Storage Engine"를 참고하세요.
그럼 설정 방법을 알아 보겠습니다.

// 설정파일 편집
# vi /etc/my.cnf
// ftp 서버 시작 (컴파일 설치)
innodb_data_home_dir = /var/lib/mysql/idb
innodb_data_file_path = ibdata1:256M:autoextend:max:2000M
innodb_log_group_home_dir = /var/lib/mysql/idb
innodb_log_arch_dir = /var/lib/mysql/idb
innodb_buffer_pool_size = 2G
innodb_additional_mem_pool_size = 16M
innodb_log_file_size = 512M
innodb_log_buffer_size = 2M
innodb_flush_log_at_trx_commit = 2
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DSYNC
max_connections = 500
// mysql 재시작
# /etc/init.d/mysqld restart
// mysql 로그인
# mysql -u -p
Enter password : 비밀번호 (첫 접속시에는 비밀번호 없음)
// innodb 설정 상태 확인
mysql> SHOW VARIABLES LIKE 'have_innodb';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb | YES |
+---------------+-------+
1 row in set (0.00 sec)


// 설정 상태 확인
mysql> SHOW STATUS LIKE '%innodb%';

+-----------------------------------+---------+
| Variable_name | Value |
+-----------------------------------+---------+
| Com_show_innodb_status | 0 |
| Innodb_buffer_pool_pages_data | 178 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 189 |
| Innodb_buffer_pool_pages_free | 8013 |
| Innodb_buffer_pool_pages_latched | 0 |
| Innodb_buffer_pool_pages_misc | 1 |
| Innodb_buffer_pool_pages_total | 8192 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead_seq | 0 |
| Innodb_buffer_pool_read_requests | 1398 |
| Innodb_buffer_pool_reads | 0 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 1174 |
| Innodb_data_fsyncs | 6 |
| Innodb_data_pending_fsyncs | 0 |
| Innodb_data_pending_reads | 0 |
| Innodb_data_pending_writes | 0 |
| Innodb_data_read | 0 |
| Innodb_data_reads | 0 |
| Innodb_data_writes | 338 |
| Innodb_data_written | 3399680 |
| Innodb_dblwr_pages_written | 16 |
| Innodb_dblwr_writes | 1 |
| Innodb_log_waits | 0 |
| Innodb_log_write_requests | 75 |
| Innodb_log_writes | 4 |
| Innodb_os_log_fsyncs | 0 |
| Innodb_os_log_pending_fsyncs | 0 |
| Innodb_os_log_pending_writes | 0 |
| Innodb_os_log_written | 37376 |
| Innodb_page_size | 16384 |
| Innodb_pages_created | 178 |
| Innodb_pages_read | 0 |
| Innodb_pages_written | 189 |
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
| Innodb_rows_deleted | 0 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 0 |
| Innodb_rows_updated | 0 |
+-----------------------------------+---------+
44 rows in set (0.00 sec)


// 데이터베이스 변경
# use wizdb;
// innodb 적용
mysql> ALTER TABLE testtable type=innodb;

Query OK, 0 rows affected (0.29 sec)
Records: 0 Duplicates: 0 Warnings: 0


// 테이블 상태 확인
# mysql> SHOW TABLE STATUS;

innodb_data_home_dir = /var/lib/mysql/idb
- innodb 홈디렉터리 경로를 설정 합니다.
innodb_data_file_path = ibdata1:256M:autoextend:max:2000M
- 데티터 파일 옵션을 설정 합니다. 파일명 : 초기용량 : 자동증가 : 최대사이즈
innodb_log_group_home_dir = /var/lib/mysql/idb
innodb_log_arch_dir = /var/lib/mysql/idb
- 로그 디렉터리 정보
innodb_buffer_pool_size = 2G
- innodb에서 사용할 메모리 양으로 전체 메모리의 50~80% 정도로 설정
innodb_additional_mem_pool_size = 16M
innodb_log_file_size = 512M
- 로그 파일 사이즈로 버퍼풀 사이즈의 25% 정도로 설정
innodb_log_buffer_size = 2M
- 로그 버퍼 사이즈로 성능에 맞춰 로그를 기록하는 경우 크게 설정
innodb_flush_log_at_trx_commit = 2
- 커밋 로그 옵션으로 성능 최적화로 1분마다 저장되도록 2로 설정
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DSYNC
- 성능을 위해 메모리에서 직접 액세스 하도록 설정

기타 상세옵션과 최적화 관련 정보는 아래 참고 링크를 통해서 확인 해주세요.

2.2 DB 생성 및 사용자 설정

// mysql 관리자 비밀번호 설정
# mysqladmin -u root password '설정비밀번호'
// mysql 접속
# mysql -u -p
Enter password : 비밀번호
// DB 생성
mysql> CREATE DATABASE wizdata; // wizdata는 사용하고자 하는 DB이름 설정
// 사용자 추가 및 권한 설정
mysql> GRANT ALL ON [DB이름].* TO [사용자ID]@[접속호스트] IDENTIFIED BY 'password' WITH GRANT OPTION;
예) mysql> GRANT ALL ON wizdata.* TO wiz@localhost IDENTIFIED BY '********' WITH GRANT OPTION;
// 설정 적용
mysql> FLUSH PRIVILEGES;

좀더 많은 MySQL 사용법은 인터넷을 참고하시면 좋을 것 같습니다.


8.10. mysqldump - 데이터 베이스 백업 프로그램

mysqldump - feedtome님의 노트



8.10. mysqldump - 데이터 베이스 백업 프로그램

mysqldump 클라이언트는 Igor Romanenko가 작성한 백업 프로그램이다. 이것은 데이터베이스를 덤프하거나 또는 백업 또는 데이터를 다른 SQL 서버(MySQL서버가 아닌)에 전달하기 위해서 데이터 베이스를 모을 때 사용하는 프로그램이다. 덤프에는 테이블을 생성하거나 또는 안주(populate)시키기 위한 SQL명령문이 포함되어 있다.

만일 여러분이 서버에서 백업을 진행하고 있고, 또한 여러분이 사용하는 테이블이 MyISAM 테이블이라면, mysqlhotcopy를 대신 사용하는 것이 좋은데, 그 이유는 이것이 보다 빠른 백업과 복원을 실행하기 때문이다. Section 8.11,mysqlhotcopy 데이터 베이스 백업 프로그램”을 참조할 것.

mysqldump를 호출하는 데에는 일반적으로 세 가지 방법이 있다:

shell> mysqldump [options] db_name [tables]
shell> mysqldump [options] --databases db_name1 [db_name2 db_name3...]
shell> mysqldump [options] --all-databases

If you do not name any tables following db_name or if you use the --databases or --all-databases option, entire databases are dumped.

To get a list of the options your version of mysqldump supports, execute mysqldump --help.

만일 mysqldump --quick 또는 --opt 옵션이 없이 사용한다면, mysqldum는 결과를 덤프하기 전에 전체 결과 셋을 메모리로 읽어오게 된다. 만일 대형 데이터 베이스를 덤프할 경우에는 이것은 문제가 된다. --opt 옵션은 디폴트로 활성화 되어 있으나, --skip-opt로 비활성화 시킬 수가 있다.

만일 여러분이 최근의 mysqldump 프로그램을 사용해서 구형 MySQL 서버로 덤프를 실행하고자 한다면, --opt 또는 --extended-insert 옵션을 사용하지 말도록 한다. 대신에 --skip-opt 옵션을 사용한다.

mysqldump는 아래의 옵션을 지원한다:

  • --help, -?

도움말을 출력하고 빠져 나온다.

  • --add-drop-database

DROP DATABASE 명령문은 각각의 CREATE DATABASE 명령문 전에 추가 한다.

  • --add-drop-table

DROP TABLE 명령문을 각각의 CREATE TABLE 명령문 전에 추가한다.

  • --add-locks

Surround each table dump with LOCK TABLES UNLOCK TABLES 명령문을 사용해서 각각의 테이블 덤프를 둘러 싼다(surround). 이렇게 하면 덤프 파일을 다시 읽어올 때 보다 빠른 삽입을 실행할 수가 있다. Section 7.2.16,INSERT 명령문의 속도”를 참조.

  • --all-databases, -A

모든 데이터 베이스에 있는 모든 테이블을 덤프한다. 이것은 --databases 옵션을 사용해서 명령어 라인에서 모든 데이터 베이스 이름을 입력하는 것과 동일한 기능을 실행한다.

  • --allow-keywords

키 워드 이름을 사용해서 컬럼을 생성하는 것을 허용한다.

  • --character-sets-dir=path

문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”를 참조할 것.

  • --comments, -i

프로그램 버전, 서버 버전, 그리고 호스트와 같은 추가적인 정보를 덤프 파일에 기록한다. 이 옵션은 디폴트로 활성화 된다. --skip-comments를 사용하면, 디폴트 활성화를 없앨 수 있다.

  • --compact

간략한 결과를 만들게 한다. 이 옵션은 코맨트를 없애주며 --skip-add-drop-table, --no-set-names, --skip-disable-keys, 그리고 --skip-add-locks 옵션을 활성화 시킨다.

  • --compatible=name

다른 데이터 시스템 또는 구형 MySQL 서버와의 호환성을 보다 많이 갖도록 결과를 만든다. name의 값은 ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, 또는 no_field_options가 될 수 있다. 여러 개의 값을 사용하기 위해서는, 각각을 콤마로 구분시킨다. 이러한 값들은 서버 SQL 모드를 설정하기 위한 대응 값들과 동일한 의미를 갖게 된다. Section 5.2.5,서버 SQL 모드”를 참조할 것.

이 옵션은 다른 서버와의 호환성을 보장하지는 않는다. 단지 덤프를 한 결과가 다른 SQL 서버와 호환성을 보다 많이 가지도록 만들어줄 뿐이다. 예를 들면, --compatible=oracle는 오라클 타입의 데이터 또는 코멘트 신텍스와 매핑되는 것은 아니다.

  • --complete-insert, -c

컬럼 이름을 가지고 있는 완벽한 INSERT 명령문을 사용한다.

  • --compress, -C

클라이언트 및 서버가 압축을 지원할 경우, 두 서버간에 전달되는 정보를 압축한다.

  • --create-options

CREATE TABLE 명령문에 모든 MySQL 관련 테이블 옵션을 포함시킨다.

  • --databases, -B

여러 개의 데이터 베이스를 덤프한다. 일반적으로, mysqldump는 명령어라인에 있는 첫 번째 이름을 데이터 베이스 이름을 간주하고 그 다음의 이름을 테이블 이름으로 간주한다. 이 옵션을 사용하면, 모든 이름 인수를 데이터 베이스 이름으로 간주하게 된다. CREATE DATABASE USE 명령문은 각각의 새로운 데이터 베이스 전에 결과에 포함된다.

  • --debug[=debug_options], -# [debug_options]

디버깅 로그를 작성한다. debug_options 스트링은 종종 'd:t:o,file_name'가 된다. 디폴트는 'd:t:o,/tmp/mysqldump.trace'.

  • --default-character-set=charset_name

charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조. 만일 지정하지 않으면, mysqldump utf8를 사용한다.

  • --delayed-insert

INSERT DELAYED 명령문을 INSERT 명령문 대신에 작성한다.

  • --delete-master-logs

마스터 리플리케이션 서버에서, 덤프 연산을 실행한 후에 바이너리 로그를 삭제한다. 이 옵션은 자동으로 --master-data를 활성화 시킨다.

  • --disable-keys, -K

각각의 테이블에 대해서, INSERT 명령문을 /*!40000 ALTER TABLE tbl_name DISABLE KEYS */; 그리고 /*!40000 ALTER TABLE tbl_name ENABLE KEYS */; 명령문을 사용해서 둘러싼다(surround). 이것은 모든 열이 삽입된 후에 인덱스가 생성되기 때문에 덤프 파일을 읽어 오는데 보다 빠른 속도가 나오게 된다. 이 옵션은 MyISAM 테이블에 대해서만 효과가 있다.

  • --extended-insert, -e

여러 개의 VALUES 리스트를 가지고 있는 다중-열 INSERT 신텍스를 사용한다.이렇게 하면 덤프 파일이 작아지고 파일을 다시 읽어 올 때 삽입 속도를 빠르게 할 수가 있다.

  • --fields-terminated-by=..., --fields-enclosed-by=..., --fields-optionally-enclosed-by=..., --fields-escaped-by=..., --lines-terminated-by=...

이들 옵션은 -T 옵션과 함께 사용되며 LOAD DATA INFILE에 대한 대응 구문과 같은 의미를 가진다. Section 13.2.5, “LOAD DATA INFILE 신텍스”를 참조.

  • --first-slave, -x

기능 삭제됨. 현재는 --lock-all-tables로 바뀌었음.

  • --flush-logs, -F

덤프를 시작하기 전에 MySQL 서버 로그 파일을 플러시한다. 이 옵션은 RELOAD 권한을 필요로 한다. 만일 여러분이 이 옵션을 --all-databases (또는 -A) 옵션과 함께 결합해서 사용한다면, 로그는 각각의 덤프된 데이터 베이스에 대해서 플러시 된다는 점을 알아야 한다. 한가지 예외는 --lock-all-tables 또는 --master-data를 사용하는 경우이다: 이와 같은 경우, 로그는 모든 테이블이 잠기는 시점에 오직 한번만 플러시된다. 만일 동일한 시점에 덤프 및 로그 플러시가 일어나도록 하기 위해서는, --flush-logs --lock-all-tables 또는 --master-data와 함께 사용하도록 한다.

  • --force, -f

테이블 덤프를 하는 동안 SQL 에러가 발생하더라도 계속 진행 시킨다.

  • --host=host_name, -h host_name

주어진 호스트에 있는 MySQL 서버에서 데이터를 덤프한다. 디폴트 호스트는 localhost.

  • --hex-blob

16진법(hexadecimal)을 사용해서 바이너리 컬럼을 덤프한다 (예를 들면, 'abc' 0x616263가 된다). 이렇게 할 수 있는 데이터 타입은 BINARY, VARBINARY, 그리고 BLOB가 된다. MySQL 5.0.13까지는, BIT 컬럼도 해당된다.

  • --ignore-table=db_name.tbl_name

주어진 테이블을 덤프하지 않는데, 이것은 데이터 베이스 및 테이블 이름을 사용해서 지정해야 한다. 여러 개의 테이블을 무시하기 위해서는, 이 옵션을 여러 번 사용한다.

  • --insert-ignore

INSERT 명령문을 IGNORE 옵션과 함께 작성한다

  • --lock-all-tables, -x

모든 데이터 베이스에 걸쳐서 모든 테이블을 잠근다. 이것은 전체 덤프 주기에 대한 글로벌읽기 잠금을 통해 얻을 수 있다. 이 옵션은 자동으로 --single-transaction --lock-tables를 오프(Off)시킨다.

  • --lock-tables, -l

덤프를 하기 전에 모든 테이블을 잠근다. MyISAM 테이블의 경우에는 동시 삽입을 허용하기 위해서 테이블을 READ LOCAL로 잠근다. InnoDB BDB와 같은 트랜젝션이 되는 테이블의 경우, --single-transaction이 보다 좋은 옵션이 되는데, 그 이유는 이것은 테이블을 전혀 잠글 필요가 없기 때문이다.

여러 개의 데이터 베이스를 덤프할 때에는, --lock-tables은 각각의 데이터 베이스에 대해서 테이블을 개별적으로 잠근다는 점을 알아두기 바란다. 따라서, 이 옵션은 덤프 파일에 있는 테이블이 데이터 베이스간에 논리적으로 일관성을 가지는 것에 대해서는 보장을 하지 않는다. 서로 다른 데이터 베이스에 있는 테이블들은 완벽하게 틀린 상태에서 덤프가 된다.

  • --master-data[=value]

바이너리 로그 파일 이름과 위치(position)을 결과에 작성한다. 이 옵션은 RELOAD 권한이 필요하고 바이너리 로그는 반드시 활성화 되어야 한다. 만일 이 옵션 값이 1 이면, 그 위치 및 파일 이름은 CHANGE MASTER 명령문 형태로 덤프 결과에 작성되는데, 이것은 여러분이 슬레이브를 설정하기 위해 이 SQL 덤프를 사용하는 경우에 슬레이브 서버로 하여금 마스터의 바이너리 로그에 있는 올바른 위치에서 시작을 하도록 만든다. 만일 이 옵션 값이 2와 같다면, CHANGE MASTER 명령문은 SQL 코멘트처럼 작성된다. 만일 값이 생략되면, 이것이 디폴트 동작이 된다.

--master-data 옵션은 --single-transaction을 함께 지정하지 않는 한, --lock-all-tables를 온(ON) 시킨다 (이와 같은 경우, 글로벌 읽기 잠금은 덤프가 시작되는 짧은 시점에만 얻을 수 있다). --single-transaction에 대한 설명을 함께 참조한다. 모든 경우에, 로그 상의 모든 동작은 정확히 덤프가 일어나는 시점에 발생을 한다. 이 옵션은 자동으로 --lock-tables를 오프(Off) 시킨다.

  • --no-autocommit

각각의 덤프된 테이블에 대한 INSERT 명령문을 SET AUTOCOMMIT=0 COMMIT 명령문안에 넣는다.

  • --no-create-db, -n

이 옵션은 --databases 또는 --all-databases 옵션이 주어질 경우에 결과에 포함되는 CREATE DATABASE 명령문을 무력화 시킨다.

  • --no-create-info, -t

각각의 덤프된 테이블을 다시 생성하는 CREATE TABLE 명령문을 작성하지 않는다.

  • --no-data, -d

테이블에 대한 어떠한 열 정보도 작성하지 않는다. 이것은 테이블에 대해서 CREATE TABLE 명령문만을 덤프하고자 할 경우에 매우 유용하다.

  • --opt

이 옵션은 축약형이다; 이것은 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset를 지정하는 것과 같다. 이 옵션은 빠른 덤프 연산을 실행하며 MySQL 서버로 빠르게 다시 읽혀지는 덤프 파일을 만들어 낸다.

이 옵션은 디폴트로 활성화 되어 있지만, --skip-opt를 사용해서 비 활성화 시킬 수가 있다. opt에 의해서 활성화된 특정 옵션만을 비활성화 시키기 위해서는, 해당 옵션의 --skip 형태를 사용한다; 예를 들면, --skip-add-drop-table 또는 --skip-quick.

  • --order-by-primary

주요(primary) 키 또는 맨 처음의 유니크 인덱스(만일 인덱스가 존재한다면)를 사용해서 각각의 테이블 열을 정렬한다. 이것은 InnoDB 테이블 안으로 집어넣을 MyISAM 테이블을 덤프할 때 유용하게 사용되지만, 덤프 자체를 매우 오래 걸리게 한다.

  • --password[=password], -p[password]

서버에 접속을 할 때 사용하는 패스워드.

  • --port=port_num, -P port_num

접속용으로 사용할 TCP/IP 포트 번호.

  • --protocol={TCP|SOCKET|PIPE|MEMORY}

접속용 프로토콜.

  • --quick, -q

이 옵션은 대형 테이블을 덤프할 때 유용하다. 이것은 mysqldump로 하여금 테이블에 대한 열을 서버에서 한번에 한 열씩 추축하도록 만들고 추출한 열을 쓰기 전에 메모리에 버퍼링 하도록 만든다.

  • --quote-names, -Q

인용 부호를 사용해서 데이터 베이스, 테이블, 그리고 컬럼 이름을 둘러 쌓도록 한다. 만일 ANSI_QUOTES SQL 모드가 활성화 되어 있다면, 그 이름도 인용 부호화 시킨다. 이 옵션은 디폴트로 활성화 되어 있다. 이것은 --skip-quote-names으로 비 활성화 시킬 수 있으나, 이 옵션은 --quote-names을 활성화 시킬 수 있는 -compatible과 같은 옵션 다음에 주어져야 한다.

  • --result-file=file, -r file

주어진 파일로 결과를 직접 넣는다. 이 옵션은 윈도우에서 새 라인 문자 ‘\n’가 ‘\r\n’ 캐리지 리턴/새 라인 시퀀스로 변환되지 못하도록 하기 위해서 사용된다.

  • --routines, -R

덤프된 데이터 베이스에서 스토어드 루틴(함수 및 프로시저)를 덤프한다. --routines을 사용해서 만들어지는 결과는 CREATE PROCEDURE 루틴을 재 생성하기 위한 CREATE FUNCTION 명령문을 갖게 된다. 하지만, 이러한 명령문들은 루틴 생성 및 수정 타임 스탬프와 같은 속성을 가지지 않는다. 이것은 루틴이 리로드(reload)될 때, 리로드 시간과 동일한 타임 스탬프를 가지고서 생성된다는 것을 의미한다.

만일 여러분이 재 생성될 루틴이 원래의 타임 스탬프 속성을 가지도록 하기 위해서는, --routines를 사용하지 말도록 한다. 대신에, mysql 데이터 베이스에 대해 적절한 권한을 가지고 있는 MySQL 계정을 사용해서 mysql.proc 테이블의 내용물을 직접 덤프 및 리로드 하도록 한다.

이 옵션은 MySQL 5.0.13 에 추가되었다. 이 버전 이전에는 스토어드 루틴을 덤프할 수가 없었다. 루틴 DEFINER 값은 5.0.20 이후에 덤프가 되었다. 이것은 5.0.20 이전에는, 루틴이 리로드될 때, 리로딩 사용자에 대해서 디파이너(definer) 셋을 가지고 생성된다는 것을 의미하는 것이다. 만일 루틴이 원래의 디파이너를 가지고 재 생성되도록 하고자 한다면, 앞에서 설명한 방식으로 mysql.proc 테이블의 내용물을 직접 덤프 및 로드한다.

  • --set-charset

SET NAMES default_character_set를 결과에 추가한다. 이 옵션은 디폴트로 활성화 된다. SET NAMES 명령문을 무시하기 위해서는, --skip-set-charset를 사용한다.

  • --single-transaction

이 옵션은 서버에서 데이터를 덤프하기 전에 BEGIN SQL 명령문을 실행한다. 이것은 InnoDB BDB와 같은 트랜젝션이 되는 테이블에서만 유용한데, 그 이유는 이것이 BEGIN이 다른 어플리케이션을 블러킹하지 않은 채로 입력될 때 데이터 베이스를 일관성 있게 담프하기 때문이다.

이 옵션을 사용할 때, 여러분은 InnoDB 테이블만이 일관성 있게 덤프된다는 점을 알고 있어야 한다. 예를 들면, 이 옵션을 사용할 때 덤프되는 MyISAM 또는 MEMORY 테이블은 상태가 변경될 수도 있다.

--single-transaction 옵션과 --lock-tables 옵션은 상호 배타적인데(mutually exclusive), 그 이유는 LOCK TABLES이 암묵적으로 실행되는 트랜젝션을 연기 시키기 때문이다.

대형 테이블을 덤프하기 위해서는, 이 옵션을 quick과 결합해서 사용한다.

  • --socket=path, -S path

localhost에 접속하는 경우, 유닉스 소켓 파일 또는, 윈도우의 네임드 파이프 이름.

  • --skip-comments

--comments 옵션에 대한 설명을 참조한다.

  • --tab=path, -T path

탭으로 구분된 데이터 파일을 만든다. 각가의 덤프 테이블의 경우, mysqldump은 테이블을 생성하는 CREATE TABLE 명령문을 갖는 tbl_name.sql 파일과, 그것의 데이터를 가지고 있는 tbl_name.txt 파일을 생성한다. 이 옵션 값은 파일을 작성하는 디렉토리가 된다.

디폴트로는t, .txt 데이터 파일이 컬럼 값과 각 라인의 끝에 있는 새 라인(newline) 값 사이에 탭 문자를 사용해서 포맷된다. 이 포맷은 --fields-xxx --lines--xxx 옵션을 사용해서 명확하게 지정될 수 있다.

Note: 이 옵션은 mysqldump mysqld 서버가 구동되는 서버에서 실행될 때에만 사용될 수 있다. 여러분은 반드시 FILE 권한이 있어야 하고, 또한 서버는 반드시 여러분이 지정하는 디렉토리에 파일을 작성할 수 있어야 한다.

  • --tables

--databases 또는 -B 옵션을 무력화 시킨다. 이 옵션 다음에 나오는 모든 이름 인수는 테이블 이름으로 간주된다.

  • --triggers

각각의 덤프 테이블에 대한 트리거를 덤프한다. 이 옵션은 디폴트로 활성화 되어 있다; --skip-triggers로 비 활성화 시킬 수 있다.이 옵션은 MySQL 5.0.11 에 추가 되었다. 이전에는, 트리거를 덤프할 수 없었다.

  • --tz-utc

SET TIME_ZONE='+00:00'를 덤프 파일에 추가해서 TIMESTAMP 컬럼이 서로 다른 타임 존에 있는 서버간에 덤프되고 리로드될 수 있도록 한다. 이 옵션을 사용하지 않으면, TIMESTAMP 컬럼은 로컬 및 목적 서버의 타임 존에 덤프 및 리로드 되고, 이 결과로 인해 값이 변하게 된다. --tz-utc는 디폴트로 활성화 되어 있고, --skip-tz-utc를 사용해서 비활성화 시킬 수가 있다. 이 옵션은 MySQL 5.0.15 에서 추가 되었다.

  • --user=user_name, -u user_name

서버에 접속할 때 사용되는 MySQL 사용자 이름.

  • --verbose, -v

버보스 모드 (Verbose mode). 프로그램이 실행하는 정보를 보다 자세히 출력한다.

  • --version, -V

버전 정보를 출력하고 빠져 나온다.

  • --where='where_condition', -w 'where_condition'

주어진 WHERE 조건문에 의해 선택된 열만을 덤프한다. 만일 스페이스 또는 다른 문자가 여러분이 사용하는 명령어 해석기에서 특별하게 인식되는 경우에는 인용부호를 사용해야 한다.

Examples:

--where="user='jimf'"
-w"userid>1"
-w"userid<1"
  • --xml, -X

덤프 결과를 XML 형태로 출력한다.

또한, --var_name=value 신텍스를 사용해서 아래의 변수를 지정할 수도 있다:

  • max_allowed_packet

클라이언트/서버 통신용 버퍼의 최대 크기. 최대 크기는 1GB.

  • net_buffer_length

클라이언트/서버 통신용 버퍼의 초기 크기. 다중--삽입 명령문을 생성할 때 (--extended-insert or opt 옵션을 사용하는 것과 같이), mysqldump는 열을 최대 net_buffer_length 길이 만큼 만든다. 만일 여러분이 이 변수의 값을 늘린다면, MySQL 서버에 있는 net_buffer_length 변수가 최소한 이 만큼의 크기가 되는지를 확인해야 한다.

mysqldump의 가장 일반적인 사용은 아마도 전체 데이터 베이스에 대한 백업용일 것이다:

shell> mysqldump --opt db_name > backup-file.sql

또한 덤프 받은 파일을 아래와 같이 서버로 다시 읽어 올 수도 있다:

shell> mysql db_name < backup-file.sql

또는 아래와 같이 한다:

shell> mysql -e "source /path-to-backup/backup-file.sql" db_name

mysqldump는 또한 하나의 MySQL 서버에서 다른 MySQL 서버로 데이터를 복사해서 데이터 베이스를 안주 시키기 위한 용도로 매우 유용하게 사용할 수가 있다:

shell> mysqldump --opt db_name | mysql --host=remote_host -C db_name

하나의 명령어를 사용해서 여러 개의 데이터 베이스를 덤프하는 것도 가능하다:

shell> mysqldump --databases db_name1 [db_name2 ...] > my_databases.sql

모드 데이터 베이스를 덤프하기 위해서는, --all-databases 옵션을 사용하면 된다:

shell> mysqldump --all-databases > all_databases.sql

InnoDB 테이블의 경우, mysqldump는 온라인 백업이 가능하도록 한다:

shell> mysqldump --all-databases --single-transaction > all_databases.sql

이 백업은 덤프가 시작되는 시점에 모든 테이블에서 글로벌 읽기 잠금만 있으면 된다 (FLUSH TABLES WITH READ LOCK). 이 잠금이 이루어지면 즉시, 바이너리 로그는 읽혀지고 잠금이 릴리즈 된다. 만일 FLUSH 명령문이 실행될 때 하나의 기다란 업데이트 명령문이 구동된다면, MySQL 서버는 이 명령문이 종료할 때까지 기다리게 되고, 덤프 연산은 잠금을 풀어 버린다. 만일 MySQL 서버가 받은 업데이트 명령문이 짧은 실행을 하는 것이라면, 초기의 잠금 기간(period)은 크게 중요하지 않게 된다.

포인트-인-타임 복구(point-in-time recovery) ( “롤-포워드(roll-forward)”라고도 알려짐)에 대해서는, 바이너리 로그를 순환(rotate)시키거나, 또는 최소한 덤프가 대응하는 바이너리 로그 코디네이트(coordinate)를 아는 것이 유용하다:

shell> mysqldump --all-databases --master-data=2 > all_databases.sql

또는:

shell> mysqldump --all-databases --flush-logs --master-data=2
              > all_databases.sql

--master-data --single-transaction를 동시에 사용하면 테이블이 InnoDB 스토리지 엔진에 저장되어 있는 경우에 포인트-인-타임 복구에 대해서 적절한 온라인 백업을 만들 수가 있게 된다.