MySQL의 Replication은 부하분산 도구로 쓸수도 있지만, DB 백업의 용도로도 사용할수 있다.
보통 다른곳에 레퍼런스가 많으나, 간단히 백업을 할수 있는 script를 만들었다.
* master, slave 가 되도록이면 버젼이 같아야 하고 버젼이 다를 경우 혹은 innodb의 경우 MATHOD=1(dump) 방식으로 하는게 좋다.
* Backup할동안(tables read lock이 걸린경우) insert, update, delete가 안된다. 읽기 위주의 사이트라면 downtime을 가지나, 안 가지나 같은 결과이므로 (결과적으론 insert, update, delete가 안되므로), 입력/수정단을 막아두고 리얼타임 백업을 해도 될듯 하다.
case : ubuntu
master, slave 기본셋팅
일단 master, slave 서버의 my.cnf 파일 수정, 일단 bind-adress 주석처리
# localhost which is more compatible and is not less secure. # bind-address = 127.0.0.1
master – my.cnf 수정
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M binlog_do_db = exampledb
slave – my.cnf 수정
server-id=2 master-connect-retry = 60 replicate-do-db = exampledb
master 에 기본 접근권한 설정
GRANT REPLICATION SLAVE ON exampledb.* TO 'master_user'@'fill_me' IDENTIFIED BY 'master_password'; FLUSH PRIVILEGES;
replication-master.sh
#!/bin/sh # usage : replication-master.sh # setting zone : start ROOT_ID=root ROOT_PASSWORD=fill_me TARGET_DB=exampledb TARGET_PATH=/var/lib/mysql/exampledb SLAVE_SSH_ID=fill_me SLAVE_IP=fill_me MATHOD=0 #1:hotcopy 0:dump # setting zone : end mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB -e "FLUSH TABLES WITH READ LOCK" mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB -e "SHOW MASTER STATUS" if [ $MATHOD = 1 ]; then sudo tar cvfPz mysql-snapshot.tar.gz $TARGET_PATH else mysqldump -u$ROOT_ID -p$ROOT_PASSWORD --opt $TARGET_DB > ~/.snapshot.sql fi mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB -e "UNLOCK TABLES" if [ $MATHOD = 1 ]; then scp ~/mysql-snapshot.tar.gz $SLAVE_ID@$SLAVE_IP:~ sudo rm ~/mysql-snapshot.tar.gz else scp ~/.snapshot.sql $SLAVE_SSH_ID@$SLAVE_IP:~ rm ~/.snapshot.sql fi
replication-slave.sh
#!/bin/sh # usage : replication-slave.sh [master_log_file] [master_log_pos] if [ -z $1 ] || [ -z $2 ]; then echo "Usage: $0 [master_log_file] [master_log_pos]" 1>&2 exit 1 fi # setting zone : start ROOT_ID=root ROOT_PASSWORD=fill_me TARGET_DB=exampledb TARGET_PATH=/var/lib/mysql/exampledb MASTER_IP=fill_me MASTER_ID=master_user MASTER_PASSWORD=master_password MATHOD=0 #1:hotcopy 0:dump # setting zone : end MASTER_LOG_FILE=$1 MASTER_LOG_POS=$2 if [ $MATHOD = 1 ]; then if [ ! -e ~/mysql-snapshot.tar.gz ]; then echo "Usage: excute master-server's 'replicate-master.sh' script" exit 1 fi else if [ ! -e ~/.snapshot.sql ]; then echo "Usage: excute master-server's 'replicate-master.sh' script" exit 1 fi fi mysqladmin -u$ROOT_ID -p$ROOT_PASSWORD stop-slave if [ $MATHOD = 1 ]; then sudo rm -rf $TARGET_PATH sudo tar xvfPz ~/mysql-snapshot.tar.gz rm mysql-snapshot.tar.gz else mysqldump -u$ROOT_ID -p$ROOT_PASSWORD --add-drop-table --no-data $TARGET_DB | grep DROP | mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB < ~/.snapshot.sql rm .snapshot.sql fi mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB -e "CHANGE MASTER TO MASTER_HOST='$MASTER_IP', MASTER_USER='$MASTER_ID', MASTER_PASSWORD='$MASTER_PASSWORD', MASTER_LOG_FILE='$MASTER_LOG_FILE', MASTER_LOG_POS=$MASTER_LOG_POS" mysqladmin -u$ROOT_ID -p$ROOT_PASSWORD start-slave mysql -u$ROOT_ID -p$ROOT_PASSWORD $TARGET_DB -e "SHOW SLAVE STATUS \G"
Usage
- master, slave my.cnf를 수정한다.
- 기본적인 데이타베이스 셋팅 및 권한에 대한 부분들을 체크 MySQL 서버를 리스타팅 한다.
- ‘replicate-master.sh’, ‘replication-slave.sh’의 setting zone을 수정한다.
- master서버에서 ‘replicate-master.sh’ 스크립트를 실행해서 나오는 File, Position을 ‘replication-slave.sh’ 인수로 같이 실행시키된다.
- 백업시 테이블이 lock되니 lock걸렸을때 나는 예상상황들은 http://blog.pages.kr/232 를 참조