任何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)歸 博客園 蘇家小蘿卜 所有。望各位支持!
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