跳到主要内容

Online DDL 和 Offline DDL 操作

在线 DDL (Online DDL)

  • 定义:在进行 DDL 操作时,用户仍然可以访问数据库,包括读取和写入操作。
  • 优点:对业务的影响小,能够在系统运行时执行 DDL 操作,通常用于高可用性要求的场景。
  • 特点:通常支持并发访问和更少的锁定,能够减少停机时间。

离线 DDL (Offline DDL)

  • 定义:进行 DDL 操作时,会锁定相关表,导致用户无法访问数据库的相关数据。
  • 优点:简单且容易实现,适用于对业务影响不大的情况。
  • 特点:在执行 DDL 操作时,会造成一定的停机时间,影响正常的查询和事务处理。

事务关联性

  • 事务:是指一组操作,要么全部成功,要么全部失败,并且事务运行时保证数据的一致性。
  • 在线 DDL 和离线 DDL 操作通常是单独的,DDL 操作本身在某些数据库管理系统中可能不支持被事务控制(尤其是离线 DDL)。

事务等待策略

  • 在线 DDL:通常不需要等待当前事务结束,可以并发执行。
  • 离线 DDL:通常需要等待当前事务结束,因为在执行期间会锁定相关表。

seekdb 所支持的 Online DDL 操作如下表所示。

