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