使用 NineData OnlineDDL 对表结构进行无锁变更
NineData 的 SQL 任务支持 NineData OnlineDDL 功能,该功能可以在不阻塞表正常读写的情况下,对该表执行结构变更。
功能说明
传统的 DDL 语句(例如 ALTER TABLE)需要在锁定表的情况下执行,锁定期间会阻止对表的任何其他修改,这可能会导致阻塞时间过长,影响应用程序的运行。
NineData 的 SQL 任务支持 NineData OnlineDDL 功能,该功能的实现流程如下:
-
创建一个与源表结构相同的新表,并在该表上执行表结构变更。
-
在变更期间,源表中的增量数据会实时同步到新表。
-
将源表中的全量数据拷贝到新表。
-
在新表数据追平源表后,后台会自动选择一个最佳时机,将业务从源表切换到新表。
上述流程可以确保在不锁表的情况下完成表结构变更,并且不会对应用程序的运行产生负面影响。
前提条件
-
已创建或加入组织。更多信息,请参见管理组织。
-
NineData 控制台处于组织模式。如何从个人模式切换组织模式,请参见切换到组织。
-
您的角色为系统管理员。更多关于角色的信息,请参见角色。
-
数据源类型为 MySQL。
注意事项
NineData OnlineDDL 的新旧表业务切换可能会导致业务秒级闪断,请尽量在业务低峰期执行表结构变更 SQL 任务。
操作步骤
OnlineDDL 在 NineData 提供的 SQL 规范中默认开启,仅需根据实际业务场景更改规范的执行策略,并将该规范关联到目标数据源即可生效,本文介绍如何更改 OnlineDDL 的执行策略。
-
登录 NineData 控制台。 -
在左侧导航栏,单击数据源管理>规范与流程。 -
在规范与流程页面,单击 SQL 开发规范页签。 -
单击目标规范名称,或单击其右侧操作列的详情。 -
在 SQL 开发规范详情页面,单击 SQL 任务与窗口页签,找到 OnlineDDL 配置,并单击其右侧操作列的编辑。 提示:请确保 OnlineDDL 配置处于开启状态,即状态列的开关已开启。
-
配置 Online DDL 的执行策略,各主要参数的说明请参见下表。
提示:完成新旧表业务切换后(即对应 SQL 任务的状态变更为执行成功),NineData OnlineDDL 会将旧表命名为 _<表名>_<时间>_del,其中时间为新表被创建时的时间,包含了年月日时分秒。如果您在 OnlineDDL 配置规范中配置了不清理(临时表在源库中需要手工清理),则还需要手动删除该名称的表。
例如:你使用 NineData OnlineDDL 对名为 t1 的表执行了不锁表结构变更,则新旧表业务切换完成后,数据库中会多出一个名为 _t1_20230209173740_del(示例)的表,如果您没有其他命名规则相似的表,则可以放心删除该表。
-
单击确定。
效果展示
完成 OnlineDDL 的规则配置后,对配置了该策略的数据源提交包含 DDL 语句的 SQL 任务,系统会在规范预检阶段自动检测该 DDL 语句是否支持 MySQL OnlineDDL,如果不支持,则会启用 NineData OnlineDDL 进行无锁表结构变更。