遺失的 Frm 檔案從 ibdata 恢復數據

遺失的 Frm 檔案從 ibdata 恢復數據

我正在使用 mysql innodb 資料庫。當我使用 mysqlworkbench 時,意外地所有 .frm 檔案都從 mysql 資料資料夾中刪除,但資料資料夾中仍然有 ibdata 檔案。我沒有使用 innodb_file_per_table 意味著我的所有 innodb 表資料都在單一 ibdata 檔案中。

不幸的是我沒有可以恢復的備份。任何人都可以建議我如何從 ibdata 檔案恢復資料。

答案1

你的問題似乎與Stack Overflow 上的這個。
我在這裡複製了部分已接受的答案。


簡單的解決方案是找到您保存的 SQL 副本CREATE TABLE ,在發展MySQL實例,然後將產生的FRM檔案複製到復原的實例中。

如果您無法存取這些CREATE TABLE語句,您可以嘗試以下操作:

  1. 在復原的資料庫中,運行create table innodb_table_monitor (a int) ENGINE=InnoDB
  2. 觀察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. 在a上運行上面的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 或類似的小東西。

相關內容