動態線上數據庫加字段避免查詢加鎖,給表結構加鎖,造成死鎖
轉載自 http://www.rzrgm.cn/yidengjiagou/p/16769180.html
需求:有時候需要動態改線上運行的數據庫,而線上的數據庫又正在被增刪改查。
解決方案:ALTER TABLE user ADD age int NOT NULL DEFAULT '0' COMMENT '年齡', ALGORITHM=Inplace, LOCK=NONE;
原理:從MySQL5.6版本開始增加了Online DDL,作用就是在執行DDL的時候,允許并發執行DML。簡單翻譯就是修改表結構的時候,也能同時支持并發執行增刪查改操作。從MySQL8.0版本開始又優化了Online DDL,支持快速添加列,可以實現給大表秒級加字段。具體用法就是在DDL語句后面增加兩個參數ALGORITHM和LOCK。這兩個參數分別是干嘛用的?有哪些選項呢?
ALGORITHM 可以指定使用哪種算法執行DDL,可選項有:
Copy:
拷貝方式,MySQL5.6 之前 DDL 的執行方式,過程就是先創建新表,修改新表結構,把舊表數據復制到新表,刪除舊表,重命名新表。執行過程非常耗時,產生大量的磁盤IO和占用CPU,還有使Buffer poll失效,而且需要鎖住舊表,性能較差,現在基本很少使用。
Inplace:
原地修改,MySQL5.6開始引入的,優點是不會在Server層發生表數據拷貝,過程中允許并發執行DML操作。過程就是先添加MDL寫鎖,執行初始化操作,然后降級為MDL讀鎖,執行DDL操作(比較耗時,允許并發執行DML操作),升級為MDL寫鎖,完成DDL操作。
Instant:
快速修改,MySQL8.0開始引入的,可以實現快速給大表添加字段。
性能依次是,Instant > Inplace > Copy。
LOCK可以指定執行過程中,是否加鎖,可選項有:
NONE
不加鎖,允許DML操作。
SHARED
加讀鎖,允許讀操作,禁止DML操作。
DEFAULT
默認鎖模式,在滿足DDL操作前提下,默認鎖模式會允許盡可能多的讀操作和DML操作。
EXCLUSIVE
加寫鎖,禁止讀操作和DML操作。
Online DDL并不是支持所有DDL操作,看一下到底支持哪些操作?

設置列not null No Yes Yes Yes No
像最常見的添加列就可以使用Instant,而像刪除列、重命名列、更改列數據類型就只能使用Inplace了。
本文來自博客園,作者:迷茫的小白,轉載請注明原文鏈接:http://www.rzrgm.cn/cloudHui/p/16792634.html

浙公網安備 33010602011771號