Mysql
從 mysql ibdata1 文件中清除舊記錄
是否可以從 ibdata1 文件中清除舊記錄而不刪除附加的數據庫?
當我掃描 ibdata1 中的字元串時,已從數據庫中刪除的記錄仍然存在。
我有點了解 ibdata1 文件的工作原理,並意識到文件的這些部分可能會及時被覆蓋,但我需要將舊數據清零或刪除舊數據,以便它不再以任何形式儲存在伺服器上。
有沒有辦法在不關閉數據庫的情況下做到這一點?
您所要求的內容從未被記錄或嘗試過。
但是,我過去曾回答過兩個這樣的文章:
Aug 29, 2012
:刪除/覆蓋位於 ibdata 文件中已刪除記錄中的敏感數據Dec 17, 2012
:用 Zeros/Nulls/etc 填充 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"
此時,查看
vi
or中的兩個腳本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
試一試 !!!