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=$?
mysqlを再起動
# service mysqld restart

一応ログをみてエラーが出てなかったら完成
参考http://www.irori.org/doc/mysql-rep.html