コマンド
pt-slave-restart [オプション] [DSN]
【必須項目】
- ・ [ オプション ] : -p パスワード
【主なオプション】
- ・ [ DSN ] : h=ホスト名, u=ユーザー名(デフォルトではそれぞれlocalhost, root)
※ここで指定するDSNはスレーブ側のものを使用します
目的
レプリケーションの Slave を監視して、エラー等により停止した場合に自動的に再起動を試みます
シナリオ
マスター側に以下のようなテーブルを用意します(スレーブ側にも同テーブルがレプリケーションされます)
mysql> CREATE TABLE `test001` (`id` int(11) DEFAULT NULL) \
ENGINE=InnoDB DEFAULT CHARSET=utf8;
スレーブ側のテーブルにPRIMARY KEY 制約をつけます
mysql> ALTER TABLE test001 ADD PRIMARY KEY(id);
スレーブ側のコンソール画面から、以下のコマンドを実行します
# pt-slave-restart -u root -ppassword
マスター側で以下のSQLを実行し、意図的にスレーブ側でキー重複エラーを起こします
mysql> INSERT INTO test001(id) VALUES(1);
mysql> INSERT INTO test001(id) VALUES(1);
結果
スレーブ側で、レプリケーションのエラーが発生します
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.11.50
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000020
Read_Master_Log_Pos: 38232509
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 1737
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: Yes
Slave_SQL_Running: No
(省略)
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '1' for key 'PRIMARY'' on query. Default database: 'test'. Query: 'INSERT INTO test001(id) VALUES(1)'
※スレーブ側のみPRIMARYキーが設定されているため、重複したデータをINSERT出来ずエラーが発生する
その後、pt-slave-restart が動作します
[Et@localhost ~]$ pt-slave-restart -u root -ppassword
2017-04-10T18:34:27 u=root mysql-relay-bin.000003 1737 1062
エラーの原因となる処理がスキップされ、レプリケーションが正常に継続されます
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.11.50
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000020
Read_Master_Log_Pos: 38232509
Relay_Log_File: mysql-relay-bin.000003
Relay_Log_Pos: 1954
Relay_Master_Log_File: mysql-bin.000020
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: 38232509
良い点
レプリケーション中にエラーが生じても、その処理をスキップしてくれるので、レプリケーションの停止を防ぐことができます