(明らかに)昨夜、Solaris MySQLデータベースエンジンの実行が不十分でした。少なくともいくつかのInnoDBテーブルが破損しており、トランザクションログにタイムスタンプ順不同エラーがあり、インデックスの破損に関する特定のエラーがあります。
MyISAMテーブルの修復に使用できるツールについては知っていますが、InnoDBには何も見つかりません。
サイドノート:テーブルの最適化を試みると(破損したインデックスを再構築しようとすると)、データベースサーバーがクラッシュします。
まず第一に サーバーを停止し、ディスクをイメージングします。これで1発しか持っていても意味がありません。次に、 here を見てください。
アプリケーションを停止するか、新しい行が追加されないようにスレーブを停止します
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
です)。
CREATE TABLE broken_repair LIKE broken;
_INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
LIMIT 100000
_を使用してから、_LIMIT 1
_を使用してDBをクラッシュするまで、より低い値を使用できます)。SELECT MAX(id) FROM broken
を_broken_repair
_の行数と比較できます)。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のような分離されたテーブルファイルを作成します。