Mysqlのレプリケーション設定メモ
環境
CentOS5
Mysql5
前提
マスターのDBはある程度稼働してデータがたまっている状態
マスター側
スレーブ用のユーザを作成
#mysql -u root -p mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@"%" IDENTIFIED BY 'パスワードを記述'; mysql> exit
/etc/my.cnfに設定を追加
(省略) [mysqld] #以下を追加 log-bin=/var/lib/mysql/mysqld-bin server-id=1 (省略)
サーバをリスタート
# service mysqld restart
スナップショットを取得
コンソールを2つ開く
1つ目のコンソールでDBの更新を止める
# mysql -u root -p mysql> FLUSH TABLES WITH READ LOCK;
2つ目のコンソールでデータをtarに固める
# cd /var/lib/mysql # tar zcvf mysql_snap.tgz ./*
終わったらもう一度1つ目に戻ってバイナリログの位置情報をメモ
mysql> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | mysqld-bin.000015 | 346 | | | +-------------------+----------+--------------+------------------+
メモが終わったら止めていた更新を開始する
mysql> UNLOCK TABLES;
あとはさっき作ったスナップショットをsftpなどでスレーブ側に転送する。
でマスター側は終わり。
スレーブ側
mysqlを停止
# service mysqld stop
転送したスナップショットをmysqlのデータ置き場に解凍
# rm -rf /var/lib/mysql/* #いらないデータを消す(いるデータがある場合バックアップしとく # cp mysql_snap.tgz /var/lib/mysql # tar zxvf mysql_snap.tgz # rm mysql_snap.tgz # rm mysql-bin.*
/etc/my.cnfを編集
[mysqld] #以下を追加もしくは変更 server-id=2
mysqlを起動
# service mysqld start
スレーブの設定
#mysql -u root -p mysql> CHANGE MASTER TO -> MASTER_HOST = 'マスタのホスト名かIP', -> MASTER_USER = 'repl', -> MASTER_PASSWORD = 'さっき設定したパスワード', -> MASTER_LOG_FILE = 'mysql-bin.000015',#さっきメモしたバイナリログのファイル名 -> MASTER_LOG_POS = 346; #さっきメモしたバイナリログのポジション mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G #スレーブがうまく動いているか確認、Slave_IO_Running: YesとSlave_SQL_Running: Yesがあれば一応安心だと思う
このままだとスレーブを再起動したときにlogにエラーが書かれるので起動ファイルを修正
# vi /etc/init.d/mysqld (省略) start(){ touch "$errlogfile" chown mysql:mysql "$errlogfile" chmod 0640 "$errlogfile" [ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile" if [ ! -d "$datadir/mysql" ] ; then action $"Initializing MySQL database: " /usr/bin/mysql_install_db ret=$? chown -R mysql:mysql "$datadir" if [ $ret -ne 0 ] ; then return $ret fi fi chown mysql:mysql "$datadir" chmod 0755 "$datadir" # Pass all the options determined above, to ensure consistent behavior. # In many cases mysqld_safe would arrive at the same conclusions anyway # but we need to be sure. /usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile" \ --log-error="$errlogfile" --pid-file="$mypidfile" \ --relay-log=/var/run/mysqld/mysqld-relay-bin \ #この一行を追加 >/dev/null 2>&1 & ret=$?