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)
操作
INSTANT
In Place
重建表
併發DML
只修改MetaData
備註
INSTANT
In Place
重建表
併發DML
只修改MetaData
1. 8.0.29 之前只能添加在最後一列
2. 不能新增
auto_incerement
欄位
3. table 不能有 fulltext index
4. 不能添加到 temporary table
5. TABLE ROW_FORMAT 不能為 COMPRESSED
說明
- 如果
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
。