失われたFrmファイル、ibdataからデータを回復

失われたFrmファイル、ibdataからデータを回復

私は、mysql innodb データベースを使用していました。mysqlworkbench を使用していたとき、誤ってすべての .frm ファイルが mysql データ フォルダーから削除されましたが、データ フォルダーにはまだ ibdata ファイルが残っています。innodb_file_per_table を使用していなかったため、すべての innodb テーブル データは単一の ibdata ファイルに格納されていました。

残念ながら、復元するためのバックアップがありません。ibdata ファイルからデータを回復する方法を教えていただけませんか。

答え1

あなたの質問は次のものと同じようですStack Overflow のこちら。
承認された回答の一部をここに再現しました。


簡単な解決策は、保存したCREATE TABLE SQLのコピーを見つけて、発達MySQL のインスタンスを復元し、生成された FRM ファイルを復元されたインスタンスにコピーします。

ステートメントにアクセスできない場合は、CREATE TABLE次の操作を試してください。

  1. 復元したデータベースで、create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. テーブルモニターデータがダンプされるまでMySQLサーバーのエラーファイルを監視します(通常約1分)
  3. 走るdrop table innodb_table_monitor
  4. 復元されたデータベースを停止する

  5. テーブル モニターの出力に一致する 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
    );
    

    テーブル モニターの出力について混乱している場合は、既知のスキーマを持つテーブルの出力を確認してください。

  6. 上記のSQLを発達MySQLのインスタンス

  7. 開発サーバーで作成された FRM ファイルを復元されたデータベースにコピーします。これらのファイルは、対応するデータベースのサブディレクトリ内の MySQL データ ディレクトリにあります。

  8. 復元されたデータベースを再起動する

    開発システムからライブ データベース インスタンスに FRM ファイルをコピーできることに注意してください。上記のサーバーを停止する理由は、innodb_table_monitor テーブルを作成した後にデータベースがクラッシュすると、ibdata ファイルが不整合な状態になり、バックアップからやり直す必要があるためです。

  9. ステートメントを使用してテーブルが機能するかどうかをテストしますselect *。間違っている場合は、次のように表示されます。

    ERROR 2013 (HY000): Lost connection to MySQL server during query
    

これは、データベースがクラッシュしたことを意味します。これが発生した場合は、create table innodb_table_monitor...開発インスタンスで実行し、出力を復元されたインスタンスの元の出力と比較します。おそらく、NOT NULL などの小さな値が抜けていることがわかるでしょう。

関連情報