最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mysql Online DDL的使用詳解

 更新時(shí)間:2021年05月20日 11:32:44   作者:xmebcc  
在日常DBA運(yùn)維過程中,對(duì)表結(jié)構(gòu)進(jìn)行變更算是個(gè)普遍的需求了。如果操作的對(duì)象是個(gè)熱表、大表,難免心里一怵,這些DDL操作是否可以直接執(zhí)行,哪些會(huì)影響線上讀寫,哪些會(huì)影響主從,甚至導(dǎo)致服務(wù)器壓力驟升,本文做了梳理,希望對(duì)大家有所幫助。

正文

Online DDL在MySQL 5.6才開始支持的,在5.5及之前版本,使用alter table/create index等命令進(jìn)行表結(jié)構(gòu)修改操作均會(huì)鎖表,這在生產(chǎn)環(huán)境上明顯是不可接受的。

在MySQL 5.7,Online DDL在性能和穩(wěn)定性上不斷得到優(yōu)化,性能有顯著優(yōu)勢(shì),且對(duì)業(yè)務(wù)負(fù)載影響小,停寫時(shí)間可控,相對(duì)pt-osc/gh-ost來(lái)說,無(wú)需安裝第三方依賴包,同時(shí)支持Inplace算法的Online DDL,由于無(wú)需拷表,所需磁盤空間也更小。

先來(lái)看一個(gè)常見的DDL語(yǔ)句:

ALTER TABLE tbl_name ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;

其中,LOCK描述了DDL期間運(yùn)行的并發(fā)程度,ALGORITHM描述了DDL的實(shí)現(xiàn)方式

LOCK參數(shù)

  1. LOCK=NONE:允許并發(fā)的查詢和DML操作
  2. LOCK=SHARED:允許并發(fā)的查詢,但阻塞DML操作
  3. LOCK=DEFAULT: 由系統(tǒng)決定,允許盡可能多的并發(fā)性(并發(fā)查詢、DML或兩者)。如果省略LOCK子句相當(dāng)于指定LOCK=DEFAULT
  4. LOCK=EXCLUSIVE:阻塞并發(fā)查詢和DML操作。

ALGORITHM參數(shù)

  1. ALGORITHM=COPY:采用拷表方式進(jìn)行表變更,與pt-osc/gh-ost類似;
  2. ALGORITHM=INPLACE:僅需要進(jìn)行引擎層數(shù)據(jù)改動(dòng),不涉及Server層;

COPY TABLE流程

  1. 首先建立臨時(shí)表,表結(jié)構(gòu)為ALTAR TABLE更改后的結(jié)構(gòu)
  2. 將原表中數(shù)據(jù)導(dǎo)入到臨時(shí)表(server層創(chuàng)建臨時(shí)表,會(huì)有顯示的IBD文件)
  3. 刪除原表
  4. 將臨時(shí)表rename為原來(lái)的表名

同時(shí)這一過程中,為了保持?jǐn)?shù)據(jù)的一致性,中間復(fù)制數(shù)據(jù)時(shí)(Copy Table)全程鎖表只讀,如果有寫請(qǐng)求進(jìn)來(lái)將無(wú)法提供服務(wù),將導(dǎo)致連接數(shù)爆張。

IN-PLACE流程

  1. 建立一個(gè)臨時(shí)文件,掃描原表主鍵的所有數(shù)據(jù)頁(yè)
  2. 用數(shù)據(jù)頁(yè)中原表記錄生成B+樹,存儲(chǔ)到臨時(shí)文件中(innodb_temp_data_file_path臨時(shí)表空間下創(chuàng)建臨時(shí)文件)
  3. 生成臨時(shí)文件的過程中,將所有對(duì)原表的操作記在一個(gè)日志文件(rowlog)中
  4. 臨時(shí)文件生成后,將日志文件中的操作應(yīng)用到臨時(shí)文件,得到一個(gè)輯數(shù)據(jù)上與原表相同
  5. 數(shù)據(jù)文件(日志文件記錄和重放操作)
  6. 用臨時(shí)文件替換原表數(shù)據(jù)文件

這一過程中,alter 語(yǔ)句在啟動(dòng)的時(shí)候獲取MDL寫鎖,但是這個(gè)寫鎖在真正拷貝數(shù)據(jù)之前就退化成讀鎖,也就是說在最耗時(shí)的copy數(shù)據(jù)到臨時(shí)文件的過程中,原表是可以進(jìn)行dml操作的,僅僅會(huì)在最后的新舊表切換階段加鎖,這個(gè)rename的時(shí)間就非??炝?。

允許并發(fā)DML的DDL操作

  • 創(chuàng)建/新增二級(jí)索引
  • 重命名二級(jí)索引
  • 刪除二級(jí)索引
  • 改變索引類型(USING {BTREE | HASH})
  • 添加主鍵(expensive cost)
  • 刪除主鍵并增加另一個(gè)(expensive cost)(ALTER TABLE tbl_name DROP PRIMARY KEY, ADD PRIMARY KEY (column), ALGORITHM=INPLACE, LOCK=NONE;)
  • 新增列 (expensive cost)
  • 刪除列 (expensive cost)
  • 重命名列
  • 列重新排序 (expensive cost)
  • 改變列默認(rèn)值
  • 刪除列默認(rèn)值
  • 改變列自增值
  • 設(shè)置列屬性null/not null (expensive cost)
  • 修改枚舉或集合列的定義
  • Change ROW_FORMAT
  • Change key block size

