web-dev-qa-db-ja.com

MySQLで破損したテーブルを修復またはドロップ/作成する方法は?

状況: Windows 7のXAMPPでローカルに実行されている104のテーブルを持つMySQLデータベースがあります。すべてのテーブルにInnoDBエンジンがあります。 XAMPP MySQLはWindowsサービスとして実行されています。フロントエンドとして私はPHP(CodeIgniter)を持っています。

問題:昨夜はいつものように、プロジェクトの作業を停止し、ウィンドウを通常どおりシャットダウンしました。今日の朝、ブラウザでエラー_table MY_TALBE does not exists_が発生しました。コンソールの_show tables_にはテーブル名が表示されますが、_desc MY_TABLE_および_select * from MY_TABLE_には_unknown table_と表示されます。 create table MY_TABLE(...)を試しましたが、_table MY_TABLE already exists_としてエラーが発生したため、_drop table MY_TABLE_を試しましたが、_Unknown table MY_TABLE_と表示されていました。修復とチェックのためにmysqlcheck.exeを試しましたが、どちらも失敗しましたが、その後、_show tables_はテーブル名を表示しなくなります。 mysqlファイルを変更/移動/削除/名前変更しなかったことに言及する必要があります。

質問: _MY_TABLE_を回復/修復することは可能ですか、または少なくともデータベースを削除して再作成する方法(データベースを削除して再作成しないでください)は可能ですか?

5
Musa Haidari

この状況は、2年前に回答した投稿によく似ています( InnoDBテーブルSELECTがエラー2006(HY000)を返します:MySQLサーバーが停止しました(停電後)

まず、これがInnoDBアーキテクチャです。

InnoDB Architecture

その投稿では、基本的に、テーブルのメタデータがシステムテーブルスペースファイルibdata1内にまだ存在していることを指摘しています。

SHOW TABLES;を実行したとき、mysqldが実行したのは.frmファイルを報告することだけでした。 ibdata1やその他のメタデータへのアタッチメントがないため、テーブルをMyISAMとして作成することが可能です。ただし、メタデータは.frmといくつかのtablespace_idがテーブル名に付加されていると何らかの形で想像しているため、InnoDBに変換することはできません。私の以前の投稿に基づいて、私は他のすべてのテーブルをmysqldumpし、失われた原因をテーブルと呼びます。ただし、 Perconaには、このような場合にのみData Recovery Toolkit があります。

Data Recovery Toolkitに関するWebページ は言う

InnoDBのPercona Data Recovery Toolは、失われたり破損したデータをInnoDBテーブルから回復するための無料のツールキットです。これは、テーブルの削除や、InnoDBがデータを認識できない深刻な破損などの理由で標準のInnoDBリカバリを使用できない場合に、ファイルまたはrawデバイスからInnoDBのデータをタブ区切り形式で抽出する方法を提供します。これは、MySQLリカバリで使用して、削除されたテーブルを取得したり、以前のバージョンの更新された行をリカバリしたり、メモリ障害や不良ケーブルなどのハードウェア障害後のInnoDBファイルの破損を修正したりできます。

Perconaはこれらのツールを使用して、非常に大きなデータセットを含む多くの顧客のMySQLデータリカバリを実行しました。ツールは強力ですが、InnoDBデータリカバリを正しく実行するには、InnoDBストレージ形式とソースコードに加えて、経験と直感に関する専門知識が必要です。 Perconaは、データ復旧サービスを支援します。

私は使っていませんが、Perconaで作成した場合は、試してみてください

その失われたテーブルのバックアップ(mysqldumpの形式)がある場合は、私の古い投稿から手順を実行して、失われたテーブルのバックアップをロードする必要があります。

提案

この状況が解消されたら、変更をディスクにフラッシュするようにInnoDBを調整する必要があります。

[mysqld]
innodb_fast_shutdown=0
innodb_max_dirty_pages_pct=0
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1

このようにして、mysqlをシャットダウンすると、InnoDBは変更をより完全にフラッシュできます。

InnoDBがディスクにフラッシュされることをさらに確実にしたい場合は、LinuxでMySQLを使用する必要があります。

4
RolandoMySQLDBA

はい、innoDBテーブルの修復を試すことができます

まず、テーブルをバックアップする必要があります。

  1. MySQLサービスを停止します

  2. my.iniinnodb_force_recoveryオプションの値を追加または変更します。

 [mysqld] 
 innodb_force_recovery = 1 [クラッシュリカバリを改善するため] 
  1. 「C:\ xampp\mysql\data」から別のフォルダにすべてのデータをバックアップします。例:「C:\ xampp\mysql\databackup」または

  2. クラッシュしたデータベースまたはテーブルのmysqldumpを取得します。

  3. mysqlサービスを開始します。

レベル0〜4は安全ですが、レベル5〜6を使用する場合、一部のデータが失われる可能性があります

  1. innodb_force_Recovery= 1ファイルの下のコメントmy.ini

  2. テーブルまたはデータベースを復元します。

MySQLのドキュメントでInnoDBの強制リカバリをチェックする: http://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html

2
Oscar Rovira