製品

Percona

pt-slave-restart

コマンド

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

良い点

レプリケーション中にエラーが生じても、その処理をスキップしてくれるので、レプリケーションの停止を防ぐことができます