状況: 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
_を回復/修復することは可能ですか、または少なくともデータベースを削除して再作成する方法(データベースを削除して再作成しないでください)は可能ですか?
この状況は、2年前に回答した投稿によく似ています( InnoDBテーブルSELECTがエラー2006(HY000)を返します:MySQLサーバーが停止しました(停電後) )
まず、これがInnoDBアーキテクチャです。
その投稿では、基本的に、テーブルのメタデータがシステムテーブルスペースファイル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を使用する必要があります。
はい、innoDBテーブルの修復を試すことができます
まず、テーブルをバックアップする必要があります。
MySQL
サービスを停止します
my.ini
innodb_force_recovery
オプションの値を追加または変更します。
[mysqld] innodb_force_recovery = 1 [クラッシュリカバリを改善するため]
「C:\ xampp\mysql\data」から別のフォルダにすべてのデータをバックアップします。例:「C:\ xampp\mysql\databackup」または
クラッシュしたデータベースまたはテーブルのmysqldump
を取得します。
mysql
サービスを開始します。
レベル0〜4は安全ですが、レベル5〜6を使用する場合、一部のデータが失われる可能性があります
innodb_force_Recovery= 1
ファイルの下のコメントmy.ini
テーブルまたはデータベースを復元します。
MySQLのドキュメントでInnoDBの強制リカバリをチェックする: http://dev.mysql.com/doc/refman/5.0/en/forcing-innodb-recovery.html