5

これは、stackoverflow で見た関連する InnoDB 修復に関する質問とは少し異なります。

innodb_file_per_table=1 を使用して MySQL 5.1 データベースに以下を復元したとします。

db/tablename.ibd
innodb/ibdata1
innodb/ib_logfile0
innodb/ib_logfile1

db/tablename.frmファイルを紛失してしまいました。データベースサーバーを起動できますが、InnoDB は文句を言います:

110723 13:26:33  InnoDB: Error: table 'db/tablename'
InnoDB: in InnoDB data dictionary has tablespace id 5943,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?

FRM ファイルを再構築するにはどうすればよいですか?

4

2 に答える 2

3

私は自分で解決策を見つけました。

簡単な解決策は、保存されているCREATE TABLESQLのコピーを見つけて開発インスタンスで実行し、生成されたFRMファイルを復元されたインスタンスにコピーすることです。

しかし、私の場合、CREATE TABLEコマンドのコピーを利用できませんでした。

MySQLサーバーは、ibdata、ib_logfiles、および*.ibdファイルで実行できます。ただし、FRMがないと、データベースにテーブルがないように見えます。

  1. 復元したデータベースで、create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. テーブルモニターのデータがダンプされるまで(通常は約1分)、MySQLサーバーのエラーファイルを監視します。
  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. MySQLの開発インスタンスで上記のSQLを実行します

  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...は、devインスタンスで実行し、復元されたインスタンスからの元の出力と出力を比較します。NOTNULLまたはそのような小さなものを見逃したことがわかるでしょう。

于 2011-07-24T14:31:27.240 に答える