Mysql
INSERT … SELECT 在一個巨大的 MySQL 表上
我已經隔離了 MySQL 5.5,裡面有一個巨大的表(3.5TB 的數據,是的,它只有 1 個表)。
目標是將該表的一半複製到同一伺服器上的另一個中。如何更好更快地做到這一點?:
只是
INSERT INTO new_table SELECT * FROM old_table WHERE ...
。在這種情況下 MySQL 的行為是什麼?我希望與 MySQL 的連接會因超時而中斷,但是查詢本身應該執行直到所有數據都被複製。或者 MySQL 會因為這樣的查詢而崩潰?使用相同
INSERT ... SELECT
但按塊選擇(例如按 10000 行)。這應該肯定更安全,但我猜要慢得多。什麼是最好的方法?先感謝您!
PS 在插入之前,我將
FK
在新表上刪除和索引 + 禁用 sql_log_bin 和
您的選項 2 將是要走的路,更小的塊。根據行的大小,您可以將行增加到 1M 左右。
我已經看到 ALTER TABLEs 執行了好幾天。問題不是超時,問題是如果查詢在某個時候失敗,您將不得不從頭開始重新啟動它。
但是你的案例到底是什麼?伺服器會繼續接受來自應用程序的查詢嗎?如果沒有,你的想法沒問題,我看不出任何警告。
否則,使用
pt-archive
. 它是為此目的而設計的,它避免了伺服器過載。但是:**不要禁用二進制日誌!**您將無緣無故地破壞增量備份!跑吧
SET binlog_format = 'STATEMENT'
。相反,如果伺服器不需要接受來自應用程序的連接,並且表是 InnoDB,則可以使用
--innodb-doublewrite=0
. 操作會快很多。但是請記住(這很重要)在沒有該選項的情況下再次重新啟動它。