任何DDL操作,執(zhí)行者都需要預(yù)先測(cè)試或者清晰了解這個(gè)操作會(huì)給數(shù)據(jù)庫(kù)帶來(lái)的影響是否是在業(yè)務(wù)期間數(shù)據(jù)庫(kù)的可承受范圍內(nèi),尤其是對(duì)大表的DDL操作中,需要密切留意服務(wù)器的IO,內(nèi)存及CPU使用情況(每個(gè)DBA總有那么一段被大表的DDL語(yǔ)句坑到的血淚史)。

 



 

    如果轉(zhuǎn)載,請(qǐng)注明博文來(lái)源: www.cnblogs.com/xinysu/   ,版權(quán)歸 博客園 蘇家小蘿卜 所有。望各位支持!

  



回到頂部(go to top)

1 早期DDL實(shí)現(xiàn)原理(5.6.7之前 

    Innodb早期支持通過(guò)copy table跟inplace的方式來(lái)執(zhí)行DDL語(yǔ)句,其原理如下:

  • copy table方式

    • 新建跟原表格一致的臨時(shí)表,并在該臨時(shí)表上執(zhí)行DDL語(yǔ)句

    • 鎖原表,不允許DML,允許查詢

    • 逐行數(shù)據(jù)從原表拷貝到臨時(shí)表中(這個(gè)過(guò)程是沒(méi)有排序的)

    • 拷貝結(jié)束后,原表禁止讀操作,也就是原表此時(shí)不提供讀寫(xiě)服務(wù)

    • 進(jìn)行rename操作,完成DDL過(guò)程

  • inplace方式(fast index creation,僅針對(duì)索引的創(chuàng)建跟刪除)

    • 新建frm臨時(shí)文件

    • 鎖原表,不允許DML,允許查詢

    • 按照聚集索引的順序,查詢數(shù)據(jù),找到需要的索引列數(shù)據(jù),排序后插入到新的索引頁(yè)中

    • 原表禁止讀操作,也就是原表此時(shí)不提供讀寫(xiě)服務(wù)

    • 進(jìn)行rename操作,替換frm文件,完成DDL過(guò)程

    inplace在copy table的基礎(chǔ)上做了一個(gè)較大的改進(jìn),則是不需要copy整個(gè)表格,只需要在原來(lái)的ibd文件上,新建所需要的索引頁(yè),這個(gè)過(guò)程比copy table節(jié)約極大的IO