亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySql Online DDL操作記錄詳解

 更新時(shí)間:2022年12月20日 17:24:31   作者:Cindy  
這篇文章主要為大家介紹了MySql Online DDL操作記錄詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一、環(huán)境

為支持用戶賬號(hào)刪除功能,需要在 user 表上加一個(gè)字段 deleted。

數(shù)據(jù)庫(kù):Mysql5.6

被 操作表 user:數(shù)量級(jí)為100w,外鍵200多個(gè)

操作:alter table user add deleted boolean NOT NULL default false comment '用戶注銷標(biāo)識(shí)' , algorithm=inplace, lock=none;

二、執(zhí)行過(guò)程分析

在Mysql5.6之后,mysql支持 Online DDL 操作。

Online DDL Support for Column Operations

OperationIn PlaceRebuilds TablePermits Concurrent DMLOnly Modifies Metadata
Adding a columnYesYesYes*No
Dropping a columnYesYesYesNo
Renaming a columnYesNoYes*Yes
Reordering columnsYesYesYesNo
Setting a column default valueYesNoYesYes
Changing the column data typeNoYesNoNo
Dropping the column default valueYesNoYesYes
Changing the auto-increment valueYesNoYesNo*
Making a column NULLYesYes*YesNo
Making a column NOT NULLYes*Yes*YesNo
Modifying the definition of an ENUM or SET columnYesNoYesYes

如圖所示,所執(zhí)行的添加列操作整個(gè)過(guò)程為:

  • 初始化:為創(chuàng)建臨時(shí)表的表結(jié)構(gòu),獲取MDL的排他鎖
  • 執(zhí)行:根據(jù)參數(shù) algorithm=inplace, lock=none ,MDL鎖降級(jí)為共享鎖進(jìn)行數(shù)據(jù)拷貝
  • 提交:由于涉及到增量備份和臨時(shí)表的重命名,MDL鎖需要升級(jí)為排他鎖

分析后認(rèn)為,整個(gè)過(guò)程只有在初始化和提交的極短過(guò)程內(nèi)需要用到MDL排他鎖(影響線上),故而就直接在線上進(jìn)行操作嘗試。

三、遇到的問(wèn)題

在初始化和提交階段需要用到MDL的排他鎖,而如果DDL操作一直沒(méi)獲取MDL鎖(默認(rèn)獲取MDL鎖超時(shí)時(shí)間為一年),那么就會(huì)造成 Waiting for table metadata lock 狀態(tài),也會(huì)阻塞后面所有對(duì) user 表的操作(包括select)。后面會(huì)看到連接占滿,服務(wù)502:

在遇到這樣的問(wèn)題后,為不影響線上,于是后面進(jìn)行了工具的嘗試。

四、工具嘗試

工具涉及到 pt-online-schema-change、gh-ost和阿里云無(wú)鎖DDL。三個(gè)工具大同小異,均為使用臨時(shí)表,將原表數(shù)據(jù)拷貝到臨時(shí)表,最后將臨時(shí)表重命名替換掉原表。區(qū)別是在增量同步方面,一個(gè)用的觸發(fā)器、一個(gè)用的binlog日志。

但是在處理外鍵方面,pt-online-schema-change用的刪除、重建外鍵,gh-ost和阿里云無(wú)鎖DDL則是不支持主表外鍵的變更。eg:阿里云無(wú)鎖DDL的失敗嘗試

故使用工具進(jìn)行 DDL 操作也不適合。

五、Online DDL 嘗試

在本地測(cè)試30w數(shù)據(jù)新增列只需440ms后,嘗試選擇了 online ddl 的操作:

設(shè)置 session 級(jí)別獲取 MDL 鎖等待時(shí)間時(shí)間,避免長(zhǎng)時(shí)間阻塞其他線程

$ set lock_wait_timeout=10;
# 在10s內(nèi)獲取不到MDL鎖,直接退出 alter 操作
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

kill 掉對(duì)應(yīng)的線程以及事務(wù)

$ select group_concat(stat separator ' ') from (select concat('kill query ',id,';') as stat from information_schema.processlist  where command != 'Sleep' and Time > 5 order by Time desc) as stats;
+-------------------------------------+
| group_concat(stat separator ' ')    |
+-------------------------------------+
| kill query 42510; kill query 42514; |
+-------------------------------------+
1 row in set (0.00 sec)
$ select group_concat(stat separator ' ') from (select concat('kill ',trx_mysql_thread_id,';')   as stat from information_schema.innodb_trx order by trx_started desc) as stats;
+-------------------------------------------------------------------------+
| group_concat(stat separator ' ')                                        |
+-------------------------------------------------------------------------+
| kill 42436; kill 42435; kill 42521; kill 42511; kill 42510; kill 42483; |
+-------------------------------------------------------------------------+
1 row in set (0.01 sec)

