%20-%20.frm%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E5%A4%B1%E3%82%8F%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%81%8C%E3%80%81ibdata%20%E3%81%AF%E3%81%9D%E3%81%AE%E3%81%BE%E3%81%BE.png)
最近のサーバーのトラブルで、一見無傷の ibdata ファイルが残っていましたが、.frm を含むディレクトリは半分しか残っていません。このすべてを新しい MySQL インストールにコピーし、.frm ファイルが残っているデータベースを正常に回復しました。質問は、何らかの方法で ibdata ファイルから .frm ファイルを再生成できるかどうかです。または、何らかの方法で同じデータベースの開発バージョンから .frm ファイルを変更して、回復に使用できるようにすることはできますか。
残念ながら、バックアップからの復元は実行可能なオプションではありません。
明確にするために編集しました: 同じスキーマを含むローカルで生成された .frm ファイルを使用してデータベースを回復しようとしましたが、innodb_force_recovery = 1 でも失敗しました。
答え1
実際にこれをやったことはないのですが、あなたの質問は私が使っているツールに関係しているので興味がありました。これは実際に可能なようです。例を挙げます。
http://www.chriscalender.com/?p=28
.ibd ファイルしかないときにテーブルを復元する必要がある場合があります。この場合、新しいインスタンスにロードしようとすると、テーブル ID が一致しないというエラーが発生する可能性があります。これを回避する方法はありません。
ただし、この問題を回避する方法が 2 つ見つかりました。
注: これらの方法を使用して回復するテーブルごとに、.ibd ファイルと CREATE TABLE ステートメントが必要になります。
- 内部 InnoDB テーブル カウンターをシミュレートします。つまり、テーブル ID の内部ポインタが (1 - id_of_ibd_table_you_need_to_restore) に等しくなるまで、作業テーブルを作成します (innodb_file_per_table を有効にして)。(方法 1 を参照)
- .ibd ファイルを手動で 16 進編集し、テーブル ID を変更します (方法 2 を参照)。
手順自体は数ページにわたるため、ここには貼り付けていません。
もう一つの関連投稿:http://www.mysqlperformanceblog.com/2011/05/13/connecting-orphaned-ibd-files/
それがうまくいくかどうか聞いてみたいと思います。複数の人がそれをうまく使っているようです。