使用 NineData OnlineDML 将大数据量变更分批执行
NineData 的 SQL 任务支持 OnlineDML 功能,在对数据源做大数据量变更的情况下,该功能可以自动将变更拆成多个语句分批执行,避免大量数据变更引起的表阻塞,影响业务。
背景信息
在线系统常常面临各种紧急情况,尤其是在故障发生时,可能需要迅速应对大规模数据的更新和删除需求。这些需求通常不具备适当的索引,而且为了一次性操作而建立索引又显得不切实际。因此,我们常采用存储过程或编写临时代码等方式,以分批处理这些庞大的数据集,以避免对系统性能造成过大影响。
然而,这种处理方式并非始终灵活和通用。在应对不同类型的数据更新需求时,我们可能需要更具弹性的方法。这时,无锁数据变更成为一种备选方案,它通过无锁方式实现数据更新,提高了系统的并发性能。
实际操作中,我们采用了分批扫描和分片变更的策略,确保在不影响在线业务正常访问的前提下,实现大规模数据的更新。这种方法不仅高效,还能够应对不同场景下的数据更新需求,为系统维护提供了更多灵活性。
前提条件
- 您的角色为。更多关于角色的信息,请参见角色。
- 数据源类型为 MySQL、PostgreSQL。
注意事项
如下情况不支持 OnlineDML 功能。
- 执行变更的 DML 语句中包含
ORDER BY
、GROUP BY
、LIMIT
,或包含针对多表的操作。 INSERT INTO SELECT
语句的SELECT
子句中存在多表JOIN
。- 目标表中不存在主键|唯一键,或对应的主键|唯一键列不带 NOT NULL 属性。
UPDATE
语句变更的对象为主键|唯一键列。
操作步骤
OnlineDML 相关的规则在 NineData 提供的 SQL 规范中默认开启,您需要根据实际业务场景更改规范的执行策略,并将该规范关联到目标数据源即可生效,本文介绍如何更改 OnlineDML 的执行策略。
登录 NineData 控制台。
在左侧导航栏,单击>。
在页面,单击 页签。
单击目标,或单击其右侧列的。
在 页面,单击 页签,找到,并单击其右侧列的。
提示请确保 处于开启状态,即列的开关已开启。
配置 Online DML 的执行策略,各主要参数的说明请参见下表。
参数 说明 设置 DML 语句的扫描行数阈值,即当前 DML 语句需要扫描的行数。默认为 20000
,超过该阈值,说明当前 DML 语句存在变更风险。开启 OnlineDML 功能后,当扫描行数超过该阈值时,SQL 语句会自动分批执行,避免锁表影响业务。OnlineDML 功能开关,默认关闭,开启后,当 DML 语句扫描的行数超过阈值,则系统自动将该 DML 语句分批执行。 设置 OnlineDML 每个批次的变更行数,默认为 2000
。配置 OnlineDML 的等待时间,单位为秒,默认不启用。当 OnlineDML 执行超过一定批次,或者系统检测到数据库的压力过大时,将自动停止写入,等待一段时间,即您配置的等待时间。 单击。
执行方式
完成 OnlineDML 的规则配置后,对配置了该策略的数据源提交包含 DML 语句的 SQL 任务,系统会在规范预检阶段自动检测该 DML 语句的扫描行数,如果超出您设置的阈值,则会启用 NineData OnlineDML 进行分批执行。