MySQL

2015-02-16, mysql

InnoDBのリカバリ

これはMySQL公式ドキュメント(参考URL)で解説されているInnoDBのリカバリに関する文章の和訳です。実際の案件で必要になった部分のみ抜き出しています。

InnoDBリカバリの実施

データベースのページ破損が生じたら、テーブルのダンプをとってデータを退避します。通常、このリカバリ方法で得られるデータのほとんどは無傷です。しかしながら、ページの破損はSELECTクエリやバックグラウンド操作を止めてしまう原因にもなります。このような場合に、innodb_force_recovery オプションがバックグラウンド操作の停止させ、ダンプを可能にしてくれます。

[mysqld]セクションに以下のように記述して、データベースを再起動します。

/etc/my.cnf
[mysqld]
innodb_force_recovery = 1

警告
非常事態に、テーブルをダンプするためにのみ使用してください。また実行前にデータベース本体のバックアップを必ず取得しておきます。4以上の値は、データの完全な破損を招くことがあります。バックアップがとれていることが確認できた場合にのみ、4以上の値を使用してください。まずは1から開始し、必要に応じて値を増やすべきです。

innodb_force_recovery の規定値は0です(通常の起動)。1から6の値を設定可能です。大きな値はそれより小さな値の機能を含みます。例えば、3は1と2の機能を含みます。もし3以下の値でテーブルのダンプが取れたら、壊れてしまったページの幾つかのデータが失われたことを意味し、比較的安全です(※訳注※比較的安全(relatively safe)とは、一体どの程度なのか…)。4以上の場合は危険です。6はさらに大きな破損を引き起こす可能性のある思い切った対応をします。

1 (SRV_FORCE_IGNORE_CORRUPT)
エラーのあるページを発見しても、サーバを動作させ続けます。インデックスやページが壊れていても全件選択(SELECT * FROM tbl_name)を試みます。テーブルのダンプに役立ちます。

2 (SRV_FORCE_NO_BACKGROUND)
マスタースレッドが動作しないようにします。パージ中にクラッシュが発生する場合にそれを回避することができます。

もし完全なダンプがとれない場合は、「SELECT * FROM tbl_name ORDER BY primary_key DESC」構文で、破損箇所の手前までを抽出できるかもしれません(※訳注※INTO OUTFILEを組み合わせてファイルにダンプします)。

用語の解説

ページ
ディスク(データファイル)とメモリ(バッファプール)間でデータをやり取りする際の単位です 。ひとつのページは一行以上の行データを持ちます。行数は1行のサイズに依存します。もし1行が1ページに収まらない場合、InnoDBはポインタ形式のデータ構造を構築し、行のデータが1ページに収まるようにします。ページにより多くの行を格納するために、圧縮機能を使う方法もあります。入出力のオーバヘッドを減らすために、BLOB(バイナリオブジェクト)や大きなテキストは行内の他のフィールドとは分けて保存されます。入出力のスループットを改善するために一度に一定量をまとめて読み書きします。ひとつのMySQLインスタンス内にある全てのInnoDBデータは常に同じサイズのページを使用します。

マスタースレッド
様々な操作をバックグラウンドで実行するスレッドです。ほとんどの操作は、バッファの内容を適切なセカンダリインデックスに書き出すなどの入出力に関するものです。並列性を高めるために、マスタースレッドから別個のバックグラウンドスレッドにタスクが移動されることもあります。

パージ
定期的に別個のスレッドから実行されるガーベジコレクション(不要メモリ回収操作)の一種です。以下のような操作が含まれます:インデックスから使われなくなった値を除外する、DELETE文で削除指定された行を実際に削除する。

参考URL

この記事は役に立ちましたか?