我正在使用 mysql innodb 資料庫。當我使用 mysqlworkbench 時,意外地所有 .frm 檔案都從 mysql 資料資料夾中刪除,但資料資料夾中仍然有 ibdata 檔案。我沒有使用 innodb_file_per_table 意味著我的所有 innodb 表資料都在單一 ibdata 檔案中。
不幸的是我沒有可以恢復的備份。任何人都可以建議我如何從 ibdata 檔案恢復資料。
答案1
你的問題似乎與Stack Overflow 上的這個。
我在這裡複製了部分已接受的答案。
簡單的解決方案是找到您保存的 SQL 副本
CREATE TABLE
,在發展MySQL實例,然後將產生的FRM檔案複製到復原的實例中。如果您無法存取這些
CREATE TABLE
語句,您可以嘗試以下操作:
- 在復原的資料庫中,運行
create table innodb_table_monitor (a int) ENGINE=InnoDB
- 觀察MySQL伺服器錯誤文件,直到表監控資料被轉儲(通常約一分鐘)
- 跑步
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 );
如果您對表監視器輸出感到困惑,請查看具有已知架構的表的輸出。
在a上運行上面的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 或類似的小東西。