Mysql

從大型 percona mysql db 中刪除許多行

  • September 30, 2016

我需要對這個案子有新的看法。任何想法表示讚賞。

輸入:我們有一個巨大的 percona mysql (5.5) 數據庫,需要幾個 Tb (TB)。innodb 引擎上的表。應盡快刪除該大小的一半(2/3)以上。我們也有主從配置。

作為實現這一目標的最快方法,我正在考慮以下解決方案:為從伺服器上的每個表執行(以避免生產停機):

  1. 停止複制
  2. 選擇不刪除的行到與原表結構相同的空新表中
  3. 將原始表重命名為“table_old”,新表 - 更正名稱
  4. 刪除原始表“table_old”
  5. 開始複製

問題是我們有很多 FK 約束。我也害怕在這個過程中破壞複製。

問題: 1) 在這個解決方案中,FK 約束可能存在哪些潛在問題?2)如何不中斷複製?3) 意見?替代解決方案?

先感謝您。

如果您有磁碟空間,您的程序非常好。

這樣做時禁用外鍵。(並希望沒有人製造不會被抓住的 FK 違規行為。)

在一個語句中進行兩次重命名:RENAME TABLE real TO old, new TO real;.

複製不應該是一個問題——除了一次SELECT複製會導致很大的複制延遲。

如果您沒有磁碟空間,那麼您將陷入困境。沒有表結構會縮小。

更多關於大刪除的討論

這討論了“分塊”,它可以適應大的SELECT,這樣它對複制的影響就更小了。

或者可以進行分塊以進行刪除,而無需其他所有內容。這也避免了 FK 問題和複製延遲。但是,它不會縮小生成的表大小;它留下了很多可用空間。然後,您可以使用 pt-online-schema-change 僅複製表,從而縮小表。嗯……我想這是如何在不需要額外空間的情況下進行刪除釋放磁碟空間。但如果你有它也無濟於事。innodb_file_per_table=OFF

pt-online-schame-change的步驟一樣,您可以手動執行此操作:

  • 創建與表(原始表)table_new具有相同架構的新表。table
  • table在表上為INSERT,UPDATE和,創建觸發器DELETE以寫入table_new一個。
  • 複製數據並使用主鍵限制行數,避免長時間鎖定。
  • 複製完成後,鎖定這兩個表和所有與 FK 相關的表。
  • 刪除 FK 約束。
  • 重命名tabletable_old,然後重命名table_newtable
  • 重新添加 FK 約束。
  • 放下扳機table_old
  • table_old一旦你確認一切正常,你就可以放棄了。

這將減少生產停機時間。我之前在 100GB 的表上做過這個(但沒有外鍵),效果很好。

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