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)
 

說明

  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 進度