我正在嘗試將 .frm (sql 數據文件)轉換為文字文件,原因是因為我想了解 sql 引擎如何“在幕後”存儲數據,例如:當使用“ENUM”sql 存儲時一個稱為“INDEX”的“INTEGER”,所以如果有人知道將.frm轉換為.txt的軟體或方法,謝謝大家,祝你有美好的一天。
答案1
本文提供了一種行之有效的方法:
如何做到這一點的基礎知識並不是太難理解,而是細節變得棘手。這個問題的第一部分是如何從 .frm 檔案中提取表定義。我將在另一篇文章中介紹問題的第二部分。您可以編寫一個程式來讀取和解析 .frm 檔案並輸出表定義,但這需要大量工作 — 特別是當您可以欺騙 MySQL 為您做這件事時。以下是對檔案 foo.frm 執行此操作的方法。
mysql> CREATE TABLE `test`.`foo` (id int) ENGINE=InnoDB;
我們建立了一個名為 foo 的 InnoDB 表。 MySQL 在 $datadir/test 中寫入了 foo.frm 和 foo.ibd 檔案。它也在資料字典中對該表做了記錄。
mysql> FLUSH TABLES;
這會導致 MySQL 關閉所有開啟的表並刷新查詢快取。這個想法是迫使 MySQL 忘記我們剛剛創建的表「foo」。
bash# cp foo.frm /var/lib/mysql/test;
我們剛剛覆蓋了 test.foo 的表定義。當 MySQL 仍在運作時,我們就熱火朝天地進行了。
mysql> SHOW CREATE TABLE `test`.`foo`;
這將輸出我們剛剛複製到測試目錄中的 foo.frm 檔案的表定義。 MySQL 可能會有點困惑,因為 .frm 檔案中的資訊不太可能與系統表空間中的資訊相符。您可能會在錯誤日誌中看到類似這樣的訊息:
[錯誤]表./test/foo在InnoDB資料字典中沒有主鍵,但在MySQL中有主鍵!如果您使用 MySQL 版本 < 3.23.54 建立表,並且沒有定義主鍵,而是定義了包含所有非 NULL 列的唯一鍵,則 MySQL 內部會將該鍵視為主鍵。您可以透過 dump + DROP + CREATE + 重新匯入表格來修復此錯誤。
不過沒關係,清理一下就好了。
mysql> DROP TABLE `test`.`foo`;
為了避免必須對數百個表執行此操作的煩惱,請使用以下位置提供的腳本:藍壁虎文章。你應該被排序。查格伯特。