type
status
date
slug
summary
tags
category
icon
password
MySQL DDL 的三種 ALGORITHM
  1. COPY:DDL時會生成臨時表,將原數據 COPY 到臨時表中,通常不允許併發DML。
  1. INPLACE:DDL時不會有 COPY 的動作,僅會在準備和執行階段加上 exclusive metadata lock,通常允許併發DML。
  1. INSTANT(8.0.12):只能修改 data dictionary 的資料,不會加上任何鎖也不影響數據,因此操作會立即完成,並允許併發DML。
MySQL DDL 的三種 LOCK
  1. NONE:可讀寫。
  1. SHARED:可讀不可寫。
  1. EXCLUSIVE:不可讀寫。
通常以上參數皆不需要調整, MySQL會選擇最優的方案(DEFAULT)。

步驟

  1. Initialization(初始化):在此階段會添加 Shared Metadata Lock 來保護當前的 Table Definition,並根據判斷 ALGORITHMLOCK 來確定執行方式。
  1. Execution(執行)
  1. Commit Table Definition(提交表定義):將鎖升級為 Exclusive Metadata Lock,並提交新的 Table Definition。

相關參數

  • innodb_online_alter_log_max_size
notion image
  1. Online DDL 操作期間的 DML 操作都會被記錄在 temporary log files中,該 log 每次以 innodb_sort_buffer_size 為單位擴展最大到innodb_online_alter_log_max_size
  1. 如果在 DDL 期間該 log 超過此限制,將導致 Online DDL失敗,並且會 RollBack 當下 未Commit DML語句
  1. 若該參數設定較大時,可以允許更多的 DML操作,但同時鎖表應用 log 時需要花更多的時間。
常用操作 (1)
操作
INSTANT
In Place
重建表
併發DML
只修改MetaData
備註
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
若該欄位 auto_increment則不允許併發DML
INSTANT
In Place
重建表
併發DML
只修改MetaData
1. 8.0.29 之前只能添加在最後一列 2. 不能新增 auto_incerement 欄位 3. table 不能有 fulltext index 4. 不能添加到 temporary table 5. TABLE ROW_FORMAT 不能為 COMPRESSED
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
1.不能縮減 2.範圍不需為 0~255256~
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
只修改Memory中的值,而不是在 data file 中
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
INSTANT
In Place
重建表
併發DML
只修改MetaData
 

說明

  1. 如果 In Place=NO,那麼基本上就是走 COPY 算法,期間將無法修改資料
    1. → 建議 停機維護MS切換gh-ostpt-osc
  1. 如果 In Place=YES,不論是否有 重建表都允許 DML,但 innodb_online_alter_log_max_size 的配置需要注意,不夠大可能導致 DDL失敗,同時 QPS也會受到影響,如果有 重建表 還要小心卡在 MetaData Lock。 → 建議 停機維護MS切換gh-ostpt-oscMySQL Online DDL(慎用、有重建表不使用)
  1. 如果 只修改MetaDataINSTANT,那表示只修改 MetaData,DDL速度也會很快,不影響DML。
    1. → 建議直接使用 MySQL Online DDL
 

查看 DDL 進度