Mysql

從屬伺服器上的 ALTER TABLE ADD COLUMN 會中斷複製嗎?

  • March 22, 2019

我需要在last_modifiedMyISAM 表中添加一列tbl_items。這個問題的癥結在於tbl_items容納了數千兆字節的數據。另外值得注意的是,我正在使用帶有一個從屬的主從部署。

顯然,ALTER TABLE在主伺服器上執行必要的命令是不可接受的,因為它會鎖定表超過半小時。最不幸的是,我在白天或晚上的任何時間都無法承受這種停機時間。

一些消息來源提出了以下某種形式:

  1. 禁用複製到從站
  2. ALTER TABLE在slave上執行命令
  3. 重新打開複製並等待從站趕上
  4. 將奴隸提升為主

這是一個可行的解決方案嗎?在我看來,tbl_items在第 2 步開始和第 4 步之間,所有新插入都會失去;也就是說,tbl_items數據是否可以在缺少新列的整個時間間隔內複製?

如果是這種情況,是否有替代解決方案可以消除停機和數據失去的可能性?

我認為,如果您的目的是避免鎖定,您應該使用pt-online-schema-change(來自 Percona Toolkit 的工具)或Gh-ost(來自 GitHub)。

以下是 pt-osc 的工作原理:

  • 創建一個與原始表相同但為空的虛表
  • 在 ghost 表上執行 ALTER TABLE
  • 在原始表上創建觸發器,在新表中插入新行,如果它們已經存在,則更新和刪除它們。
  • 它以塊的形式複制行,監控伺服器性能(如果需要,它可以減慢或暫停其工作)
  • 切換錶名

gh-ost 非常相似,主要區別在於它不創建觸發器,而是使用二進制日誌來檢測對原始表的更改。

要更直接地回答您的問題 - 是的,可以在從站上添加一列。而且很可能它會簡單地工作,只要它有一個預設值。但很可能在未來你會後悔這個選擇,因為你需要做一些會破壞複製的事情,比如在 master 中添加一個列。我建議在做這樣的事情之前一定要檢查文件並充分了解危險。

嘗試這些可能的建議和解決方案:

  • myisam_sort_buffer_size對於 MyISAM 表,您可以通過將系統變數設置為較高的值來加快索引重新創建(更改過程中最慢的部分) 。
  • 如果您在 MyISAM 表上使用 ALTER TABLE,則所有非唯一索引都將在單獨的批處理中創建(與 REPAIR TABLE 一樣)。當您有許多索引時,這應該會使 ALTER TABLE 更快。可以為 MyISAM 表顯式啟動此功能。ALTER TABLE … DISABLE KEYS 告訴 MySQL 停止更新非唯一索引。ALTER TABLE … ENABLE KEYS 然後應該用於重新創建失去的索引。MySQL 使用一種比逐個插入鍵快得多的特殊算法來執行此操作,因此在執行批量插入操作之前禁用鍵應該會大大加快速度。除了前面提到的權限之外,使用 ALTER TABLE … DISABLE KEYS 還需要 INDEX 權限。

當非唯一索引被禁用時,它們會被 SELECT 和 EXPLAIN 等語句忽略,否則會使用它們。

  • 如果您只是更改 MyISAM 表上的列名並希望避免複製整個表,請嘗試以下操作(不提供保修但對我有用):

為了高枕無憂——先用一些虛擬數據試試這個!

  1. 從您的主表中備份 .frm 文件(如果可以,還可以備份數據,但您可能正在閱讀此文件,因為您不能)。
  2. 創建與您要更改的具有相同架構的表(鍵入“顯示創建表並將名稱更改為某物)。假設您將表稱為“rename_temp1”
  3. 執行“alter table change char(128) not null”

$$ substituting your the old definition – ensuring you keep column type the same $$ 4. 確保您已經製作了原始 .frm 文件的副本——將 .frm 文件複製到 .frm。 5. 瞧——一切順利,你的列應該重命名,而不需要完整的複制輸入/輸出(對於 140G 表非常有用……) 6. 可能最好在再次上線之前在桌子上執行 myisamchck

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