2014-04-03 45 views
1

所以我有一個表4 016 515 759行。我需要將我的address_id字段的字段類型從int更改爲bigint,也是其FOREIGN KEYMySQL更改巨大的表(更改字段類型)

我只是測試此查詢:

SET foreign_key_checks = 0; 
ALTER TABLE `my_table` CHANGE address_id address_id bigint; 

在本地表6 845 016行 - 它需要14分鐘。我猜測這個40億行將需要很長時間。

所以問題是:如何更新這真快又安全?或者我應該複製my_table並在此副本上執行ALTER,然後將其命名?

因爲停機時間會很長。

+0

默認值最小化客戶端查詢'address_id'爲0 –

+0

'address_id not null default 0' –

+0

同樣的結果,大約14分鐘 –

回答

1

編輯:這可能是引擎特定的。

改變一個使用很多表中有一個外鍵的列......你正在進入一個傷害我的朋友的世界。

如果您在當時實際使用的環境中這樣做,整個表將被鎖定,直到您的更改完成。準備鎖定等待超時甚至最大連接錯誤。根據您的情況,只需幾分鐘的更改就可能意味着停機。

還有那些誰arcanely圍繞它的工作:

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html

請務必閱讀有關外鍵的部分。

所以......

我個人的方法是這樣的事情不要和嘗試,以防止它被認爲尺寸過大可能有史以來得到太小,太重要了,任何領域。對所有數字主鍵等進行unsigned bigint。

雖然有一段時間,其他人只是在一個巨大的改變表中踢球,一切都會阻塞,我們打了最大的連接。很難預防這種情況,因爲測試不會失敗那麼難:一個簡單的測試env沒有那麼多流量。

問題是:不可避免的mysql重新啓動傾向於立即恢復表新結構。

短版:

  • 計劃停機
  • 轉動的東西掉
  • 運行ALTER TABLE
  • 重啓MySQL當你開始感到厭煩的