Mysql
從大型 percona mysql db 中刪除許多行
我需要對這個案子有新的看法。任何想法表示讚賞。
輸入:我們有一個巨大的 percona mysql (5.5) 數據庫,需要幾個 Tb (TB)。innodb 引擎上的表。應盡快刪除該大小的一半(2/3)以上。我們也有主從配置。
作為實現這一目標的最快方法,我正在考慮以下解決方案:為從伺服器上的每個表執行(以避免生產停機):
- 停止複制
- 選擇不刪除的行到與原表結構相同的空新表中
- 將原始表重命名為“table_old”,新表 - 更正名稱
- 刪除原始表“table_old”
- 開始複製
問題是我們有很多 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 約束。
- 重命名
table
為table_old
,然後重命名table_new
為table
。- 重新添加 FK 約束。
- 放下扳機
table_old
。table_old
一旦你確認一切正常,你就可以放棄了。這將減少生產停機時間。我之前在 100GB 的表上做過這個(但沒有外鍵),效果很好。