DML無鎖資料變更可以將單個SQL拆分成多個批次執行,能更好地滿足業務方對大量資料變更的需求,例如歷史資料清理、全表更新欄位等,保證執行效率,減小對資料庫效能、資料庫空間等的影響。
背景資訊
當業務累積了大量資料時,需要定期清除表中的資料,或對線上資料和歷史資料進行分隔管理。您可能會遇到以下問題:
單條SQL影響行數過多,日誌超過閾值導致任務執行失敗。
SQL沒有使用索引導致鎖表,資料庫負載增加,甚至造成業務故障。
此類問題通常可通過分批執行的方法解決,但是仍存在風險,例如:
研發寫程式分批處理:
分批方式不當,例如直接用
LIMIT
進行分批,可能仍會鎖表。分批執行的頻率沒有控制好,會造成主備延遲過大。
DBA提取目標資料手動拆分:
人工拆分非常繁瑣,工作量大,且易出錯,並且很難進行動態調整。
為解決上述問題,DMS提供了DML無鎖變更。具體操作,請參見DML無鎖變更。
適用情境
歷史資料清理
全表更新欄位
支援的資料庫類型
MySQL:RDS MySQL、PolarDB MySQL版、MyBase MySQL、PolarDB分布式版、其他來源MySQL
PostgreSQL:RDS PostgreSQL、PolarDB PostgreSQL版、MyBase PostgreSQL、其他來源PostgreSQL
MariaDB:RDS MariaDB、其他來源MariaDB
OceanBase MySQL模式
PolarDB PostgreSQL版(相容Oracle)
功能特點
不會影響業務。
減少資料變更對資料庫效能、資料庫空間等的影響。
能更好地滿足業務方對大量資料變更的需求,保證資料變更的執行效率。
主要原理
分批執行單個SQL:強大的DMS引擎將單個SQL拆分成多個批次執行。
每個批次執行後有Sleep(暫停)進行緩衝。
使用限制
當前僅支援UPDATE、DELETE、INSERT_SELECT類型的SQL。若需要使用其他類型的SQL,您可提交普通資料變更工單。具體操作,請參見普通資料變更。
SQL類型 | 限制項 |
UPDATE、DELETE |
|
INSERT_SELECT |
|