私は、mysql innodb データベースを使用していました。mysqlworkbench を使用していたとき、誤ってすべての .frm ファイルが mysql データ フォルダーから削除されましたが、データ フォルダーにはまだ ibdata ファイルが残っています。innodb_file_per_table を使用していなかったため、すべての innodb テーブル データは単一の ibdata ファイルに格納されていました。
残念ながら、復元するためのバックアップがありません。ibdata ファイルからデータを回復する方法を教えていただけませんか。
答え1
あなたの質問は次のものと同じようですStack Overflow のこちら。
承認された回答の一部をここに再現しました。
簡単な解決策は、保存した
CREATE TABLE
SQLのコピーを見つけて、発達MySQL のインスタンスを復元し、生成された FRM ファイルを復元されたインスタンスにコピーします。ステートメントにアクセスできない場合は、
CREATE TABLE
次の操作を試してください。
- 復元したデータベースで、
create table innodb_table_monitor (a int) ENGINE=InnoDB
- テーブルモニターデータがダンプされるまでMySQLサーバーのエラーファイルを監視します(通常約1分)
- 走る
drop table innodb_table_monitor
復元されたデータベースを停止する
テーブル モニターの出力に一致する SQL を記述します。例:
TABLE: name db/mylosttable, id 0 7872, flags 1, columns 5, indexes 1, appr.rows 1828 COLUMNS: id: DATA_MYSQL DATA_NOT_NULL len 12; name: type 12 DATA_NOT_NULL len 45; DB_ROW_ID: DATA_SYS prtype 256 len 6; DB_TRX_ID: DATA_SYS prtype 257 len 6; DB_ROLL_PTR: DATA_SYS prtype 258 len 7; INDEX: name GEN_CLUST_INDEX, id 0 17508, fields 0/5, uniq 1, type 1 root page 3, appr.key vals 1828, leaf pages 9, size pages 10 FIELDS: DB_ROW_ID DB_TRX_ID DB_ROLL_PTR id name
次のように表現できます。
drop table if exists mylosttable; create table mylosttable ( id char(12) NOT NULL, name varchar(45) NOT NULL );
テーブル モニターの出力について混乱している場合は、既知のスキーマを持つテーブルの出力を確認してください。
上記のSQLを発達MySQLのインスタンス
開発サーバーで作成された FRM ファイルを復元されたデータベースにコピーします。これらのファイルは、対応するデータベースのサブディレクトリ内の MySQL データ ディレクトリにあります。
復元されたデータベースを再起動する
開発システムからライブ データベース インスタンスに FRM ファイルをコピーできることに注意してください。上記のサーバーを停止する理由は、innodb_table_monitor テーブルを作成した後にデータベースがクラッシュすると、ibdata ファイルが不整合な状態になり、バックアップからやり直す必要があるためです。
ステートメントを使用してテーブルが機能するかどうかをテストします
select *
。間違っている場合は、次のように表示されます。ERROR 2013 (HY000): Lost connection to MySQL server during query
これは、データベースがクラッシュしたことを意味します。これが発生した場合は、
create table innodb_table_monitor...
開発インスタンスで実行し、出力を復元されたインスタンスの元の出力と比較します。おそらく、NOT NULL などの小さな値が抜けていることがわかるでしょう。