しばらく前、MySQLサーバー5.5.31が実行されているWindows 7システムがクラッシュし、InnoDBデータベースが破損しました。利用可能な毎週のバックアップは、その間に作成されたすべてのテーブルをカバーしているわけではないため、データから可能な限り回復するように努めます。クラッシュの直後に、MySQLのデータフォルダ全体を外部ドライブにコピーしました。これを私の救急活動の出発点として使用したいと思います。
以下では、私の(まだ説得力のない)救助活動の手順を説明し、それを改善する方法についてのコメントやガイダンスに感謝します。
...table 44...
at row:57 」したがって、このテーブルの破損は行57であるか、行57で始まるようです。今私の質問に:
ありがとう。
更新:後で参照するための追加メモ
-SHOW CREATE PROCEDURE ...およびSHOW CREATE FUNCTION ...を使用してバックアップされたストアドルーチンを再作成する場合、DELIMITER // (create procedure code of procedure 1)// (create procedure code of procedure 2)// DELIMITER ;
を使用してインポートする必要があります
MySQLエラーログを確認します。テーブル44を読み取ろうとすると、実際にサーバーがクラッシュするようです。
「クエリ中にMySQLサーバーへの接続が失われる」というのは、MySQL DBAにとって心停止時間です(またはそうすべきです)。これは、クエリが実際に行ったことが実際にサーバーをクラッシュさせたことを意味します。
後続のメッセージはこれを明らかにしているようです:
_mysqldump: Got error: 2003: Can't connect to MySQL server on 'localhost' (10061) when
trying to connect
Operation failed with exitcode 2
_
実行されていないMySQLサーバーに対するWindows 7のmysqldumpのクイックテストは、まったく同じエラーを返し、_%ERRORLEVEL%
_を2に設定して終了します。エラー10061の性質は the perror
ユーティリティ で確認できます。
_C:\>perror 10061
Win32 error code 10061: No connection could be made because the target machine actively refused it.
_
...それで、MySQLエラーログを確認します。発生している可能性が高いのは、_innodb_force_recovery
_にもかかわらずMySQLサーバーがクラッシュするほど深刻な破損に遭遇していることです。その後、通常は自動的に再起動しますが、これには時間がかかるため、mysqldumpが後続の接続試行でIP接続を拒否する前に完了しない場合があります。これはすべてエラーログに表示されます。
ダンプによってエラーが発生しない場合、テーブルのデータは破損していないと思います。
誤った仮定。ダンプでエラーが発生しない場合は、サーバーがデータのsomeを取得することを_innodb_force_recovery
_が許可したことを意味する場合もあります。テーブルの「成功した」ダンプは、それが深刻に破損していないので、_innodb_force_recovery
_はそれを生き残ることができません。
1 (SRV_FORCE_IGNORE_CORRUPT)
破損したページを検出した場合でも、サーバーを実行します。 _
SELECT * FROM tbl_name
_が破損したインデックスレコードとページを飛び越えられるようにしてください。これはテーブルのダンプに役立ちます。http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html
ここでも、MySQLエラーログにInnoDBからのチャターが表示されます。
最後の提案ですが、ワークベンチは使用しないでください。 mysql
コマンドラインクライアントを使用してサーバースキーマを探索し、コマンドラインから直接mysqldump
を使用して個々のスキーマまたは個々のデータベースを復元してみてください。
更新/追加:
ストアドプロシージャをどのように回復しますか?破損したテーブルにアクセスするため、エラーが発生する
ストアドプロシージャと関数はビューと同じように参照されるテーブルに対して検証されないため(ビューが参照するテーブルをドロップすると、_SHOW CREATE VIEW
_が機能しないため)、プロシージャが破損したテーブルにアクセスするためではありません。 -プロシージャや関数の場合も同じです)... MySQLは、ストアドプロシージャや関数によって参照されるテーブルが存在するかどうかを考慮しません(実行時を除く)...ただし、ビュー定義とは異なり、個々のファイル、プロシージャと関数の定義は、MyISAMテーブルであるproc
スキーマのmysql
テーブルに保存されます...したがって、参照しているエラーメッセージが表示されると思いますそのテーブルと_CHECK TABLE mysql.proc;
_および _REPAIR TABLE mysql.proc;
_ を使用すると、もう一度やり直すことができます。リカバリに使用しているMySQLサーバーのバージョンは、同じリリースシリーズ(例:5.5)である必要があります。そうでない場合、_mysql.proc
_のテーブル定義は正しくありません...ここでは問題になりません質問を正しく読んだ場合、クラッシュしたサーバーとリカバリサーバーはどちらも5.5.31です。
_SELECT * FROM mysql.proc
_が可能であれば、何らかの理由で_SHOW CREATE PROCEDURE
_ステートメントが機能しない場合でも、その方法で定義を取得できます。
ダンプでエラーが発生したテーブルには、(部分的な)レスキューのどのオプションがありますか?
発生したエラーの性質と範囲によって異なります。 1つのオプション ここで説明 は、繰り返される_INSERT ... SELECT ... LIMIT ... OFFSET
_を含み、読み取り可能なページからMyISAMテーブルに行のブロックを抽出します(_innodb_force_recovery
_の間はInnoDBテーブルに書き込めないため)オン)。 Pernoa Data Recovery Tool for InnoDB もありますが、使用する機会は一度もありません。