如何安全的大數據量表在線進行DML操作


本文為博主原創,轉載請注明出處

  隨着業務的需要,工作中需要對生產數據庫的一些表做一些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操作的阻塞。

它具有下面的優點:

在繁忙的生產系統中,當你修改索引或字段定義的時候,你可能會讓一張表再幾分鍾內不可用,這個特性提高了數據庫的響應速度和高可用性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM