全部产品
Search
文档中心

云数据库 OceanBase:无锁结构变更

更新时间:Nov 18, 2024

为解决变更数据库表结构时的锁表问题,ODC V4.2.0 及之后的版本提供了无锁结构变更功能,该功能可以较好地规避因锁表以致于阻塞业务。本文档旨在介绍如何通过提交无锁变更工单实现数据库无锁结构变更。

背景信息

原理介绍

无锁结构变更的执行过程如下图所示:

image

  1. 创建临时表。

  2. 变更临时表结构。

  3. 全量拷贝数据。

  4. 增量数据同步。

  5. 数据一致性校验。

  6. Kill Session。

  7. 切换新旧表。

无锁结构变更工单执行流程

image

  1. 用户提交无锁结构变更工单。

  2. 对用户输入的 SQL 语句进行预检查。

  3. 审批任务流程。

  4. 执行无锁结构变更任务。

支持的变更范围

分类

操作

是否支持

备注

列操作

列类型修改

重排列(before/after/first)

转换字符集

列重命名

增加列

删除列

增加主键列

主键

增加主键

表存在非空唯一键

修改主键

表存在非空唯一键

删除主键

表存在非空唯一键

分区

删除分区

truncate 分区

重分区

非分区表改为分区表

注意事项

  • 确保数据库磁盘空间充足。

  • 表中必须存在主键或非空唯一键且表中不存在外键

  • 当前表在执行无锁结构变更同时,执行其它 DDL 操作会导致任务失败。

  • OceanBase MySQL 模式下的表名称不超过 54 个字符。

  • ODC 连接 OceanBase 社区版数据库时,数据源配置信息中需包含集群名和 SYS 租户账号。

  • 如果 OceanBase MySQL 模式版本小于 V4.3.0,ODC 通过锁定用户且关闭会话的方式避免表名切换过程中数据的写入。

  • 无锁结构变更期间,发起其它关于该表的 DDL 变更将导致任务失败。

新建无锁结构变更任务

本文以 OceanBase 社区版和企业版 OMS 为例,演示场景为将表 student 中的列 birth 类型修改为 datetime。该示例所使用的项目名称为 odc_4.2.0,数据库名称为 odc_test,表名称为 student。

  1. 在 SQL 窗口中,编辑 SQL 语句以创建表 student 到数据库 odc_test 中。

    image

  2. 工单 页签中单击 无锁结构变更 > 新建无锁结构变更

    image

  3. 新建无锁结构变更 页面中,输入以下信息。

    image

    信息项

    说明

    数据库

    选择需变更的数据库。

    锁定用户

    • 如果指定锁定用户,则表名切换之前 ODC 会锁定所指定的数据库账号,并关闭该账号对应的所有会话信息,以保障表名切换期间数据一致性的同时尽可能降低对业务的影响。

    • 如果未指定任何账号,ODC 将不会进行任何账号锁定及关闭会话操作,需自主确保切换期间数据的一致性。

    重要

    执行无锁结构变更任务期间,执行该任务的用户不可执行与无锁结构变更相关表的变更操作。

    变更定义

    • CREATE TABLE:OceanBasese 不支持的语法需要使用 CREATE 语句。

    • ALTER TABLE:OceanBasese V4.0.0 及之后的版本,ALTER TABLE OFFLINE 模式可以使用 ALTER 语句。

    SQL 内容

    在编辑区中录入 SQL 脚本。

    切换表设置

    数据一致后将原表切换为目标表。

    • 锁表超时时间:切换表过程会锁表,超时未切换完成可能导致执行失败。

    • 失败重试次数:超过锁表时间后,未切换完成可自动重试。

    • 完成后源表清理策略:选择 重命名不处理,重命名源表,不删除。选择 立即删除,无锁结构变更完成后删除源表。

    任务设置

    • 选择 立即执行/定时执行 设置任务执行方式。

    • 无锁结构变更工具提供两种任务错误处理方式:

      • 停止任务:停止任务为默认方式,运行脚本的过程中出现错误时会停止运行。

      • 忽略错误继续任务:选择忽略错误继续任务方式,在运行脚本出现错后将跳过错误语句继续执行。

    • 选择 自动切换/手动切换 表名。

    • 配置限流策略:

      • 行限流:每秒操作数据总行限制。

      • 数据大小限流:每秒操作数据总大小限制。

    描述

    可在 描述 文本框中输入不超过 200 个字符的描述信息,该项为选填项。

  4. 单击 新建,完成新建无锁结构变更。

  5. 任务生成后可以在 工单 > 无锁结构变更 列表中查看任务信息。

    image

查看无锁结构变更任务

查看任务信息

  1. 任务中心 的无锁结构变更列表中,单击操作列中的 查看 按钮。

  2. 在弹出的任务详情面板中,单击 任务信息 页签查看所属数据库、任务类型、风险等级、SQL 内容和回滚内容等信息。

  3. 单击 再次发起,可重新发起无锁结构变更任务。

查看任务流程

在任务详情面板中,单击 任务流程 页签查看发起任务状态、审批状态、执行状态和执行结果等信息。

查看执行记录

在任务详情面板中,单击 执行记录 页签查看新表和源表 DDL。

查看任务日志

在任务详情面板中,单击 任务日志 页签查看任务的全部日志和告警日志。

信息项

说明

全部日志

全部日志显示任务的 INFOERROR WARN 日志等全量信息。 单击 查找下载 复制 按钮,可查找信息、下载或复制全部日志信息。

告警日志

告警日志单独显示任务的 ERROR WARN 日志。当任务失败时,可通过告警日志查看错误信息。 单击 查找下载 复制 按钮,可查找信息、下载或复制告警日志信息。

相关文档