本文為博主原創,轉載請注明出處
隨着業務的需要,工作中需要對生產數據庫的一些表做一些DML操作,由於生產數據庫表的數據量都是幾千萬,
而且生產數據庫的表還在不斷的進行新增和查詢操作。應用中需要對生產數據庫的表添加一個字段,由於考慮到數據量
大,而且表數據還在不斷新增,以及進行查詢等操作,為了不影響業務和數據,需要考慮在生產數據表添加字段時,不影響
正常業務,即不鎖表也盡量減少性能的影響,所以通過不斷查找,了解到使用以下的方式可以達到上面的效果,
ALGORITHM=INPLACE, LOCK=NONE;
來解釋下:
Algorithm=Inplace :可避免表拷貝導致的實例性能問題(空間、I/O問題),建議在 DDL 中包含該選項。
如果 DDL 操作不支持 Algorithm=Inplace 方式,DDL 操作會立刻返回錯誤。
Lock=None :為了在 DDL 操作過程中不影響業務的 DML 操作,建議在 DDL 中包含該選項。
如果 DDL 操作不支持 Lock=None (允許並行 DML 操作)選項,DDL 操作會立刻返回錯誤。
默認情況下 MySQL 會盡量使用 algorithm=inplace , lock=none 來進行 DDL 操作。因此默認可以不指定這兩個選項。
為了保障期間,還是在ddl中加上了上面的兩個配置,一張兩千萬的表加一個字段執行了8分鍾,正常新增。
SQL語句如下:
ALTER TABLE `fucdn_customer_domain_flow12` ADD COLUMN `total` int(11) NOT NULL COMMENT '請求數', ALGORITHM=INPLACE, LOCK=NONE;
2020.01.07--后續補充
昨晚系統上線發布,需要執行sql腳本,但剛點擊sql腳本執行的時候,就返回下列錯誤:
當時就很驚訝,為什么一個alter table 增加字段的的sql執行會報一個主鍵沖突的異常,立馬驚起一身冷汗。找到當晚mysql數據庫值班的同事,
請教了一下,他一看便說這是 mysql版本為5.7中 alter table 的bug,他說我執行的sql需要加上 algorithm=copy 這個參數,當我具體請教這個是什么原因或
什么場景會導致異常時,大佬也是不能具體形容,只是說是mysql的bug,需要對sql加一個algorithm=copy 的保護就可以解決問題。后來再網上查詢,看到一篇很好的文章
在此記錄:
MySQL Online DDL的改進與應用(https://www.cnblogs.com/xinysu/p/6732646.html)
online DDL特性可以使很多ALTER TABLE操作避免表的復制,以及在DDL執行過程中對DML操作的阻塞。
它具有下面的優點:
在繁忙的生產系統中,當你修改索引或字段定義的時候,你可能會讓一張表再幾分鍾內不可用,這個特性提高了數據庫的響應速度和高可用性。