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

12
MySQL4.1.21 の ののののののののののののの のののの…

Upload: ngi-group

Post on 28-May-2015

2.711 views

Category:

Technology


0 download

TRANSCRIPT

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

MySQL4.1.21 のレプリケーションの障害復旧

短いです…

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

環境と経緯MySQL4.1.21(InnoDB)マスター&スレーブのレプリケーションに

て冗長化していたスレーブ・マシンに障害発生し、レプリ

ケーションを一旦停止復旧後、レプリケーションが正常に再開

できず。

異常を発見して、レプリケーションの復旧を試みる

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

レプリケーションの状態の確認「 mysql> show slave status; 」の

Slave_IO_Running: とSlave_SQL_Running: を見る

Slave_IO_Running: I/O スレッドが開始されたかどうかを示す

Slave_SQL_Running:SQL スレッドが開始されたかどうかを示す

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

稼働時と停止時稼働時

Slave_IO_Running: YesSlave_SQL_Running: Yes

停止時

Slave_IO_Running: NoSlave_SQL_Running: No

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

異常により停止している状態 I/O スレッドが停止している

Slave_IO_Running: NoSlave_SQL_Running: Yes↓マスターサーバに接続できない( host 名が間違っている等)、ディスクに空きがない、スレーブを停止した時点以前のバイナリログがない、等

SQL スレッドが停止している

Slave_IO_Running: YesSlave_SQL_Running: No↓スレーブサーバに更新系の SQL を発行してしまった、等

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

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;

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

バイナリログがなくなっていた場合

マスターサーバのバイナリログが残っているか確認し、 show slave status; の「 Master_Log_File 」の値にあるバイナリログよりも以前のログがない場合↓I/O の起動は不可。マスターサーバをもとネタに、スレーブマシンを再構築する

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

SQL スレッドが停止している場合の対処

まずは、 start slave sql_thread; を試す。※オプションなしの start slave; で I/O と SQL のスレーブスレッドを同時に開始させることができるが、ここでは念のため、オプションを指定して試している。

改善しない場合↓今回の異常はこのパターン原因は、レプリケーション停止中にスレーブサーバでなんらかの更新系 SQL がはいってしまった。

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

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 が存在するため、同期ができない、という状態

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

復旧の手順Stop slave;Show slave status; の「 Last Error: 」から、

テーブル名と Id を確認重複したレコードを同期回避する

A. 同レコードを削除する (DELETE 文 )B. 同レコードを無視する (SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; )

Start slave;

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

注意点など重複レコードを削除する場合には、削除

後のレプリケーション再開後に、同 ID のレコードが再度スレーブに書き込まれているか確認する

スレーブへの書き込みがあり得ないならば、 my.cnf に read_only オプションを指定する

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

参考 現場指向のレプリケーション詳説

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