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