2017-04-30 43 views
3

我目前正在嘗試添加一列到約25m行的表。我需要接近零的停機時間,所以希望使用在線DDL。它運行了一段時間,但最終跑進問題:MySQL添加列與在線DDL

"Duplicate entry '1234' for key 'PRIMARY'" 
[SQL: u'ALTER TABLE my_table ADD COLUMN my_coumn BOOL NOT NULL DEFAULT false'] 

我認爲這正在發生的事情,因爲我正在對錶INSERT ... ON DUPLICATE KEY UPDATE ...業務運行操作一段時間。這似乎是一個known limitation

在此之後沒有工作,我嘗試使用Percona的pt-online-schema-change工具,但不幸的是,因爲我的表已生成列,沒有工作,要麼錯誤:

The value specified for generated column 'my_generated_column' in table '_my_table_new' is not allowed. 

所以,我現在處於虧損狀態。我可以在不阻止DML操作的情況下添加列的其他選項是什麼?

回答

0

您的Alter語句創建了一個不可爲空的列,其默認值爲false。我懷疑這會在你的表上放置一個排它鎖,嘗試創建列,然後在每行中設置爲False。

如果你沒有任何可用的停機時間,我建議你

  1. 爲可爲空,並沒有默認值

    ALTER TABLE my_table ADD COLUMN my_coumn BOOL NULL; 
    
  2. 更新值添加列現有行假

    update my_table set my_coumn=false; 
    
  3. 第二次將該表更改爲非空能夠和默認。

    ALTER TABLE my_table modify my_coumn BOOL NOT NULL DEFAULT false; 
    

或者,你可以使用類似Percona,其管理使用觸發器架構更改,其目的是提供不鎖定表更新架構的能力。

任何一個選項我建議你在開發環境中測試一些過程寫入表以模擬用戶活動。

+0

我倒下了,因爲我不認爲你看了這個問題。錯誤是關於重複的條目,並且與可爲空的任何內容無關。這個問題也明確說我嘗試使用'pt-online-schema-change'(Percona),你推薦我使用它。 – Eli

+0

您的具體問題是'我的其他選擇是否添加列而不阻止DML操作?',並且提供的要求是'我需要接近0的停機時間,所以希望使用在線DDL'。 。這是我試圖回答沒有任何詳細的DDL。我所提供的是我過去使用的一種方法,用於限制添加到活動表的列的影響。如果你想要我的進一步反饋,然後發送具體的ddl和表定義。我也只是提到Percona工具是專門爲這個問題製作的。分享您使用它的方式以及您收到的錯誤。 – Dom

+0

你還沒有看到這個問題。你所做的每一點或者與問題無關,或者在問題中作出迴應。我不想在這裏粗魯。我真的不知道還有什麼要告訴你。 – Eli