Mysql

Mysql Alter Tables 花了 5 個小時才添加 1 列

  • October 22, 2017

最近有一個問題,在一個有 100 萬行的表上添加一列需要 5 個小時。我添加了一個預設值為 1 的列。這是在夜間完成的,因此數據庫上沒有太多活動,但一旦開始,它確實有很多鎖。

從伺服器統計數據來看,CPU、記憶體和硬碟空間都遠低於其最大值的一半。所以我不知道為什麼這花了這麼長時間,有問題的表格只有 7 列,包括新的列。數據類型為 int(11)、datetime 或 varchar(45)。

我正在使用 MySQL Cluster 7.3.3,有 4 個數據節點,所有這些節點都在同一個數據中心。

誰能告訴我為什麼簡單地添加一列需要 5 個小時?

表結構:

CREATE TABLE ddi_t ( 
   id int(11) NOT NULL AUTO_INCREMENT, 
   ddi varchar(45) NOT NULL, 
   is_deleted tinyint(1) NOT NULL DEFAULT '0', 
   created_time datetime NOT NULL, 
   module_group_id int(11) DEFAULT NULL, 
   created_user_id int(11) DEFAULT NULL, 
   supplier_id int(11) DEFAULT '1', 
   PRIMARY KEY (id), 
   UNIQUE KEY uq_ddi_1 (ddi), 
   KEY fk_ddi_1_idx (module_group_id) 
) ENGINE=ndbcluster AUTO_INCREMENT=935352 DEFAULT CHARSET=latin1

在我使用 MySQL Cluster 的經驗中,我發現pt-online-schema-change是一個非常方便的工具,用於應用實時模式更改。

它是這樣工作的:

  1. 它創建一個新的真實表B (具有臨時目的)作為您要更改的表A的複製
  2. 然後將架構更改應用於表B。操作很快,因為表是空的並且沒有流量。
  3. 它創建一個觸發器,以便將插入到表A中的新記錄複製到表B中
  4. 然後慢慢將記錄從A複製到B的小數據塊中
  5. 他們用原子RENAME TABLE操作B變成A

我不確定它是否適用於所有類型的架構更改。

如果表很大,則需要很長時間,但該表仍可用於讀/寫查詢。

執行的 mysql 使用者pt-online-schema-change必須具有特定的權限,但這在文件中沒有明確解釋(我已經打開了一個關於這個的bug 票

添加列需要對整個表(每個節點,而不是每個集群)進行排他鎖。沒有隊列,因此數據庫將等到沒有寫入發生後再鎖定表。如果應用程序正在執行大量寫入,則可能無法獲取該鎖。

如果您可以控制應用程序連接到哪個節點(使用 HAProxy 等),請引導所有流量遠離您嘗試更新的節點。否則,您將需要在執行此類任務之前關閉您的應用程序。

引用自:https://dba.stackexchange.com/questions/152767