36

昨夜、Solaris MySQL データベース エンジンのパフォーマンスが (どうやら) 悪かったようです。InnoDB テーブルの少なくとも一部が破損しており、トランザクション ログにタイムスタンプの順序が正しくないエラーがあり、インデックスが破損しているという特定のエラーが発生しています。

MyISAM テーブルの修復に使用できるツールについては知っていますが、InnoDB のツールは見つかりません。

補足: (破損したインデックスを再構築しようとして) テーブルの最適化を試みると、データベース サーバーがクラッシュします。

4

7 に答える 7

30

最初にサーバーを停止し、ディスクのイメージを作成します。これは一撃だけでは意味がありません。次に、こちらをご覧ください。

于 2008-10-22T17:55:26.887 に答える
25

アプリケーションを停止します...またはスレーブを停止して、新しい行が追加されないようにします

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>;

サーバーまたはスレーブを再起動します

于 2010-07-23T22:49:01.943 に答える
9

次の解決策は、上記の Sandro のヒントに触発されたものです。

警告: 私には効果がありましたが、あなたに効果があるかどうかはわかりません。

私の問題は次のとおりです。テーブルから特定の行を読み取ると (このテーブルと呼びましょうbroken)、MySQL がクラッシュします。それSELECT COUNT(*) FROM brokenを殺すことさえあります。PRIMARY KEYこの表にがあることを願っています (次の例ではidです)。

  1. 壊れた MySQL サーバーのバックアップまたはスナップショットがあることを確認してください (手順 1 に戻って別のことを試したい場合に備えて!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. DB がクラッシュするまでステップ 3 を繰り返します (使用すると DB がクラッシュするLIMIT 100000まで、低い値を使用してから使用できますLIMIT 1)。
  5. SELECT MAX(id) FROM brokenすべて揃っているかどうかを確認します (の行数と比較できますbroken_repair)。
  6. この時点で、明らかにすべての行がありました (おそらく InnoDB によって切り捨てられたものを除く)。一部の行が欠落している場合は、 に を追加してみてOFFSETくださいLIMIT

幸運を!

于 2011-05-06T21:45:05.100 に答える
4

MySQL が提供するソリューションは次のとおりです。 http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

于 2011-12-20T08:51:32.247 に答える
0

この記事を参照してください: http://www.unilogica.com/mysql-innodb-recovery/ (ポルトガル語です)

innodb_force_recoveryinnodb_file_per_tableの使い方を説明しています。クラッシュしたデータベースを単一のibdata1で回復する必要があった後、これを発見しました。

innodb_file_per_table を使用すると、InnoDB 内のすべてのテーブルが、MyISAM のように個別のテーブル ファイルを作成します。

于 2014-03-18T01:11:19.560 に答える
-8

ステップ1。

MySQL サーバーを停止する

ステップ2。

この行を my.cnf に追加します (Windows では my.ini と呼ばれます)。

set-variable=innodb_force_recovery=6

ステップ 3。

ib_logfile0ib_logfile1を削除します

ステップ 4。

MySQL サーバーを起動する

ステップ 5。

次のコマンドを実行します。

mysqlcheck --database db_name table_name -uroot -p

クラッシュした innodb テーブルを正常に修正したら、my.cnf から #set-variable=innodb_force_recovery=6 を削除してから、MySQL サーバーを再起動することを忘れないでください。

于 2015-09-27T08:56:19.257 に答える