您好,登錄后才能下訂單哦!
online ddl主要包括3個階段,prepare階段,ddl執行階段,commit階段,rebuild方式比no-rebuild方式實質多了一個ddl執行階段,prepare階段和commit階段類似。下面將主要介紹ddl執行過程中三個階段的流程。
Prepare階段:
創建新的臨時frm文件(與InnoDB無關)
持有EXCLUSIVE-MDL鎖,禁止讀寫
根據alter類型,確定執行方式(copy,online-rebuild,online-norebuild)
假如是Add Index,則選擇online-norebuild即INPLACE方式
更新數據字典的內存對象
分配row_log對象記錄增量(僅rebuild類型需要)
生成新的臨時ibd文件(僅rebuild類型需要)
ddl執行階段:
降級EXCLUSIVE-MDL鎖,允許讀寫
掃描old_table的聚集索引每一條記錄rec
遍歷新表的聚集索引和二級索引,逐一處理
根據rec構造對應的索引項
將構造索引項插入sort_buffer塊排序
將sort_buffer塊更新到新的索引上
記錄ddl執行過程中產生的增量(僅rebuild類型需要)
重放row_log中的操作到新索引上(no-rebuild數據是在原表上更新的)
重放row_log間產生dml操作append到row_log最后一個Block
commit階段:
當前Block為row_log最后一個時,禁止讀寫,升級到EXCLUSIVE-MDL鎖
重做row_log中最后一部分增量
更新innodb的數據字典表
提交事務(刷事務的redo日志)
修改統計信息
rename臨時idb文件,frm文件
變更完成
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。