2012-06-04 37 views
3

如何修改一個MySQL表,其中每秒都有數百條記錄被插入,而沒有任何停機/丟失數據或錯誤。修改MySQL表

例如:添加一個新的領域

感謝

+2

你想做什麼樣的修改? – Ryan

+0

添加新字段 – Tarek

+0

記錄是僅插入到該表中還是該表上還有一個SELECT? – FeRtoll

回答

0

直覺說,你應該避免修改表。另一種方法是將列添加到新表中並鏈接到原始表以保持參照完整性,因此原始表保持不變。

另一種相當典型的方法是創建一個添加了列的新表,將它與舊錶互換,然後將數據添加回新表。雖然不是很好的解決方案。

MySQL大師可能會不同意我。

0

那麼,如果只插入我認爲最好的是:

CREATE TABLE the_table_copy LIKE the_table; 
ALTER TABLE the_table_copy ADD new_field VARCHAR(60); 
RENAME TABLE the_table TO the_table_backup; 
RENAME TABLE the_table_copy TO the_table; 

但首先做它的一個副本,如果速度不夠快與副本嘗試。然後在真實的生活中做! :)

+0

那麼... the_table將不會包含任何數據。這似乎是一個問題。這將導致RENAME語句之間的(短)時間段的停機。 –

+0

停機時間可以是0.002毫秒,並且表可以是空的,塔雷克說他只插入沒有選擇它 – FeRtoll

+0

好吧他沒有說他只插入,他說他被告知只有插入我看到。那麼Tarek如果沒有選擇和更新,那麼我認爲這將是好的。 – FeRtoll

0

那麼,我會鎖定表,添加字段,解鎖表。接下來會出現一些延遲,但我想這不會太麻煩。

+0

我很確定添加字段的DDL會自動鎖定表。 –

0

當你說「添加一個字段」,你正在創建新的列,或只是更新列中的值?兩者是完全不同的東西。如果僅更新列,請更改數據模型以支持同一表中同一行的多個版本,並在表的末尾添加新行。這爲您提供了最佳的讀寫併發性。

除此之外,您可以看看「處理程序套接字」方法。 http://yoshinorimatsunobu.blogspot.com/search/label/handlersocket

+0

添加一個不更新列的值的新列 – Tarek

0

如果您只需要添加一列,則沒有理由要求停機。該表將在ALTER TABLE語句(毫秒)期間被鎖定。在此期間提交的任何DML都必須等待,因此它可能會短暫影響性能,但不應該導致任何異常,除非代碼在某處明確檢查鎖定。

+0

毫秒?請告訴我如何添加一列到我的300M行,50GB表(以毫秒爲單位)(庫存mysql)。 –