エンジニア知識共有会発表資料_20090917_レプリケーションの障害復旧
TRANSCRIPT
MySQL4.1.21 のレプリケーションの障害復旧
短いです…
環境と経緯MySQL4.1.21(InnoDB)マスター&スレーブのレプリケーションに
て冗長化していたスレーブ・マシンに障害発生し、レプリ
ケーションを一旦停止復旧後、レプリケーションが正常に再開
できず。
異常を発見して、レプリケーションの復旧を試みる
レプリケーションの状態の確認「 mysql> show slave status; 」の
Slave_IO_Running: とSlave_SQL_Running: を見る
Slave_IO_Running: I/O スレッドが開始されたかどうかを示す
Slave_SQL_Running:SQL スレッドが開始されたかどうかを示す
稼働時と停止時稼働時
Slave_IO_Running: YesSlave_SQL_Running: Yes
停止時
Slave_IO_Running: NoSlave_SQL_Running: No
異常により停止している状態 I/O スレッドが停止している
Slave_IO_Running: NoSlave_SQL_Running: Yes↓マスターサーバに接続できない( host 名が間違っている等)、ディスクに空きがない、スレーブを停止した時点以前のバイナリログがない、等
SQL スレッドが停止している
Slave_IO_Running: YesSlave_SQL_Running: No↓スレーブサーバに更新系の SQL を発行してしまった、等
I/O スレッドが停止している場合の対処
まずは、 start slave io_thread; を試す。※オプションなしの start slave; で I/O と SQL のスレーブスレッドを同時に開始させることができるが、ここでは念のため、オプションを指定して試している。
改善しない場合には以下を実施(主な施策)A. マスターサーバの host 名の確認my.cnf :「 master-host 」「 master-user 」「 master-password 」show slave status; :「 Master_Host 」と「 Master_User 」
間違っていた場合my.cnf→ 書き直し、 mysql を再起動show slave status→CHANGE MASTER TO MASTER_HOST = ‘ ホスト名’ ,MASTER_USER = ‘ ユーザ名’ , MASTER_PASSWORD = ‘ パスワード’ ,MASTER_LOG_FILE = ‘master-bin.0000XX’, MASTER_LOG_POS = YYY;
バイナリログがなくなっていた場合
マスターサーバのバイナリログが残っているか確認し、 show slave status; の「 Master_Log_File 」の値にあるバイナリログよりも以前のログがない場合↓I/O の起動は不可。マスターサーバをもとネタに、スレーブマシンを再構築する
SQL スレッドが停止している場合の対処
まずは、 start slave sql_thread; を試す。※オプションなしの start slave; で I/O と SQL のスレーブスレッドを同時に開始させることができるが、ここでは念のため、オプションを指定して試している。
改善しない場合↓今回の異常はこのパターン原因は、レプリケーション停止中にスレーブサーバでなんらかの更新系 SQL がはいってしまった。
Show slave status; の「 Last_Error: 」 Last_Error: Error 'Duplicate entry ‘123456' for key 1' on
query. Default database: ‘db_name'. Query: 'INSERT INTO sessions (`updated_at`, `session_id`, `data`) VALUES('2009-09-08 18:04:04', 'afa6900d3b0352f745aca345e249d879', 'BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNo\nSGFzaHsABjoKQHVzZWR7AA==\n')‘
テーブル「 db_name 」 (DB はテーブル名から推論する ) のid 「 123456 」 (entry`123456` の部分 ) のレコードが重複している、というアラート↓つまり、スレーブ側にすでに ID が存在するため、同期ができない、という状態
復旧の手順Stop slave;Show slave status; の「 Last Error: 」から、
テーブル名と Id を確認重複したレコードを同期回避する
A. 同レコードを削除する (DELETE 文 )B. 同レコードを無視する (SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; )
Start slave;
注意点など重複レコードを削除する場合には、削除
後のレプリケーション再開後に、同 ID のレコードが再度スレーブに書き込まれているか確認する
スレーブへの書き込みがあり得ないならば、 my.cnf に read_only オプションを指定する
参考 現場指向のレプリケーション詳説
http://www.irori.org/doc/mysql-rep.html [MySQL ウォッチ ] 第18回レプリケーションのトラブル脱出
http://itpro.nikkeibp.co.jp/members/ITPro/oss/20050712/164383/?ST=oss&P=1
MySQL レプリケーションの設定http://www.maruko2.com/mw/MySQL_ レプリケーションの設定
[MySQL] レプリケーションとスレーブ (Slave) エラーの対処( データの整合性 )http://blog.mikuriya.biz/archives/6
MySQL レプリケーションを安全に利用するための10のテクニックhttp://nippondanji.blogspot.com/2009/03/mysql10.html