Mysql

在很少或沒有停機時間的情況下修改非常大的 mysql 表的列

  • December 4, 2015

我需要定期對 mysql 5.1 中的表進行更改,主要是添加列。使用 alter table 命令非常簡單。但是我的表現在有多達 4000 萬行並且它們正在快速增長……所以那些 alter table 命令需要幾個小時。幾個月後,我猜他們需要幾天的時間。

由於我使用的是 amazon RDS,所以我不能讓從伺服器玩,然後提升為主伺服器。所以我的問題是,是否有辦法以最少的停機時間做到這一點?如果使用者當然仍然可以使用數據庫,我不介意花費數小時甚至數天的操作……他們至少可以在添加列時閱讀嗎?如果我的應用程序嘗試寫入會發生什麼?插入還是更新?如果它立即失敗那實際上還不錯,如果它只是掛起並導致數據庫伺服器出現問題,那是一個大問題..

這一定是一個相當普遍的擴展問題,每個人都需要添加列。生產數據庫通常會做什麼?從 -> 主遷移?

更新- 我忘了提到我正在使用 innodb 儲存引擎

我需要定期對 mysql 5.1 中的表進行更改,主要是添加列。

不。不完全是。只是不要。這應該是一個非常罕見的場合,這是必要的

假設您的數據確實從一開始就被規範化,解決問題的正確方法是添加一個與基表具有 1:1 關係的新表(在新表上不是強制性的)。

必須定期添加列通常表明數據庫未規範化 - 如果您的模式未規範化,那麼這就是您需要解決的問題。

最後,如果你的模式真的,真的是規範化的,那麼你真的,真的必須繼續添加列:

  1. 確保您在數據庫上有一個時間戳列,或者它正在生成複制日誌
  2. 創建表 (A) 的副本 (B)
  3. 將新列添加到 B(這仍然會被 myisam 阻塞)
  4. 禁用事務
  5. 將原始表 (A) 重命名為其他表(備份)
  6. 將新表 (B) 重命名為原始表 (A) 的名稱
  7. 從複製日誌或備份表中重播操作開始時的事務
  8. 啟用交易。

引用自:https://serverfault.com/questions/174749