マスターでの更新情報をバイナリログとしてスレーブに転送、これをSQLに変換しスレーブで実行しデータ同期を行うようだ。バイナリログは逐次スレーブ側に転送される?
BackUpをとるには同じDBを作製しておく必要がある。
/etc/my.cnf
[mysqld] ## REPLICATION MASTER SETTING ## user = mysql server-id = 1 log-bin character-set-server = utf8
設定内容
SLAVE IP :10.1.4.142~
User :repl
mysql> GRANT REPLICATION SLAVE ON *.* TO repl@10.1.4.142 IDENTIFIED BY '*****';
マスタのバイナリログのどの時点からレプリケートを開始すればよいかスレーブにはわからないからないので、場所を決定するに必要となる。この場所がFileとPosition。
(Master側でDBをLock) <=変更が多くないときは不要かもでも安全のため
mysql> FLUSH TABLES WITH READ LOCK;
logファイルと、logポジションを表示
mysql> SHOW MASTER STATUS; <=(1) +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000024 | 98 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.01 sec)
DBをBackUpしてスレーブ側にコピーしてからUnLock
mysql> UNLOCK TABLES;
/etc/my.cnf
[mysqld] ## REPLICATION SLAVE SETTING server-id = 2 character-set-server = utf8 read-only <=アプリケーションからの変更禁止
以下のCHANGE MASTER TO と STOP/START SLAVE;はDBを追加するごとに必要
一度CHANGE MASTER TO は実行すればOK
mysql> CHANGE MASTER TO
-> MASTER_HOST='10.99.99.202',
-> MASTER_PORT=3306,
-> MASTER_USER='repl',
-> MASTER_PASSWORD='*******',
-> MASTER_LOG_FILE='mysql-bin.000024', <=MASTER側で表示したSTATUSの結果を記入
-> MASTER_LOG_POS=98; <=MASTER側で表示したSTATUSの結果を記入
Query OK, 0 rows affected (0.04 sec)
スレーブの起動
mysql> START SLAVE; Query OK, 0 rows affected (0.01 sec)
スレーブの状態の表示
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.99.99.202
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000024
Read_Master_Log_Pos: 98
Relay_Log_File: localhost-relay-bin.000002
Relay_Log_Pos: 235
Relay_Master_Log_File: mysql-bin.000024
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 98
Relay_Log_Space: 235
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
1 row in set (0.00 sec)
ERROR:
No query specified
スレーブの停止
mysql> STOP SLAVE; Query OK, 0 rows affected (0.01 sec)
CHANGE MASTER TO を実行すると以下のファイルができるので、その情報でその後再起動は問題なく動作する。
# less /var/lib/mysql/master.info 14 mysql-bin.000024 98 10.99.99.202 repl ****** 3306 60 0
# less /var/lib/mysql/relay-log.info ./localhost-relay-bin.000002 235 mysql-bin.000024 98
レプリケーションを作製するDBやテーブルの指定
Slaveのmy.cnfに指定
[mysqld]
| replicate-do-db | 対象となるデータベース名 | |
| replicate-ignore-db | 対象外となるデータベース名 | |
| replicate-do-table | 対象となるテーブル名 | 指定方法:データベース名.テーブル名 |
| replicate-ignore-table | 対象外となるテーブル名 | 指定方法:データベース名.テーブル名 |
複数あるときは
replicate-do-db = db1
replicate-do-db = db2
のように併記する。