web-dev-qa-db-ja.com

.ibd、.frm、およびmysqllogbinファイルからのMySQLテーブルの復元

何らかの理由で、.frmおよび.ibdファイル(MySQLまたはphpmyadminのいずれか)に保存されているテーブルを開こうとすると、構文エラーが表示されるか、存在しないと表示されます。

これと同様の問題があった他の投稿を読みましたが、innodb_file_per_tableが有効になっているかどうかを確認する方法がわからず、全体的に混乱しています。また、mysql-bin.000002ファイルのコピーをtxtファイルに変換したので、データベースのデータが完全に失われていないことがわかります。

データベースは昨年作成されました。私はそれらのmysql-bin.00000ファイルを6つ持っていますが、何らかの理由で.000002が最大です。現在、すべてのデータベースに.ibdファイルと.frmファイルがありますが、MySQLに、または少なくとも読み取り可能なものに復元する方法に困っています。

Windows 2003 ServerでWampServer 2.4とMySQL 5.6.12を使用しています。また、InnoDBでプラグインをダウンロードする必要がありますか?

10
carment

ようやく何度も試行錯誤して問題を解決しました。元のibdata1ファイルがなく、.frmファイルと.ibdファイルしかない場合は、次のようにしてデータを復元しました。

  1. -> http://dev.mysql.com/downloads/utilities でMySQLユーティリティをダウンロードしてインストールします。
  2. コマンド/ターミナルに移動してMySQLユーティリティmysqlfrmを開き、それを使用して復元する必要のあるテーブルの構造を見つけます。 mysqlfrmのファイルの場所にcdした後、「mysqlfrm --server = user:pwd @ localhost --port = 3307 "path_to_.frm_file"> table_name.txt」と入力しました。移動先を指定しなかった場合、.txtファイルは、ユーティリティが保存されているフォルダと同じフォルダに保存する必要があります。
  3. テキストファイルには、テーブルのすべての列と情報(基本的には元の構造)を含むCREATE TABLEステートメントが表示されます。そのすべての情報を含むCREATEステートメントをコピーします。
  4. MySQLコマンドで、新しいデータベースを作成します(CREATE DATABASE database_name)。元のデータベース名と同じ名前にします。
  5. 新しいデータベース内に新しいテーブルを作成します。フォルダーと同じ名前である必要はありません。コマンドプロンプト内で新しいテーブルを作成できますが、テーブルはPhpMyAdminで作成しました。これは、Web上のMySQLの管理を処理する無料のソフトウェアツールです。 PhpMyAdminのデータベースをクリックしてからSQLテーブルをクリックし、#3のテーブル構造を貼り付けました。 (補足として、コマンドプロンプトでテーブルに「テーブル」という名前を付けると、常にエラーが発生するため、その名前は避けてください)。
  6. MySQLコマンドでデータベースに移動し、「ALTER TABLE table_name DISCARD TABLESPACE」と入力します。これにより、このテーブルの.ibdファイルが基本的に削除されます。
  7. 元のテーブル(復元するテーブル)の.ibdファイルを新しく作成したテーブルにコピーして、削除した.ibdファイルを置き換えます。最初の.ibdファイルを新しく作成したテーブルの名前に変更します。これは、削除したばかりの古い.ibdファイルを模倣します。このフォルダーは、コンピューターに新しく作成されたデータベースフォルダーの下のMySQLデータフォルダーにあります。
  8. MySQLコマンドに戻り、データベースに移動して、「ALTER TABLE table_Name IMPORT TABLESPACE」と入力します。 「警告」(1)エラータイプのステートメントが表示されますが、無視してください。
  9. やった!新しいテーブルにアクセスしようとすると、古いテーブルのすべてのデータが含まれているはずです。

これがお役に立てば幸いです。質問やコメントがありましたらお知らせください。また、その他の詳細については http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file を確認してください。

19
carment

MySQLが.ibdファイルを理解できるようにするには、メインのInnoDBデータファイル(通常はibdataという名前)が不可欠です。

バイナリファイルを使用してサーバー間でデータを移動する必要がある場合は、MySQLを完全に停止してから、ibdataファイルを含むすべてのデータファイルを移動する必要があります 、ディレクトリ間。

Windows上のサーバー間でデータを移動するより信頼性の高いメカニズムは、( mysqldump )またはPHPMyAdmin(または同様のツール)からのデータベースエクスポートを使用することです。

サーバーが実行されている間ずっとバイナリログが有効になっている場合(コメントに基づくと、そうではない場合があります)、mysqlbinlogを使用して、mysql-binからサーバーで実行したすべてのSQLステートメントを回復することもできますファイル、そしてその方法でデータベースを再作成します。 mysql-binファイルに nix timestamps が含まれているはずです。これは、それらがどれだけ遡っているかを判断するのに役立ちます。

元のデータベースファイルを失い、残っているのが個々の.ibdファイルだけの場合は、コメントでのakuzminskyの提案に従ってデータを回復する必要があるかもしれません。

MySQL 5.6には、InnoDB .ibdデータファイル( トランスポータブルテーブルスペース )を移動するためのいくつかの新機能がありますが、これらにはいくつかの作業が必要であり、十分に小さいデータベースの場合、mysqldumpを使用してデータを転送する方がはるかに簡単です。

4
Nathan Jolly

akuzminskyによって質問のコメントから生成されたWiki回答


*.ibdファイルがある場合、innodb_file_per_tableONです。それ以外の場合、すべてのテーブルはibdata1にあります。

テーブルが存在しないことが通知された場合、そのテーブルはInnoDB辞書にありません。すべてのテーブルを別々のSQLダンプにダンプしてみてください(1つのテーブル-1つのファイル)。 TwinDBリカバリツールキット で復元できるダンプできないテーブル。

バイナリパッケージはまだありません。 GitHubからソースコードを取得してコンパイルする必要があります。 Recover InnoDB dictionary の説明を参照してください。とても簡単です:

git clone [email protected]:twindb/undrop-for-innodb.git

その後

make all
0
Paul White 9