執(zhí)行 DDL 操作:

$ alter table user add deleted boolean NOT NULL default false comment '用戶注銷標(biāo)識(shí)' , algorithm=inplace, lock=none;

結(jié)果:

以上是在停服后操作的結(jié)果,其中 2 操作在停服后,沒(méi)有需要 kill 的 ID。

參考文獻(xiàn)

InnoDB and Online DDL

以上就是MySql Online DDL操作記錄詳解的詳細(xì)內(nèi)容,更多關(guān)于MySql Online DDL操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • mysql主從復(fù)制讀寫(xiě)分離的配置方法詳解

    mysql主從復(fù)制讀寫(xiě)分離的配置方法詳解

    一般來(lái)說(shuō)mysql都是通過(guò) 主從復(fù)制(Master-Slave)的方式來(lái)同步數(shù)據(jù),再通過(guò)讀寫(xiě)分離(MySQL-Proxy)來(lái)提升數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力 這樣的方案來(lái)進(jìn)行部署與實(shí)施的。
    2018-04-04
  • 詳解Mysql取前一天、前一周、后一天等時(shí)間函數(shù)

    詳解Mysql取前一天、前一周、后一天等時(shí)間函數(shù)

    本文給大家介紹Mysql取前一天、前一周、后一天等時(shí)間函數(shù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • MySQL中如何優(yōu)化order by語(yǔ)句

    MySQL中如何優(yōu)化order by語(yǔ)句

    本文主要介紹了MySQL中如何優(yōu)化order by語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • MySQL定時(shí)器開(kāi)啟、調(diào)用實(shí)現(xiàn)代碼

    MySQL定時(shí)器開(kāi)啟、調(diào)用實(shí)現(xiàn)代碼

    有些新手朋友對(duì)MySQL定時(shí)器開(kāi)啟、調(diào)用不是很熟悉,本人整理測(cè)試一些,拿出來(lái)和大家分享一下,希望可以幫助你們
    2012-12-12
  • Sql Server數(shù)據(jù)庫(kù)遠(yuǎn)程連接訪問(wèn)設(shè)置詳情

    Sql Server數(shù)據(jù)庫(kù)遠(yuǎn)程連接訪問(wèn)設(shè)置詳情

    這篇文章主要介紹了Sql Server數(shù)據(jù)庫(kù)遠(yuǎn)程連接訪問(wèn)設(shè)置詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 草稿整理后mysql兩個(gè)數(shù)據(jù)庫(kù)結(jié)構(gòu)對(duì)比

    草稿整理后mysql兩個(gè)數(shù)據(jù)庫(kù)結(jié)構(gòu)對(duì)比

    這篇文章主要為大家詳細(xì)介紹了mysql兩個(gè)數(shù)據(jù)庫(kù)結(jié)構(gòu)對(duì)比結(jié)果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • MySQL入門(一) 數(shù)據(jù)表數(shù)據(jù)庫(kù)的基本操作

    MySQL入門(一) 數(shù)據(jù)表數(shù)據(jù)庫(kù)的基本操作

    這類文章記錄我看MySQL5.6從零開(kāi)始學(xué)》這本書(shū)的過(guò)程,將自己覺(jué)得重要的東西記錄一下,并有可能幫助到你們,在寫(xiě)的博文前幾篇度會(huì)非?;A(chǔ),只要?jiǎng)邮智?,跟著我?xiě)的例子全部實(shí)現(xiàn)一遍,基本上就搞定了,前期很難理解的東西基本沒(méi)有
    2018-07-07
  • 這種sql寫(xiě)法真的會(huì)導(dǎo)致索引失效嗎

    這種sql寫(xiě)法真的會(huì)導(dǎo)致索引失效嗎

    這篇文章主要給大家介紹了關(guān)于網(wǎng)上流傳的某種sql寫(xiě)法會(huì)導(dǎo)致索引失效的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用sql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問(wèn)題的方法

    解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問(wèn)題的方法

    這篇文章主要為大家詳細(xì)介紹了解決MySQL安裝重裝時(shí)出現(xiàn)could not start the service mysql error:0問(wèn)題的方法,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MySQL Aborted connection告警日志的分析

    MySQL Aborted connection告警日志的分析

    這篇文章主要介紹了MySQL Aborted connection告警日志的分析,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論