使用 NineData OnlineDDL 对表结构进行无锁变更

NineData 的 SQL 任务支持 NineData OnlineDDL 功能,该功能可以在不阻塞表正常读写的情况下,对该表执行结构变更。

功能说明

传统的 DDL 语句(例如 ALTER TABLE)需要在锁定表的情况下执行,锁定期间会阻止对表的任何其他修改,这可能会导致阻塞时间过长,影响应用程序的运行。

NineData 的 SQL 任务支持 NineData OnlineDDL 功能,该功能的实现流程如下:

  1. 创建一个与源表结构相同的新表,并在该表上执行表结构变更。

  2. 在变更期间,源表中的增量数据会实时同步到新表。

  3. 将源表中的全量数据拷贝到新表。

  4. 在新表数据追平源表后,后台会自动选择一个最佳时机,将业务从源表切换到新表。

上述流程可以确保在不锁表的情况下完成表结构变更,并且不会对应用程序的运行产生负面影响。

前提条件

  • 已创建或加入组织。更多信息,请参见管理组织。

  • NineData 控制台处于组织模式。如何从个人模式切换组织模式,请参见切换到组织。

  • 您的角色为系统管理员。更多关于角色的信息,请参见角色。

  • 数据源类型为 MySQL。

注意事项

NineData OnlineDDL 的新旧表业务切换可能会导致业务秒级闪断,请尽量在业务低峰期执行表结构变更 SQL 任务。

操作步骤

OnlineDDL 在 NineData 提供的 SQL 规范中默认开启,仅需根据实际业务场景更改规范的执行策略,并将该规范关联到目标数据源即可生效,本文介绍如何更改 OnlineDDL 的执行策略。

  1. 登录 NineData 控制台。
  2. 在左侧导航栏,单击数据源管理>规范与流程。
  3. 在规范与流程页面,单击 SQL 开发规范页签。
  4. 单击目标规范名称,或单击其右侧操作列的详情。
  5. 在 SQL 开发规范详情页面,单击 SQL 任务与窗口页签,找到 OnlineDDL 配置,并单击其右侧操作列的编辑。

    提示:请确保 OnlineDDL 配置处于开启状态,即状态列的开关已开启。

  6. 配置 Online DDL 的执行策略,各主要参数的说明请参见下表。

    提示:完成新旧表业务切换后(即对应 SQL 任务的状态变更为执行成功),NineData OnlineDDL 会将旧表命名为 _<表名>_<时间>_del,其中时间为新表被创建时的时间,包含了年月日时分秒。如果您在 OnlineDDL 配置规范中配置了不清理(临时表在源库中需要手工清理),则还需要手动删除该名称的表。

    例如:你使用 NineData OnlineDDL 对名为 t1 的表执行了不锁表结构变更,则新旧表业务切换完成后,数据库中会多出一个名为 _t1_20230209173740_del(示例)的表,如果您没有其他命名规则相似的表,则可以放心删除该表。

  7. 单击确定。

效果展示

完成 OnlineDDL 的规则配置后,对配置了该策略的数据源提交包含 DDL 语句的 SQL 任务,系统会在规范预检阶段自动检测该 DDL 语句是否支持 MySQL OnlineDDL,如果不支持,则会启用 NineData OnlineDDL 进行无锁表结构变更。