InnoDB テーブルを修復するにはどうすればよいですか?
質問
(どうやら) 昨夜、Solaris MySQL データベース エンジンの実行が不十分でした。少なくとも一部の InnoDB テーブルが破損しており、トランザクション ログにタイムスタンプの順序が異なるエラーが記録され、インデックスの破損に関する特定のエラーが発生しています。
MyISAM テーブルの修復に利用できるツールについてはわかっていますが、InnoDB については何も見つかりません。
サイドノート:テーブルの最適化を試行すると (破損したインデックスを再構築しようとしました)、データベース サーバーがクラッシュします。
解決
まず、サーバーを停止してディスクをイメージングします。これで1発しか持っていても意味がありません。次に、こちらをご覧ください。
他のヒント
アプリケーションを停止します...または新しい行が追加されないようにスレーブを停止します
create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table <old table>;
insert <old table> select * from <new table>;
サーバーまたはスレーブを再起動します
次の解決策は、上記の Sandro のヒントからインスピレーションを得たものです。
警告:私にとってはうまくいきましたが、あなたにとってもうまくいくかどうかはわかりません。
私の問題は次のとおりでした。テーブルから特定の行を読み取ります (このテーブルをテーブルと呼びます) broken
) MySQL がクラッシュする可能性があります。平 SELECT COUNT(*) FROM broken
それを殺すだろう。あなたが持っていることを願っています PRIMARY KEY
このテーブルでは (次のサンプルでは、 id
).
- 壊れた MySQL サーバーのバックアップまたはスナップショットがあることを確認してください (ステップ 1 に戻って別のことを試したい場合に備えて)。
CREATE TABLE broken_repair LIKE broken;
INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
- DB がクラッシュするまでステップ 3 を繰り返します (次を使用できます)
LIMIT 100000
その後、使用するまで、より低い値を使用します。LIMIT 1
DB がクラッシュします)。 - すべて揃っているかどうかを確認してください(比較できます)
SELECT MAX(id) FROM broken
の行数でbroken_repair
). - この時点で、明らかにすべての行を持っていました (おそらく InnoDB によってひどく切り捨てられたものを除く)。いくつかの行を見逃した場合は、
OFFSET
にLIMIT
.
幸運を!
MySQLが提供するソリューションは次のとおりです。 http://dev.mysql.com/doc/refman /5.5/en/forcing-innodb-recovery.html
この記事を参照してください: http://www.unilogica.com/mysql-innodb-recovery / (ポルトガル語)
innodb_force_recovery および innodb_file_per_table の使用方法について説明しました。単一の ibdata1 でクラッシュしたデータベースを回復する必要がある後にこれを発見しました。
innodb_file_per_tableを使用して、InnoDBのすべてのテーブルはMyISAMのような分離されたテーブルファイルを作成します。
ステップ1
MySQLサーバーの停止
ステップ2
この行をmy.cnfに追加します(Windowsではmy.iniと呼ばれます)
set-variable=innodb_force_recovery=6
ステップ3.
ib_logfile0 および ib_logfile1
を削除しますステップ4
MySQLサーバーの起動
ステップ5。
次のコマンドを実行します:
mysqlcheck --database db_name table_name -uroot -p
クラッシュしたinnodbテーブルを正常に修正した後、my.cnfから#set-variable = innodb_force_recovery = 6を削除してから、MySQLサーバーを再起動することを忘れないでください。