Mysql

每個表從一個 InnoDB(ibdata) 文件到 innodb 文件的安全轉換

  • March 19, 2012

我在 InnoDB 引擎上有帶有表的 MySQL 數據庫。但是伺服器被配置為只使用一個文件 ibdata0 而沒有參數 innodb_file_per_table。我想在不進行轉儲的情況下更改它並在重新配置的伺服器上恢復它。所以我的計劃是innodb_file_per_table在 my.cnf 重啟伺服器中添加參數並強制ALTER TABLE重建所有 InnoDB 表。

這樣做ALTER TABLE tablename ENGINE = InnoDB應該為我目錄.idb中的每個文件創建文件,並且確實如此(我認為從文件中移動數據)。但是在我關閉伺服器並刪除舊的 ibdata 文件後,我看到了所有表(),但如果我在其中創建任何表,我會收到此錯誤:.frm``/val/lib/mysql/mydatabase``ibdata``SHOW TABLES``SELECT

ERROR 1146 (42S02): Table 'mytable' doesn't exist

所以我想一些數據保留在舊的 ibdata 文件中。

我遺漏了什麼嗎?有沒有辦法做我想做的事?

不,您將不得不進行轉儲和恢復。即使完成了這個alter table engine技巧,一些數據仍會保留在 ibdata1 文件中。

  • 將所有 innodb 表轉儲到外部文件
  • 刪除所有 innodb 表
  • 關閉mysql
  • 刪除 ibdata1(以及任何日誌文件(如果存在))
  • 啟動mysql
  • 導入 sql 轉儲文件

我自己也遇到過這個問題,轉儲所有表,然後在不關閉 mysql 的情況下重新導入它們是行不通的。必須先刪除所有 innodb 表,然後才能刪除 ibdata1 文件。

引用自:https://serverfault.com/questions/371099