Mysql

從 mysql ibdata1 文件中清除舊記錄

  • December 31, 2013

是否可以從 ibdata1 文件中清除舊記錄而不刪除附加的數據庫?

當我掃描 ibdata1 中的字元串時,已從數據庫中刪除的記錄仍然存在。

我有點了解 ibdata1 文件的工作原理,並意識到文件的這些部分可能會及時被覆蓋,但我需要將舊數據清零或刪除舊數據,以便它不再以任何形式儲存在伺服器上。

有沒有辦法在不關閉數據庫的情況下做到這一點?

您所要求的內容從未被記錄或嘗試過。

但是,我過去曾回答過兩個這樣的文章:

對於您將要刪除的數據,我還有一個額外的建議。您將不得不為此付出一些開發人員的努力:

在放下桌子之前,您應該

  • 轉到每個 INT 和 FLOAT 值並使它們為 0

  • 轉到每個 CHAR、VARCHAR 和 TEXT 欄位

    • 獲取欄位的長度
    • 使用全 X 或全 0 更新具有相同字節數的列

您必須檢查 INFORMATION_SCHEMA.COLUMNS 中每一列的條目,以確定哪個是數字,哪個是字元。一旦你手動覆蓋了舊表中的所有數據,你就可以自由地刪除它,因為你知道你事先屏蔽了數據。

警告

如果您所有的 InnoDB 表都沒有約束/外鍵,那麼您可以在停機期間執行以下操作。

  • 將所有 InnoDB 表轉換為 MyISAM
  • 關閉mysql
  • 刪除 ibdata1
  • 啟動 MySQL
  • 將這些 MyISAM 表轉換回 InnoDB

我不能把這個想法歸功於自己。Shlomi Noach 在 2013 年 9 月 19 日提出了建議

如果數據庫不是太大,這裡是您可以編寫腳本的方法。

MYSQL_USER=root
MYSQL_PASS=password
MYSL_CONN="-u${MYSQL_CONN} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_MyISAM.sql
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_InnoDB.sql
mysql ${MYSQL_CONN} -ANe"SET GLOBAL innodb_fast_shutdown = 0"

此時,查看vior中的兩個腳本less

如果您對程式碼感到滿意,那麼您可以這樣做:

mysql ${MYSQL_CONN} < Convert_To_MyISAM.sql
service mysql stop
rm -f /var/lib/mysql/ibdata1
service mysql start
mysql ${MYSQL_CONN} < Convert_To_InnoDB.sql

試一試 !!!

引用自:https://dba.stackexchange.com/questions/54727