分类操作耗时备注创建物化视图日志(mlog)后 DDL 支持情况
索引操作增加索引与数据量有关,需要重整数据主要涉及全局/局部索引、全局索引带有分区和空间索引。支持
索引操作删除索引与是否有活跃事务有关暂无支持
索引操作重命名索引只需要修改元数据暂无支持
索引操作混合索引操作与数据量有关,需要补全索引数据例如 ALTER TABLE t1 ADD INDEX i4(c1), DROP INDEX i2, RENAME INDEX i1 TO i1x支持
列操作添加/更改/删除 Skip Index 类型只更改 Table Schema暂无不支持
列操作末尾加列只需要修改元数据例如增加 LOBTEXT) 列,ALTER TABLE tbl1 ADD c3 LOB支持
列操作中间加列(BEFORE/AFTER/FIRST与数据量有关,需要重整数据(即把原来的数据要重写一遍)支持
列操作添加 VIRTUAL只需要修改元数据暂无不支持
列操作修改列为 NOT NULL与数据量有关,需要查询数据暂无不支持
列操作修改列为 NULL只需要修改元数据暂无不支持
列操作设列默认值只需要修改元数据暂无不支持
列操作删除列默认值只需要修改元数据暂无不支持
列操作修改自增列值只需要修改元数据暂无不支持
列操作重命名列只需要修改元数据暂无不支持
列操作增加列类型长度或精度只需要修改元数据例如 INT 长度增长、VARCHAR 变长、NUMBER 类转换。不支持
列操作混合列操作与耗时最长的操作有关单个列操作为 Online,混合列操作大部分都是 Online,如需确认是否为 Online DDL,通过下述章节 如何判断 DDL 操作为在线操作(Online DDL) 中的方式确认。不支持
外键约束操作增加外键、CHECK/NOT NULL 约束与数据量有关,需要查询数据。暂无支持增加外键约束,不支持增加 CHECK/NOT NULL 约束
外键约束操作删除外键、CHECK/NOT NULL 约束与数据量有关,需要查询数据。暂无支持删除外键约束,不支持删除 CHECK/NOT NULL 约束
表操作重命名表只需要修改元数据暂无不支持
表操作修改行格式只需要修改元数据暂无不支持
表操作修改块大小只需要修改元数据暂无不支持
表操作修改压缩算法只需要修改元数据暂无不支持
表操作优化表空间只需要修改元数据暂无不支持
表操作行存转列存 :::tip 执行 ALTER TABLE 时添加 DELAYED 标识,为 Online DDL ::: 。只更改 Table Schema暂无不支持
表操作行存转行列混存 :::tip 执行 ALTER TABLE 时添加 DELAYED 标识,为 Online DDL ::: 。只更改 Table Schema暂无不支持
分区操作添加分区只需要修改元数据暂无不支持
分区操作只修改自动分区属性只需要修改元数据例如:
  • ALTER TABLE t1 PARTITION BY RANGE() SIZE('xxx');
  • ALTER TABLE t1 PARTITION BY RANGE();
  • ALTET TABLE t1 PARTITION BY RANGE() SIZE('ulimited');
  • ALTER TABLE t1 PARTITION BY RANGE (xxx) SIZE('xxx');
不支持

seekdb 所支持的 Offline DDL 操作如下表所示。

分类操作耗时备注创建物化视图日志(mlog)后 DDL 支持情况创建全文/多值/向量索引后 DDL 支持情况
列操作重排列(BEFORE/AFTER/FIRST与数据量有关,需要重整数据不支持支持
列操作添加自增列与数据量有关,需要重整数据暂无不支持支持
列操作修改为自增列与数据量有关,需要查询数据暂无不支持支持
列操作修改列类型与数据量有关,需要重整数据不支持支持
列操作修改列为主键与数据量有关,需要重整数据暂无不支持支持
列操作添加/删除 STORED 生成列与数据量有关,需要重整数据暂无不支持支持
列操作删除列与数据量有关,需要重整数据暂无不支持支持
列操作删除 VIRTUAL与数据量有关,需要重整数据暂无不支持支持
列操作混合列操作如果有 Offline 列操作,会升级成 Offline DDL。暂无不支持支持
主键操作添加/删除主键与数据量有关,需要重整数据暂无不支持支持
表操作TRUNCATE与是否有活跃事务有关暂无不支持支持
表操作转换字符集与数据量有关,需要重整数据不支持支持
表操作删除表与是否有活跃事务有关暂无不支持支持
表操作行存转列存 :::tip 执行 ALTER TABLE 时未添加 DELAYED 标识,为 Offline DDL ::: 。与数据量有关,需要重整数据暂无不支持支持
表操作行存转行列混存 :::tip 执行 ALTER TABLE 时未添加 DELAYED 标识,为 Offline DDL ::: 。与数据量有关,需要重整数据暂无不支持支持
表操作列存转行存与数据量有关,需要重整数据暂无不支持支持
表操作列存转行列混存与数据量有关,需要重整数据暂无不支持支持
表操作行列混存转列存与数据量有关,需要重整数据暂无不支持支持
表操作行列混存转行存与数据量有关,需要重整数据暂无不支持支持
分区操作修改分区规则与数据量有关,需要重整数据暂无不支持支持
分区操作删除分区与是否有活跃事务有关对该分区加分区级的表锁。不支持支持
分区操作TRUNCATE 分区与是否有活跃事务有关对该分区加分区级的表锁。不支持支持
分区操作分区交换与是否有活跃事务有关对该分区加分区级的表锁。不支持不支持
分区操作手动分区分裂与数据量有关,需要重整数据暂无不支持不支持
分区操作修改自动分区属性及分区规则与数据量有关例如:ALTER TABLE t1 PARTITION BY RANGE(xxx) SIZE('xxx') (PARTITION...);不支持支持

如何判断 DDL 操作为在线操作(Online DDL)

在 seekdb 中,DDL 操作的在线与离线状态对于业务运行的影响非常重要。本文将介绍如何判断 DDL 操作是否为 Online DDL,以及提供具体的操作步骤和注意事项。有些如列类型变更或混合 DDL 操作在执行前不确定是否为 Online DDL,建议先通过下述方式进行验证判断。

判断 DDL 为在线操作的方式

对于部分操作包含的范围比较广,并不能完全列举 DDL 操作为在线还是离线,建议用户如在有混合 DDL 操作的情况下,明确该操作是否为在线操作。

离线 DDL 的原理

seekdb 的离线 DDL 操作采用 “重建表” 的方式。具体而言,离线 DDL 会新建一张临时的隐藏表(对用户不可见),然后将原表的数据迁移到新建的表中。完成数据迁移后,临时表会被重命名为原表的名称,并且旧表将被删除。因此,离线 DDL 操作完成后,table_id 会发生变化,需要注意在 DDL 执行期间不允许 DML 操作。

借助这一原理,可以判断某个 DDL 操作是否为在线 DDL。

判断方式

在 DDL 操作前后执行如下 SQL 语句查看 table_id 是否发生变化,如果没有变化,说明是 Online DDL,如果发生变化,则是 Offline DDL。

select distinct(table_id) from oceanbase.DBA_OB_TABLE_LOCATIONS where table_name='xxx';

判断步骤

通过下述判断步骤,判断 DDL 操作是否为 Online DDL。

  1. 创建一个用以验证的空表:

    CREATE TABLE t10(a INT, b INT);
  2. 查看当前 table_id

    SELECT distinct(table_id)
    FROM oceanbase.DBA_OB_TABLE_LOCATIONS
    WHERE table_name='t10';
  3. 执行预期的 DDL 操作:

    ALTER TABLE t10 ADD c INT, ADD CONSTRAINT c_idx UNIQUE(c);
  4. 再次查看 table_id

    SELECT distinct(table_id)
    FROM oceanbase.DBA_OB_TABLE_LOCATIONS
    WHERE table_name='t10';
  5. 如果步骤 2 和步骤 4 返回结果 table_id 相同,则说明这个 DDL 操作是在线的;如果 table_id 发生了变化,则对应的 DDL 操作是离线的。

信息

该判断方法对表操作和分区操作无效。