Mysql

INSERT … SELECT 在一個巨大的 MySQL 表上

  • August 8, 2019

我已經隔離了 MySQL 5.5,裡面有一個巨大的表(3.5TB 的數據,是的,它只有 1 個表)。

目標是將該表的一半複製到同一伺服器上的另一個中。如何更好更快地做到這一點?:

  1. 只是INSERT INTO new_table SELECT * FROM old_table WHERE ...。在這種情況下 MySQL 的行為是什麼?我希望與 MySQL 的連接會因超時而中斷,但是查詢本身應該執行直到所有數據都被複製。或者 MySQL 會因為這樣的查詢而崩潰?

  2. 使用相同INSERT ... SELECT但按塊選擇(例如按 10000 行)。這應該肯定更安全,但我猜要慢得多。

什麼是最好的方法?先感謝您!

PS 在插入之前,我將FK在新表上刪除和索引 + 禁用 sql_log_bin 和

您的選項 2 將是要走的路,更小的塊。根據行的大小,您可以將行增加到 1M 左右。

我已經看到 ALTER TABLEs 執行了好幾天。問題不是超時,問題是如果查詢在某個時候失敗,您將不得不從頭開始重新啟動它。

但是你的案例到底是什麼?伺服器會繼續接受來自應用程序的查詢嗎?如果沒有,你的想法沒問題,我看不出任何警告。

否則,使用pt-archive. 它是為此目的而設計的,它避免了伺服器過載。

但是:**不要禁用二進制日誌!**您將無緣無故地破壞增量備份!跑吧SET binlog_format = 'STATEMENT'

相反,如果伺服器不需要接受來自應用程序的連接,並且表是 InnoDB,則可以使用--innodb-doublewrite=0. 操作會快很多。但是請記住(這很重要)在沒有該選項的情況下再次重新啟動它。

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