DDL無鎖變更能夠有效解決結構變更時鎖表的問題,較好地規避了因鎖表導致業務阻塞的問題、避免了資料庫原生Online DDL帶來的主備延遲現象。您可在業務低峰期提交無鎖變更。
背景資訊
在資料量大的情況下進行結構變更,需要考慮鎖表的風險,鎖表將導致業務無法正常寫入。MySQL原生能力:
MySQL 5.5及之前的版本,DDL提供了Table-Copy和In-Place兩種執行演算法:
Table-Copy:通過拷貝暫存資料表完成變更,變更期間表被鎖定不可寫入。
In-Place(從MySQL5.5開始提供):該演算法執行期間資料庫可以進行讀寫,但僅支援索引資料。
MySQL 5.6及後續的版本,DDL還提供了Innodb-OnlineDDL。關於Innodb-OnlineDDL,請參見Innodb-OnlineDDL。
可以覆蓋大範圍的DDL類型(如,添加列、刪除列、列名修改、添加索引、修改索引等),但仍然有些常見的DDL類型(如,修改列的類型、修改列的長度、修改字元集等)無法覆蓋。
適用情境
變更資料庫表結構。
變更表的字元集和校正集、調整時區等。
規避Optimize Table操作回收資料表空間、降低片段率引起的鎖表。具體操作,請參見無鎖結構變更回收片段空間。
支援的資料庫類型
RDS MySQL、PolarDB MySQL版、MyBase MySQL、其他來源MySQL。
功能特點
相比較資料庫原生,DMS無鎖結構變更支援控制變更的執行速率,可避免資料庫主備鏈路延遲,對資料庫效能影響更小,並支援多種原生OnlineDDL執行時會鎖表的情境。
相比較PT-Online、OSC等其它工具,DMS無鎖結構變更不依賴於觸發器,且非同步執行時對資料庫的影響非常小,可隨時安全中斷。
DMS無鎖結構變更與DTS同步工具相容性好,變更的表中如有DTS表層級的複製鏈路,使用DMS無鎖結構變更不會導致DTS複製中斷。
說明必須在2020年2月14日後重啟過DTS複製鏈路。
MySQL原生OnlineDDL與DMS無鎖結構變更能力對比:
支援項
MySQL5.5及以前版本
MySQL5.6及後續版本
DMS無鎖結構變更
添加列
N
Y
Y
刪除列
N
Y
Y
列名修改
N
Y
Y
添加索引
N
Y
Y
修改索引
N
Y
Y
磁碟重組操作
N
Y
Y
修改列的類型
N
N
Y
修改列的長度
N
N
Y
修改字元集
N
N
Y
轉換字元
N
N
Y
時區修正操作
N
N
Y
緩解或消除備庫延遲
N
N
Y
N:不支援。
Y:支援
DMS無鎖結構變更與其他變更方案對比資訊,請參見無鎖結構變更方案對比。
注意事項
DMS支援對已有分區表的表進行結構變更。
無鎖結構變更支援在同一變更工單中,對同一資料庫下的多張表進行變更。
在配置工單的變更SQL時,不同表SQL可使用英文分號(;)隔開。
當表(只有主鍵或唯一鍵)進行無鎖表結構變更時,不允許更新主鍵和唯一鍵,否則會導致變更任務失敗。
主要原理
建立暫存資料表:CREATE TABLE tmp_table_name LIKE table_name。
變更暫存資料表結構: ALTER TABLE tmp_table_name XXXX。
全量拷貝資料:INSERT IGNORE INTO tmp_table_name (SELECT %s FROM table_name FORCE INDEX (%s) WHERE xxx。
增量資料Binlog同步: UPDATE/INSERT/DELETE tmp_table_name。
切換新舊錶: RENAME TABLE table_name to old_tmp_table_name, tmp_table_name to table_name。
DMS產生的暫存資料表名規則:
資料表:tp_{變更ID}_ogt_{原表名}、tp_{變更ID}_g_{原表名}
心跳錶:tp_{變更ID}_ogl_{原表名}、tp_{變更ID}_l_{原表名}
切換前的輔助表、切換後的原表:tp_{變更ID}_del_{原表名}、tp_{變更ID}_d_{原表名}
探測是否鎖表: tpa_xxx_xxx
變更ID是DMS內部引擎的執行ID,不是工單號和任務號。
相關文檔
在您瞭解了無鎖結構變更的背景、原理等資訊後,您可以進行如下操作:
給執行個體開啟無鎖結構變更功能。具體操作,請參見開啟無鎖結構變更。
提交無鎖結構變更工單。具體操作,請參見通過無鎖變更工單實現無鎖結構變更。
(可選)查看無鎖變更任務的進度。具體操作,請參見查看無鎖變更進度。
您也可以通過API來配置和管理無鎖結構變更工單:
API
說明
該介面用於建立無鎖變更工單。
該介面用於擷取無鎖變更工單的任務詳情,包含任務的執行情況、影響的資料行數。
常見問題
Q:無鎖結構變更對業務有影響嗎?
A:正常情況下不影響您的業務。由於變更過程涉及資料拷貝,會對執行個體效能產生一定影響。
Q:通過無鎖變更工單執行CREATE_INDEX添加索引報錯了,是DMS不支援添加索引嗎?
A:DMS支援添加索引。您可嘗試換一種添加索引的方式,例如
ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) ;