データベースページが壊れた場合は、SELECT
INTO OUTFILE
を使ってデータベースからテーブルをダンプできます。通常は、ほとんどのデータが損傷を受けず正常な状態です。ところが、破損が原因で
SELECT * FROM table
や InnoDB
のバックグラウンド処理がクラッシュまたはアサートしたり、InnoDB
のロールフォワードリカバリさえもクラッシュすることがあります。InnoDB
のバージョン 3.23.44 より、InnoDB
を強制的に起動することのできるオプションが
my.cnf
に追加されました。また、テーブルをダンプできるように、バックグラウンド処理が実行されないようにすることも可能となりました。たとえば、my.cnf
で
innodb_force_recovery = 4
を設定することができます。
innodb_force_recovery
の選択肢は下に挙げています。
データベースには、これらのオプションを別の用途で使用しないでください。
InnoDB
では、安全対策として、このオプションが 0
より大きいときはユーザが
INSERT
、UPDATE
、または
DELETE
を実行できないようになっています。
バージョン 3.23.53 および 4.0.4
より、強制リカバリが使用される場合でも、テーブルの
DROP
または CREATE
を実行することができます。ロールバックでクラッシュを引き起こしているテーブルが特定できれば、そのテーブルを破棄できます。
また、問題のある大量インポートまたは
ALTER TABLE
が原因で暴走したロールバックも、この方法で停止できます。
mysqld
プロセスを強制終了し、my.cnf
のオプション innodb_force_recovery=3
を使用することで、ロールバックせずにデータベースを正常な状態に戻すことができます。
その後に、ロールバックが暴走する原因となったテーブルを
DROP
で破棄します。
下に列挙されている各オプションでは、その番号が大きいものがより小さい番号の対策をすべて盛り込んでいます。悪くてもオプション 4 でテーブルをダンプできれば、個々のページが破損しても一部のデータが失われるだけなので比較的安全です。オプション 6 にはより劇的な影響力があります。データベースページが古い状態のまま残るため、B ツリーやその他のデータベース構造へさらに破損が及ぶ可能性があるからです。
1(SRV_FORCE_IGNORE_CORRUPT)では、壊れたページが検出されてもサーバが実行される。SELECT
* FROM table
で壊れたインデックスレコードやページを飛び越すようにすれば、テーブルをダンプする際に役立つ。
2(SRV_FORCE_NO_BACKGROUND)では、メインスレッドが実行されなくなる。パージの際にクラッシュが発生する場合は、このオプションによってそれが回避される。
3(SRV_FORCE_NO_TRX_UNDO)では、リカバリ後にトランザクションロールバックが実行されない。
4(SRV_FORCE_NO_IBUF_MERGE)では、挿入バッファのマージ操作も実行されなくなる。この操作がクラッシュを引き起こす場合は、実行しない方がよい。また、テーブル統計情報も計算しないようにする。
5(SRV_FORCE_NO_UNDO_LOG_SCAN)では、データベース起動時に UNDO ログが参照されない。InnoDB は、未完了のトランザクションもコミット済みとして扱う。
6(SRV_FORCE_NO_LOG_REDO)では、リカバリに関連してログのロールフォワードが実行されない。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.