MySQL4.1.21のレプリケーションの障害復旧<br />短いです…<br />
環境と経緯<br />MySQL4.1.21(InnoDB)<br />マスター&スレーブのレプリケーションにて冗長化していた<br />スレーブ・マシンに障害発生し、レプリケーションを一旦停止<br />復旧後、レプリケーションが正常に再開で...
レプリケーションの状態の確認<br />「mysql&gt; show slave status;」のSlave_IO_Running: とSlave_SQL_Running: を見る<br />Slave_IO_Running:I/Oスレッド...
稼働時と停止時<br />稼働時Slave_IO_Running: YesSlave_SQL_Running: Yes<br />停止時Slave_IO_Running: NoSlave_SQL_Running: No<br />
異常により停止している状態<br />I/Oスレッドが停止しているSlave_IO_Running: NoSlave_SQL_Running: Yes↓マスターサーバに接続できない(host名が間違っている等)、ディスクに空きがない、スレーブを...
I/Oスレッドが停止している場合の対処<br />まずは、start slave io_thread; を試す。※オプションなしのstart slave;でI/OとSQLのスレーブスレッドを同時に開始させることができるが、ここでは念のため、オプ...
バイナリログがなくなっていた場合<br />マスターサーバのバイナリログが残っているか確認し、show slave status;の「Master_Log_File」の値にあるバイナリログよりも以前のログがない場合↓I/Oの起動は不可。マスター...
SQLスレッドが停止している場合の対処<br />まずは、start slave sql_thread; を試す。※オプションなしのstart slave;でI/OとSQLのスレーブスレッドを同時に開始させることができるが、ここでは念のため、オ...
Show slave status;の「Last_Error:」<br />Last_Error: Error &apos;Duplicate entry ‘123456&apos; for key 1&apos; on query. Defa...
復旧の手順<br />Stop slave;<br />Show slave status;の「Last Error:」から、テーブル名とIdを確認<br />重複したレコードを同期回避するA.同レコードを削除する (DELETE文)B.同レコ...
注意点など<br />重複レコードを削除する場合には、削除後のレプリケーション再開後に、同IDのレコードが再度スレーブに書き込まれているか確認する<br />スレーブへの書き込みがあり得ないならば、my.cnfにread_onlyオプションを指...
参考<br />現場指向のレプリケーション詳説http://www.irori.org/doc/mysql-rep.html <br />[MySQLウォッチ]第18回レプリケーションのトラブル脱出http://itpro.nikkeibp.c...
Upcoming SlideShare
Loading in...5
×

エンジニア知識共有会発表資料_20090917_レプリケーションの障害復旧

2,752
-1

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,752
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

エンジニア知識共有会発表資料_20090917_レプリケーションの障害復旧

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

    Clipping is a handy way to collect important slides you want to go back to later.

×