2012-06-12 89 views
8

我想在我的表運行此:更改HUGE表中列的數據類型。性能問題

ALTER TABLE table_name MODIFY col_name VARCHAR(255) 

但我的表是巨大的,它比65M以上(65億美元)的行。現在當我執行的時候,執行這個命令需要將近50分鐘。任何更好的方式來改變表?

+4

不,這將是緩慢的。 ALTER語句是一次性操作。等一下,希望你不需要再做一次。 –

+3

巨大的桌子?沒有。很大?是。 –

回答

3

那麼,你需要

ALTER TABLE table_name CHANGE col_name new_name VARCHAR(255) 

但是,你是正確的,這需要一段時間來進行更改。真的沒有更快的方式來改變MySQL中的表格。

在變更過程中,您擔心停機嗎?如果是這樣,這裏有一種可能的方法:將表格複製到新的表格中,然後更改副本上的列名稱,然後重命名該副本。

您可能已經想通過在生產系統中常規更改表中的列名不是一個好主意。

+0

是的。我不能承受50分鐘的停機時間,因爲在此期間所有的行都會被鎖定,這將阻止此表上的其他操作(CRUD)。 – Kiran

+0

呃。哦。這意味着,如果您複製表格,則在重新組織新表格時,新表格和更改行將出現在舊錶格中。如果這是我的項目,我現在要試着決定改變這個列名的重要性。 –

+0

是的。我可以做一件事。宣佈1小時的停機時間,並在負載較少時進行更改。可能在午夜。不過,謝謝你的投入。 – Kiran

0

您可以使用Oak處理模式更改而無需停機。

oak-online-alter-table複製原始表的模式,應用您的更改並複製數據。 CRUD操作仍然可以被調用,因爲橡木會在原始表格上放置一些觸發器,因此在操作過程中不會丟失任何數據。

請參考other question橡木的作者給出了關於這種機制的詳細解釋,並且還提出了其他工具。