type
status
date
slug
summary
tags
category
icon
password
MySQL DDL 的三種 ALGORITHM
COPY:DDL時會生成臨時表,將原數據COPY到臨時表中,通常不允許併發DML。
INPLACE:DDL時不會有COPY的動作,僅會在準備和執行階段加上exclusive metadata lock,通常允許併發DML。
INSTANT(8.0.12):只能修改data dictionary的資料,不會加上任何鎖也不影響數據,因此操作會立即完成,並允許併發DML。
MySQL DDL 的三種 LOCK
NONE:可讀寫。
SHARED:可讀不可寫。
EXCLUSIVE:不可讀寫。
通常以上參數皆不需要調整,
MySQL會選擇最優的方案(DEFAULT)。 步驟
Initialization(初始化):在此階段會添加Shared Metadata Lock來保護當前的 Table Definition,並根據判斷ALGORITHM和LOCK來確定執行方式。
Execution(執行)
Commit Table Definition(提交表定義):將鎖升級為Exclusive Metadata Lock,並提交新的 Table Definition。
相關參數
- innodb_online_alter_log_max_size

Online DDL操作期間的DML操作都會被記錄在temporary log files中,該log每次以innodb_sort_buffer_size為單位擴展最大到innodb_online_alter_log_max_size。
- 如果在
DDL期間該log超過此限制,將導致Online DDL失敗,並且會RollBack當下未Commit DML語句。
- 若該參數設定較大時,可以允許更多的
DML操作,但同時鎖表應用log時需要花更多的時間。
常用操作 (1)
說明
- 如果
In Place=NO,那麼基本上就是走COPY算法,期間將無法修改資料
→ 建議
停機維護 、 MS切換、 gh-ost、 pt-osc。- 如果
In Place=YES,不論是否有重建表都允許DML,但innodb_online_alter_log_max_size的配置需要注意,不夠大可能導致DDL失敗,同時QPS也會受到影響,如果有重建表還要小心卡在MetaData Lock。 → 建議停機維護、MS切換、gh-ost、pt-osc、MySQL Online DDL(慎用、有重建表不使用)。
- 如果
只修改MetaData或INSTANT,那表示只修改MetaData,DDL速度也會很快,不影響DML。
→ 建議直接使用
MySQL Online DDL。