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


10

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

これと同様の問題があった他の投稿を読みましたが、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でプラグインをダウンロードする必要がありますか?


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

回答:


19

ようやく何度も試行錯誤して問題を解決しました。元の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を確認してください


すばらしい説明ですが、MySQL 5.6のみ機能します。5.5ではGot error -1 from storage engine、を実行するとエラーが発生しますIMPORT TABLESPACE。しかし、私の場合、MySQL 5.6はMySQL 5.5を使用して作成されたテーブルで機能したため、すべて問題ありません;)5.5で立ち往生している場合は、ポーズをとったクリスカレンダーリンクの指示に従う必要があります。
ostrokach 2015

@carment私はあなたの指示に従いましたが、ERRPRに直面しています:スペース13635のページ番号1767006713、スペース名<dbname> / <tblname>にアクセスしようとしています。私が何をしたのか教えてくれませんか?
Mohit Mehta 2017

これにより、テーブルを再作成する時間を大幅に節約できました。メソッドは2016年のMySQL 5.7.17でも引き続き機能します
Andy Mercer

@ostrokach innodb_file_per_table有効にしていないためと思われます。
Yvan

あなたはとても長い旅の後に私を助けてくれました。ありがとう!
Amr SubZero

4

ibdataMySQLが.ibdファイルを理解できるようにするには、メインのInnoDBデータファイル(通常は名前が付けられます)が不可欠です。

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

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

サーバーが実行されている間ずっとバイナリログが有効になっている場合(コメントに基づくと、そうではない場合があります)、mysqlbinlogmysql-binファイルからサーバーで実行したすべてのSQLステートメントを回復することもできます、その方法でデータベースを再作成します。あるはずのUNIXタイムスタンプを助け、あなたが戻って、彼らが行くどこまで決めることのmysql-binのファイルに。

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

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


0

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


*.ibdファイルが表示される場合innodb_file_per_tableはですON。そうでない場合は、すべてのテーブルがに含まれibdata1ます。

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

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

git clone git@github.com:twindb/undrop-for-innodb.git

その後

make all
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.