MySQL ロールフォワードをやってみよう

ホーム > 業務日誌 > スタッフ別 > > MySQL ロールフォワードをやってみよう

 

今回はMySQLのロールフォワードの紹介記事です。

 

課金や顧客の財産がデータベースに書き込まれていくサービスを運用する場合、ロールフォワードは必須の技術になります。ロールフォワードする場面を想像しただけで、おなかが痛くなりますね・・・・・・^^;

ロールフォワード

 

データベース障害が発生したときに、記録してあるチェックポイントデータを再現した上で、ログファイルに残っているチェックポイント後の処理を再現し、障害直前の状態にまで戻すこと。障害直前のデータが再現される。主に、ディスクの損傷などの物理的障害に対して用いられる。

 

@see e-words

 

事前準備

  1. 定期的なDBバックアップ、
  2. バイナリログを出力をさせておく

上記の条件を整えたMySQLの運用を行っておきます。

 

障害発生。ロールフォワードが必要な事態に!

  1. 水を飲みます。精神集中。冷静に、冷静に。
  2. 1秒でも早く復旧ではなく、1~2時間以内に着実に復旧する事を考える。
  3. まずWEBサーバをメンテナンスモードにしてユーザにWEB上で告知するか、止める。とにかく更新がかからないようにする。
  4. 障害発生時点のDBデータをフルダンプする。
  5. バイナリログの退避
  6. 最新のチェックポイントデータからマスターのログファイルとポジションを確認する。
  7. バイナリログから問題のクエリを確認する。
  8. バイナリログから問題のクエリを除いた復旧クエリを抽出する×n
  9. 最新のチェックポイントからリストア ※ロールバック
  10. 復旧クエリからリストア ※ロールフォワード
  11. データを確認

 

 

 

まず、必ず予めバイナリ出力をオンにした運用を行います。バイナリログがないと復旧が出来ないからです。

ロールフォワード記事の為のテーブル作り。

データを入れます。

この段階でチェックポイントとなるダンプデータを作成します。

作成されていることを確認。

続けてデータを入れていきます。

途中経過を確認します。

 

さて、続けてデータを入れていきます。

 

mysql> DELETE FROM staff WHERE name = “yuu”;

ここで誤ったクエリによるデータ消失のトラブルに気付く!!

 

ここでメンテナンスモードにします。

 

データの更新を防ぐためWEBサーバを止めるか、メンテナンスモードにしてユーザに告知して下さい。

バイナリデータを退避させます。

障害発生時のダンプデータを取得します。

最新チェックポイントの中身、マスターログとポジションを確認します。

— CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000015′, MASTER_LOG_POS=120;

dumpの後はmysql-bin.000015から見ればいいことがわかります。mysql-bin.00001~mysql-bin.000014は無視できますね。

(※障害時のdump取得時の–flush-logsオプションを入れているので、mysql-bin.000016も無視できる。)

 

mysql-bin.000015から問題のクエリを探します。

 

ポジション1085と1211の間に問題のクエリを見つけました。

 

バイナリログより復旧クエリその1を作成します。

更にバイナリログの最後のポジションを確認します。

最後のポジションは1537であることがわかります。
バイナリログより復旧クエリその2を作成します。

 

最新チェックポイントからのロールバック

ここで最新のチェックポイントを使ったリストアを行います。

復旧クエリによるロールフォワード

 

復旧クエリ1と2を使い更にリストアします。

 

確認します。

4番のレコードも消えずに入っています。

 

これで問題のクエリを避けつつ、データを正常に復旧させることが出来ました。WEBサーバを動かしてサービスを再開させます。

ロールフォワードはある程度練習して手順を頭に入れておかないと、障害が発生した緊急時に迅速な対応が出来ないので慣れておく必要があります。

 

優 ( エンジニア )

この記事を書いた人:優 ( エンジニア )

システムガーディアン爆弾処理班。アクセス負荷対策やNginxへの移行案件が多いこの頃。IBM SoftLayerやAWSなどクラウド案件も多くなってきました。

この記事に関してのお問い合わせ
御連絡・ご返信は原則2営業日以内を予定しております。
お急ぎの場合は、お手数ですが下記電話でもご対応をしております。

システムガーディアン株式会社
受付時間:平日9:00~18:00
受付担当:坪郷(つぼごう)・加藤
電話:03-6758-9166