Mysql

我可以安全地殺死 InnoDB 表上的 OPTIMIZE TABLE 嗎?

  • October 11, 2017

MySQL 的kill 警告文件:

警告

殺死表上的REPAIR TABLEorOPTIMIZE TABLE操作MyISAM會導致表損壞且無法使用。對此類表的任何讀取或寫入都會失敗,直到您再次優化或修復它(不中斷)。

那是為 MyISAM 準備的。

殺死OPTIMIZE TABLE針對 InnoDB 表執行的程序是否也不安全?

根據 MySQL 認證指南:

OPTIMIZE TABLE 語句通過對 MyISAM 表進行碎片整理來清理它。這涉及回收因刪除和更新而產生的未使用空間,以及合併已拆分和非連續儲存的記錄。如果索引頁亂序,OPTIMIZE TABLE 也會對它們進行排序並更新索引統計資訊

也適用於 InnoDB 表,但映射到重建表的 ALTER TABLE。這會更新索引統計資訊並釋放聚集索引中的空間。

所以在 InnoDB 的情況下:

Innodb 是 ACID 兼容的,優化表只是將所有記錄複製到一個新表中

  1. 如果索引頁未排序,則對其進行排序,
  2. 如果表的統計資訊不是最新的(並且無法通過對索引進行排序來完成修復),請更新它們。
  3. 如果表已刪除或拆分行,請修復表。

如果你在它執行時試圖殺死它,你不會失去任何記錄。

此外,在 InnoDB 的情況下innodb_defragment=1,將不需要 ROLLBACK,因為在這種情況下OPTIMIZE TABLE是增量的。

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