mysql replication backup

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

  1. master, slave my.cnf를 수정한다.
  2. 기본적인 데이타베이스 셋팅 및 권한에 대한 부분들을 체크 MySQL 서버를 리스타팅 한다.
  3. ‘replicate-master.sh’, ‘replication-slave.sh’의 setting zone을 수정한다.
  4. master서버에서 ‘replicate-master.sh’ 스크립트를 실행해서 나오는 File, Position을 ‘replication-slave.sh’ 인수로 같이 실행시키된다.
  5. 백업시 테이블이 lock되니 lock걸렸을때 나는 예상상황들은 http://blog.pages.kr/232 를 참조