使用 DBSC OnlineDDL 对表结构进行无锁变更
DBSC 的 SQL 任务支持 OnlineDDL 功能,该功能可以在不阻塞表正常读写的情况下,对该表执行结构变更。
功能说明
传统的 DDL 语句(例如 ALTER TABLE)需要在锁定表的情况下执行,锁定期间会阻止对表的任何其他修改,这可能会导致阻塞时间过长,影响应用程序的运行。
DBSC 的 SQL 任务支持 OnlineDDL 功能,该功能的实现流程如下:
- 创建一个与源表结构相同的新表,并在该表上执行表结构变更。
- 在变更期间,源表中的增量数据会实时同步到新表。
- 将源表中的全量数据拷贝到新表。
- 在新表数据追平源表后,后台会自动选择一个最佳时机,将业务从源表切换到新表。
上述流程可以确保在不锁表的情况下完成表结构变更,并且不会对应用程序的运行产生负面影响。
前提条件
- 实例已开启开启企业版。
- 您的角色为系统管理员。更多关于角色的信息,请参见角色。
- 数据源类型为 MySQL。
注意事项
OnlineDDL 的新旧表业务切换可能会导致业务秒级闪断,请尽量在业务低峰期执行表结构变更 SQL 任务。
操作步骤
OnlineDDL 在 DBSC 提供的 SQL 规范中默认开启,仅需根据实际业务场景更改规范的执行策略,并将该规范关联到目标数据源即可生效,本文介绍如何更改 OnlineDDL 的执行策略。
- 登录 DBSC 控制台。
- 在左侧导航栏,点击 数据开发—>规范与流程。
- 在规范与流程页面,单击 SQL 开发规范页签。
- 单击目标规范名称,或单击其右侧操作列的详情。
-
在 SQL 开发规范详情页面的结构页签中找到 OnlineDDL:大表结构变更风险检测,并单击其右侧操作列的编辑。
说明
请确保 OnlineDDL:大表结构变更风险检测处于开启状态,即状态列的开关已开启。
-
配置 Online DDL 的执行策略,各主要参数的说明请参见下表。
参数 说明 Online DDL 执行方式 执行 OnlineDDL 的方式。 - MySQL 直接执行:使用 MySQL 自带的 OnlineDDL 执行表结构修改。
- 自适应(优先使用 MySQL 原生 Online,不支持则使用 DBSC Online):系统预先检测目标 DDL 语句是否支持通过 MySQL 自带的 OnlineDDL 执行,如果不支持,则使用 DBSC OnlineDDL 执行;如果支持,则优先使用 MySQL 自带 OnlineDDL。
- 强制使用 DBSC OnlineDDL(多用于主备延迟敏感场景):直接使用 DBSC 的 OnlineDDL 执行。
DDL 无法 Online 执行时的策略 OnlineDDL 无法顺利完成时的策略。 - MySQL 直接执行:不通过 OnlineDDL 的方式执行表结构变更任务,转而使用通常的锁表变更。
- 退出执行:不再执行该表结构变更任务,任务结束。
DBSC OnlineDDL 临时表清理策略 使用 DBSC OnlineDDL 成功进行不锁表结构变更后,源表的清理策略。 - 直接清理:业务切换到新表之后,后台自动清理源表。
- 不清理(临时表在源库中需要手工清理):业务切换到新表之后,保留源表。选择该选项,您需要手动对源表进行清理操作。
切表锁等待超时(秒) 配置业务切换时,源表的锁定超时时间,锁表时长超过该时间则切换失败,默认 2 秒。 说明:无锁变更任务结束以后,系统将锁定源表以防止新数据写入,然后将业务从源表切换到新表,锁表时长受数据库负载影响,您可以根据实际情况配置该参数。 切表失败重试次数 无锁变更任务结束以后,源表切换到新表的失败重试次数,默认 5 次。 全量拷贝批次大小自适应 是否根据数据库的性能,动态调整每次拷贝到临时表的行数,默认开启。 全量拷贝批次大小(自定义) 手动配置每次拷贝到临时表的行数,默认 10000 行。全量拷贝批次大小自适应开启的情况下,该配置无效。 说明
完成新旧表业务切换后(即对应 SQL 任务的状态变更为执行成功),DBSC OnlineDDL 会将旧表命名为
_<表名>_<时间>_del
,其中时间为新表被创建时的时间,包含了年月日时分秒。如果您在 OnlineDDL 配置规范中配置了不清理(临时表在源库中需要手工清理),则还需要手动删除该名称的表。例如:你使用 DBSC OnlineDDL 对名为
t1
的表执行了不锁表结构变更,则新旧表业务切换完成后,数据库中会多出一个名为_t1_20230209173740_del
(示例)的表,如果您没有其他命名规则相似的表,则可以放心删除该表。 - 单击确定。
效果展示
完成 OnlineDDL 的规则配置后,对配置了该策略的数据源提交包含 DDL 语句的 SQL 任务,系统会在规范预检阶段自动检测该 DDL 语句是否支持 MySQL OnlineDDL,如果不支持,则会启用 DBSC OnlineDDL 进行无锁表结构变更。
配置OnlineDDL运行参数
当 SQL 任务通过 DBSC OnlineDDL 执行时,您可以在 SQL 任务的任务详情页面配置 OnlineDDL 的运行参数,包含切表锁等待超时、重试次数、全量策略、切表时间配置。
- 登录 DBSC 控制台。
- 在左侧导航栏,点击 数据开发—>SQL 任务。
- 在 SQL 任务页面,找到目标 SQL 任务,单击其任务 ID。
- 在任务详情页面,单击更多,然后单击 OnlineDDL 运行参数右侧的查看。
-
在弹出的页面中,单击需要配置参数右侧的 ,参数说明请参见下表。
运行参数 说明 切表锁等待超时 配置业务切换时,源表的锁定超时时间,锁表时长超过该时间则切换失败。 说明:无锁变更任务结束以后,系统将锁定源表以防止新数据写入,然后将业务从源表切换到新表,锁表时长受数据库负载影响,您可以根据实际情况配置该参数。 重试次数 无锁变更任务结束以后,源表切换到新表的失败重试次数,默认 5 次。 全量策略 配置每次拷贝到临时表的行数,默认情况下根据数据库的性能动态调整。 切表时间配置 指定业务切换的时间段,默认情况下变更完成后立刻切换,您可根据您的需求将切换时间调整为您的业务低峰期。 - 配置完成后,单击保存即可。
查看OnlineDDL运行进度
当 SQL 任务通过 DBSC OnlineDDL 执行时,您可以在 SQL 任务的任务详情页面查看 OnlineDDL 的整体运行进度。
- 登录 DBSC 控制台。
- 在左侧导航栏,点击 数据开发—>SQL 任务。
- 在 SQL 任务页面,找到目标 SQL 任务,单击其任务 ID。
- 在任务详情页面找到执行结果,然后单击详情列下的OnlineDDL 进度。
- 在OnlineDDL 进度页面,您可以查看 OnlineDDL 的运行状态,还可以配置运行参数。关于运行参数的详情,请参见配置 OnlineDDL 运行参数。