もしデータベースページが破損したら、SELECT
INTO ... OUTFILE
を利用してデータベースからテーブルをダンプしたいかもしれません。通常、この方法で取得されたデータは無傷です。ただし、破損によって
SELECT * FROM
ステートメントや tbl_name
InnoDB
バックグラウンド操作がクラッシュしたりアサートしたり、または
InnoDB
前進復旧がクラッシュしたり、ということが起こる可能性があります。そのような場合には、innodb_force_recovery
オプションを使用することで、バックグラウンド処理が実行されないようにしながら
InnoDB
ストレージエンジンを強制的に起動することができます。そうすればテーブルのダンプを行えます。たとえば、サーバーを再起動する前に、オプションファイルの
[mysqld]
節に次の行を追加することができます:
[mysqld] innodb_force_recovery = 4
innodb_force_recovery
のデフォルトは 0
(強制的な復旧を行わない通常の起動)
です。innodb_force_recovery
のゼロ以外で指定可能な値を、次に示します。大きい数字は小さい数字のすべての予防策を含んでいます。もし最大
4
のオプション値を利用してテーブルをダンプすることができれば、破損した独立ページ上のいくつかのデータが失われるだけなので、比較的に安全です。データベースページはすでに廃止された状態で残されるので、6
の値はさらに徹底的であり、B
ツリーやその他のデータベース構造に更なる破損を引き起こす可能性があります。
1
(SRV_FORCE_IGNORE_CORRUPT
)
破損ページを検出したとしてもサーバーを起動させてください。テーブルをダンプする助けになるので、SELECT
* FROM
が破損したインデックスレコードとページを飛び越えるようにしてください。
tbl_name
2
(SRV_FORCE_NO_BACKGROUND
)
主スレッドが起動するのを防いで下さい。もし消去操作の最中にクラッシュが起きそうであれば、この復旧値はそれを防ぎます。
3
(SRV_FORCE_NO_TRX_UNDO
)
復旧後にトランザクションロールバックを起動しないでください。
4
(SRV_FORCE_NO_IBUF_MERGE
)
挿入バッファーマージ操作を避けてください。もしそれらがクラッシュしそうであれば、行わないでください。テーブル統計を計算しないでください。
5
(SRV_FORCE_NO_UNDO_LOG_SCAN
)
データベースを起動するときに取り消しログを見ないで下さい:InnoDB
は不完全なトランザクションもコミットしたように扱います。
6
(SRV_FORCE_NO_LOG_REDO
)
復旧と共にログ前進を接続内で行わないでください。
データベースはそれ以外の場合にゼロ以外の値の
innodb_force_recovery
とともに利用するべきではありません。innodb_force_recovery
が 0
よりも大きい場合、安全のため、InnoDB
はユーザーが
INSERT
、UPDATE
、または
DELETE
操作を行うのを防ぎます。
それらをダンプするためにテーブルから
SELECT
することができ、または強制復旧が利用されたとしてもテーブルを
DROP
か
CREATE
することができます。もし与えられたテーブルがロールバック上でクラッシュを引き起こしていると知ったら、それを削除することができます。大量の失敗インポートや
ALTER TABLE
によって引き起こされた暴走ロールバックを停止するためにもこれを利用することができます。ロールバックせずにデータベースを立ち上げるために
mysqld
処理を停止し、innodb_force_recovery
を 3
に設定し、そして暴走ロールバックを引き起こしているテーブルを
DROP
することができます。