標(biāo)記為expensive cost的操作雖然允許OnlineDDL,但本身對(duì)服務(wù)器IO,CPU都會(huì)造成較高負(fù)擔(dān),同時(shí)會(huì)導(dǎo)致復(fù)制阻塞,造成另一種形式的從庫(kù)復(fù)制延遲,所以如果是大表,建議業(yè)務(wù)低峰期執(zhí)行

不允許并發(fā)DML的DDL操作

  • 添加全文索引
  • 添加空間索引
  • 刪除主鍵
  • 改變列數(shù)據(jù)類型
  • 添加自增列(新增列->變?yōu)樽栽隽校?/li>
  • 變更表字符集
  • 修改數(shù)據(jù)類型長(zhǎng)度
    • 特例:varchar字符長(zhǎng)度從10變更到小于255 采用inplace方式不會(huì)鎖表;從255變更到10會(huì)鎖表;

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

相關(guān)文章

  • MySQL數(shù)據(jù)表字段操作指南之添加、修改與刪除方法

    MySQL數(shù)據(jù)表字段操作指南之添加、修改與刪除方法

    這篇文章主要介紹了MySQL中使用ALTER TABLE語(yǔ)句修改數(shù)據(jù)表結(jié)構(gòu)的方法,包括添加、修改和刪除字段,通過實(shí)例演示了如何高效地管理數(shù)據(jù)表結(jié)構(gòu),需要的朋友可以參考下
    2024-12-12
  • MYSQL刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法

    MYSQL刪除重復(fù)數(shù)據(jù)的簡(jiǎn)單方法

    業(yè)務(wù)中遇到要從表里刪除重復(fù)數(shù)據(jù)的需求,使用了下面的方法,執(zhí)行成功,大家可以參考使用
    2013-11-11
  • sql查詢語(yǔ)句之平均分、最高最低分及排序語(yǔ)句

    sql查詢語(yǔ)句之平均分、最高最低分及排序語(yǔ)句

    最近工作中遇到個(gè)需求,需要查詢每門課程的平均成績(jī),結(jié)果按平均成績(jī)降序排列,平均成績(jī)相同時(shí),按課程編號(hào)升序排列,這篇文章主要給大家介紹了關(guān)于sql查詢語(yǔ)句之平均分、最高最低分及排序語(yǔ)句的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • Mysql5 字符集編碼問題解決

    Mysql5 字符集編碼問題解決

    mysql 創(chuàng)建 數(shù)據(jù)庫(kù)時(shí)指定編碼很重要,很多開發(fā)者都使用了默認(rèn)編碼,但是我使用的經(jīng)驗(yàn)來(lái)看,制定數(shù)據(jù)庫(kù)的編碼可以很大程度上避免倒入導(dǎo)出帶來(lái)的亂碼問題。
    2009-10-10
  • MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作

    MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作

    這篇文章主要介紹了MySQL之導(dǎo)出整個(gè)及單個(gè)表數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-11-11
  • 講解MySQL中<=>操作符的用法

    講解MySQL中<=>操作符的用法

    這篇文章主要介紹了講解MySQL中<=>操作符的用法,整理自stackoverflow的相關(guān)實(shí)際問題,需要的朋友可以參考下
    2015-04-04
  • mysql5.7版本root密碼登錄問題的解決方法

    mysql5.7版本root密碼登錄問題的解決方法

    這篇文章主要為大家詳細(xì)介紹了mysql5.7版本root密碼登錄問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • WINDOWS下安裝MYSQL教程詳解

    WINDOWS下安裝MYSQL教程詳解

    這篇文章主要介紹了WINDOWS下安裝MYSQL教程,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • MySQL分區(qū)表的基本入門教程

    MySQL分區(qū)表的基本入門教程

    這篇文章主要給大家介紹了關(guān)于MySQL分區(qū)表的基本入門教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • MySQL InnoDB MRR優(yōu)化指南

    MySQL InnoDB MRR優(yōu)化指南

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB MRR優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08

最新評(píng)論

博乐市| 遂溪县| 池州市| 出国| 会东县| 大荔县| 龙里县| 武定县| 同德县| 乳源| 墨竹工卡县| 黑河市| 奉贤区| 太仓市| 彰化市| 疏勒县| 万宁市| 南乐县| 牙克石市| 镇雄县| 钟祥市| 自贡市| 铁力市| 元谋县| 贡山| 兰溪市| 宜君县| 灌南县| 新龙县| 镇江市| 邵东县| 宜都市| 乌拉特后旗| 陆良县| 读书| 濉溪县| 梁山县| 万州区| 中方县| 广德县| 青田县|