mysql 5.6 在線DDL
阿新 • • 發佈:2017-10-27
mysql 在線ddl
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類型需要)
降級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文件
變更完成
mysql 5.6 在線DDL