web-dev-qa-db-ja.com

クラッシュしたmySQLサーバーから破損したinnoDBテーブルからデータを回復する方法は?

いくつかの背景:

私はMySQLサーバーをUbuntuサーバーで実行していました。彼らが実行していたバージョンを覚えていませんが、MySQL 5.5を搭載したUbuntu 12.04である可能性があります。 1日の間に、クライアントアプリケーションからサーバーへの接続が切れ続けました。翌日、サーバーがクラッシュし、mysqlが再び起動しなくなりました。また、多くのディスクエラーが発生していたため、新しいマシンでデータを回復することにしました。

私が試したこと:

MySQL 5.5を実行しているUbuntu 12.04でデータを回復しようとしましたが、サービスを実行できませんでした。トラブルシューティングする前に、mySQL 5.1を実行しているUbuntuデスクトップで利用可能なものと同じ手順を試してみましたが、問題なく動作しました。これが私がしたことです:

  1. クラッシュしたサーバーから新しいサーバーに/var/lib/mysqlをコピーしました
  2. 私はchown -R mysql:mysql /var/lib/mysqlを実行しました
  3. 私はservice mysql startを実行しました

サービスが開始され、1つのテーブルを除いてすべてが機能しているように見えました。これはBLOBデータを含むテーブルです。

試行錯誤を繰り返した後、問題のあるクエリを絞り込んで、特定の数(およそ7000レコードのうち最後の100レコード)を超えるIDを記録しました。

いくつかのクエリと出力のサンプル:

> select field1 from table1 where field1 = 6900
> (completes successfully)
> select field1 from table1 where field1 <= 6900
> (completes successfully)
> select field1 from table1 where field1 = 6901
> Error 2013 (HY000) at line 1: Lost connection to mySQL server during query

それから、私はそれを回復するためにデータをダンプしようと試み始めました:

> mysqldump -u root -p database1 table1 > table1.sql
> Lost connection to mySQL server during query when dumping table 'table1' at row 6642

Mysqldumpのオプションを調べて、-fを追加しようとすると、出力が異なりました。

> Couldn't execute 'UNLOCK TABLES': MySQL server has gone away (2006)

問題がこの表にあることを確認するために、私は試しました:

> mysqldump -u root -p --ignore-table=database1.table1 database1 > database1.sql

...コマンドは正常に完了しました。

問題のあるレコードの1つを削除しようとしましたが、削除コマンドは正常に完了しました。最初の問題のあるものからすべて削除して損失を最小限に抑えることができると思いますが、それらを回復する希望はありますか?

私はここから何をすることを提案しますか?

補足:私はNavicatを使用してサーバーを管理し、バックアップを作成していましたが、不思議なことに、最近のバックアップでその特定のテーブルを復元すると、接続が失われたというエラーで失敗します。テーブルはしばらくの間問題を抱えていますが、おそらくディスクエラーが原因であり、特にクラッシュが原因ではありません。

2
Smig

MySQLの CHECK TABLE および REPAIR TABLE 関数を使用してみることができます(ただし、最初にテーブルのコピーを取得してください)。

mysql -uroot -p database1
CHECK TABLE table1

それがうまくいかない場合は、次を使用してみてください:

CHECK TABLE table1 EXTENDED

CHECK TABLE ドキュメントによると:

EXTENDEDは、通常のチェックを実行した後にのみ使用しますが、MySQLが行を更新したり、キーで行を見つけようとしたときに、テーブルから奇妙なエラーが発生します。通常のチェックが成功した場合、これはほとんど起こりません。

上記のいずれかによってエラーが報告された場合は、以下を試してください。

REPAIR TABLE table1

それでもうまくいかない場合は、次の方法を試してください。

REPAIR TABLE table1 EXTENDED

最後に、それでも機能しない場合は、MySQLがオフラインのときに myisamchk を使用できる可能性があります-ドキュメントによると:

REPAIR TABLEはmyisamchkのすべてのオプションを実装していません

1
Nathan Jolly