2011-09-29 77 views
52

我只是試圖添加一個名爲「位置」的列到數據庫中的表(main_table)。我運行的命令是ALTER TABLE ADD COLUMN需要很長的時間

ALTER TABLE main_table ADD COLUMN location varchar (256); 

main_table包含> 2,000,000行。它持續運行2個多小時,但仍未完成。

我試圖使用mytop 來監視此數據庫的活動,以確保查詢未被其他查詢進程鎖定,但似乎沒有。它應該需要很長時間嗎?實際上,我只是在運行此命令之前重新啓動機器。現在這個命令仍在運行。我不知道該怎麼做。

+0

這將需要一個LO這是因爲索引和表中存在的行數。注意:Varchar(255) – Jauzsika

+0

我認爲你應該爲它指定一個默認值。可能這就是爲什麼需要時間? – Nilesh

+1

在這種情況下它默認爲'NULL',絕對不是爲什麼需要很長時間。 – Romain

回答

137

您的ALTER TABLE聲明意味着mysql必須重新編寫包含新列的表中的每一行。既然你有超過200萬行,我肯定會期望它花費大量的時間,在這期間你的服務器可能會主要是IO限制。通常你會發現它更高性能做到以下幾點:

CREATE TABLE main_table_new LIKE main_table; 
ALTER TABLE main_table_new ADD COLUMN location varchar(256); 
INSERT INTO main_table_new (fields_in_main_table) SELECT * FROM main_table; 
RENAME TABLE main_table TO main_table_old, main_table_new TO main_table; 
DROP TABLE main_table_old; 

這樣你就空表添加列,基本上寫在新表,你就一定沒有人會是數據沒有鎖定儘可能多的資源。

+48

+1的'LIKE'語法,我從來沒有見過。 – Malvolio

+0

@Malvolio值得注意:我認爲這是一個MySQL專有的SQL擴展......儘管如此,並不是100%確定的。 – Romain

+4

即使是這樣,上次任何人使用非MySQL SQL RDBMS的時間是?朋友不要讓朋友購買Oracle。 – Malvolio

9

我認爲這個問題的最佳答案是使用類似pt-online-schema-changegh-ost的功能。

我們已經完成了超過40億行的遷移,儘管這可能需要長達10天的時間,停機時間還不到一分鐘。

Percona的工作在一個非常相似的時裝如上

  • 創建臨時表
  • 創建的第一個表的觸發器(用於插入,更新,刪除),以便它們複製到臨時表
  • 在小批量,遷移數據
  • 完成後,重命名錶,新表,並刪除其他表
+1

這是一個問題,證據表明,較少的投票或接受的解決方案有時是最好的或唯一正確的解決方案。有多少人爲OMG不正確的其他解決方案投票。 –

相關問題