亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1. 問題:怎么給線上表加字段?

工作中最常遇到的問題,怎么給線上頻繁使用的大表添加字段?

比如:給下面的用戶表(user)添加年齡(age)字段。

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用戶表';

有同學(xué)會說,這還不簡單,直接加不加完了,用下面的命令:

ALTER TABLE `user` ADD `age` int NOT NULL DEFAULT '0' COMMENT '年齡';

添加完,再查看一下表結(jié)構(gòu):

CREATE TABLE `user` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(100) DEFAULT NULL COMMENT '姓名',
  `age` int NOT NULL DEFAULT '0' COMMENT '年齡',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='用戶表';

這不是添加成功了嗎?有什么呀!

是的,線下數(shù)據(jù)庫怎么整都行,但是如果在線上數(shù)據(jù)庫這樣操作,整個服務(wù)都有宕機的風(fēng)險!自己也離畢業(yè)不遠了。

不是危言聳聽,我們找個case測試一下:

 

  1. Session1啟動了一個事務(wù),沒有提交。
  2. Session2執(zhí)行添加列的操作,被阻塞。
  3. 更嚴(yán)重的是,Session3執(zhí)行簡單查詢的語句也被阻塞了。

2. 線上服務(wù)宕機的原因

為什么會出現(xiàn)這種情況呢?

原因是在執(zhí)行查詢語句的時候,MySQL自動加了MDL鎖(metadata lock,即元數(shù)據(jù)鎖)

不行的話,我們可以再執(zhí)行一下show processlist命令,查看有哪些正在執(zhí)行的進程:

 

可以清楚的看到Session2和Session3的語句正在等待MDL鎖,Waiting for table metadata lock

MDL鎖的作用是什么?

為了保證并發(fā)操作下數(shù)據(jù)的一致性。

如果一個事務(wù)正在執(zhí)行中,另一個在這時修改了表結(jié)構(gòu),不但可能導(dǎo)致當(dāng)前事務(wù)出現(xiàn)不可重復(fù)讀的問題,還有可能連事務(wù)都無法提交。

什么時候會加MDL鎖?

MDL鎖是MySQL自動隱式加鎖,無需我們手動操作。

在我們執(zhí)行DDL語句的時候,MySQL自動添加MDL讀鎖。

在我們執(zhí)行DML語句的時候,MySQL自動添加MDL寫鎖。

讀鎖與讀鎖之間不互斥,讀鎖與寫鎖、寫鎖與寫鎖之間互斥。

注意:MDL鎖是表鎖,會對整張表加鎖。

普及額外的小知識點,什么是DML和DDL:

DML(Data Manipulation Language)數(shù)據(jù)操縱語言:

適用范圍:對表數(shù)據(jù)進行操作,比如 insert、delete、select、update等。

DDL(Data Definition Language)數(shù)據(jù)定義語言:

適用范圍:對表結(jié)構(gòu)進行操作,比如create、drop、alter、rename、truncate等。

3. 如何優(yōu)雅的給線上表加字段

既然修改表結(jié)構(gòu)的時候,MySQL會自動添加表鎖,并且是寫鎖,會阻塞后續(xù)的所有讀寫請求,造成非常嚴(yán)重的后果。

還有沒有辦法能優(yōu)雅的給線上表添加字段呢?

當(dāng)然有,從MySQL5.6版本開始增加了Online DDL,作用就是在執(zhí)行DDL的時候,允許并發(fā)執(zhí)行DML。簡單翻譯就是修改表結(jié)構(gòu)的時候,也能同時支持并發(fā)執(zhí)行增刪查改操作。

從MySQL8.0版本開始又優(yōu)化了Online DDL,支持快速添加列,可以實現(xiàn)給大表秒級加字段。

具體用法就是在DDL語句后面增加兩個參數(shù)ALGORITHMLOCK

比如下面這樣:

ALTER TABLE `user` ADD `age` int NOT NULL DEFAULT '0' COMMENT '年齡', 
ALGORITHM=Inplace, 
LOCK=NONE;

這兩個參數(shù)分別是干嘛用的?有哪些選項呢?

ALGORITHM可以指定使用哪種算法執(zhí)行DDL,可選項有:

  • Copy:
  • 拷貝方式,MySQL5.6 之前 DDL 的執(zhí)行方式,過程就是先創(chuàng)建新表,修改新表結(jié)構(gòu),把舊表數(shù)據(jù)復(fù)制到新表,刪除舊表,重命名新表。執(zhí)行過程非常耗時,產(chǎn)生大量的磁盤IO和占用CPU,還有使Buffer poll失效,而且需要鎖住舊表,性能較差,現(xiàn)在基本很少使用。
  • Inplace:
  • 原地修改,MySQL5.6開始引入的,優(yōu)點是不會在Server層發(fā)生表數(shù)據(jù)拷貝,過程中允許并發(fā)執(zhí)行DML操作。過程就是先添加MDL寫鎖,執(zhí)行初始化操作,然后降級為MDL讀鎖,執(zhí)行DDL操作(比較耗時,允許并發(fā)執(zhí)行DML操作),升級為MDL寫鎖,完成DDL操作。
  • Instant:
  • 快速修改,MySQL8.0開始引入的,可以實現(xiàn)快速給大表添加字段。

性能依次是,Instant > Inplace > Copy。

LOCK可以指定執(zhí)行過程中,是否加鎖,可選項有:

  • NONE
  • 不加鎖,允許DML操作。
  • SHARED
  • 加讀鎖,允許讀操作,禁止DML操作。
  • DEFAULT
  • 默認(rèn)鎖模式,在滿足DDL操作前提下,默認(rèn)鎖模式會允許盡可能多的讀操作和DML操作。
  • EXCLUSIVE
  • 加寫鎖,禁止讀操作和DML操作。

Online DDL并不是支持所有DDL操作,看一下到底支持哪些操作?

操作

Instant

Inplace

Rebuilds Table

允許并發(fā)DML

僅修改元數(shù)據(jù)

添加列

Yes

Yes

No

Yes

No

刪除列

No

Yes

Yes

Yes

No

重命名列

No

Yes

No

Yes

Yes

更改列順序

No

Yes

Yes

Yes

No

設(shè)置列默認(rèn)值

Yes

Yes

No

Yes

Yes

更改列數(shù)據(jù)類型

No

No

Yes

No

No

設(shè)置VARCHAR列大小

No

Yes

No

Yes

Yes

刪除列默認(rèn)值

Yes

Yes

No

Yes

Yes

更改自動增量值

No

Yes

No

Yes

No

設(shè)置列為null

No

Yes

Yes

Yes

No

設(shè)置列not null

No

Yes

Yes

Yes

No

像最常見的添加列就可以使用Instant,而像刪除列、重命名列、更改列數(shù)據(jù)類型就只能使用Inplace了。

分享到:
標(biāo)簽:MySQL
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定