mysql 5.6 在線DDL

online ddl主要包括3個階段,prepare階段,ddl執行階段,commit階段,rebuild方式比no-rebuild方式實質多了一個ddl執行階段,prepare階段和commit階段類似。下面將主要介紹ddl執行過程中三個階段的流程。

  • Prepare階段:

  1. 創建新的臨時frm文件(與InnoDB無關)

  2. 持有EXCLUSIVE-MDL鎖,禁止讀寫

  3. 根據alter類型,確定執行方式(copy,online-rebuild,online-norebuild)
    假如是Add Index,則選擇online-norebuild即INPLACE方式

  4. 更新數據字典的內存對象

  5. 分配row_log對象記錄增量(僅rebuild類型需要)

  6. 生成新的臨時ibd文件(僅rebuild類型需要)

ddl執行階段:

  1. 降級EXCLUSIVE-MDL鎖,允許讀寫

  2. 掃描old_table的聚集索引每一條記錄rec

  3. 遍歷新表的聚集索引和二級索引,逐一處理

  4. 根據rec構造對應的索引項

  5. 將構造索引項插入sort_buffer塊排序

  6. 將sort_buffer塊更新到新的索引上

  7. 記錄ddl執行過程中產生的增量(僅rebuild類型需要)

  8. 重放row_log中的操作到新索引上(no-rebuild數據是在原表上更新的)

  9. 重放row_log間產生dml操作append到row_log最後一個Block

  • commit階段:

  1. 當前Block爲row_log最後一個時,禁止讀寫,升級到EXCLUSIVE-MDL鎖

  2. 重做row_log中最後一部分增量

  3. 更新innodb的數據字典表

  4. 提交事務(刷事務的redo日誌)

  5. 修改統計信息

  6. rename臨時idb文件,frm文件

  7. 變更完成


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章