首批通过分布式安全可靠测评,为关键业务系统打造
Online DDL 和 Offline DDL 操作
更新时间:2024-12-10 10:21:15
OceanBase 数据库 V4.x 版本 MySQL 模式下所支持的 Online DDL 操作如下表所示。
| 分类 | 操作 | 耗时 | 备注 | 创建物化视图日志(mlog)后 DDL 支持情况 |
|---|---|---|---|---|
| 索引操作 | 增加索引 | 与数据量有关,需要重整数据 | 主要涉及全局/局部索引、全局索引带有分区和空间索引(V4.1.0 版本及以后版本支持)。 | 支持 |
| 索引操作 | 删除索引 | 与是否有活跃事务有关 | 暂无 | 支持 |
| 索引操作 | 重命名索引 | 只需要修改元数据 | 暂无 | 支持 |
| 索引操作 | 混合索引操作 | 与数据量有关,需要补全索引数据 | 例如 ALTER TABLE t1 ADD INDEX i4(c1), DROP INDEX i2, RENAME INDEX i1 TO i1x。 |
支持 |
| 列操作 | 添加/更改/删除 Skip Index 类型 | 只更改 Table Schema | 暂无 | 不支持 |
| 列操作 | 末尾加列 | 只需要修改元数据 | 例如增加 LOB(TEXT) 列,ALTER TABLE tbl1 ADD c3 LOB。 |
不支持 |
| 列操作 | 添加 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 约束 |
| 表操作 | 重命名表 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改行格式 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改块大小 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改压缩算法 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 优化表空间 | 只需要修改元数据 | 暂无 | 不支持 |
| 分区操作 | 添加分区 | 只需要修改元数据 | 暂无 | 不支持 |
OceanBase 数据库 V4.x 版本 MySQL 模式下所支持的 Offline DDL 操作如下表所示。
| 分类 | 操作 | 耗时 | 备注 | 创建物化视图日志(mlog)后 DDL 支持情况 |
|---|---|---|---|---|
| 列操作 | 中间加列(BEFORE/AFTER/FIRST) |
与数据量有关,需要重整数据(即把原来的数据要重写一遍) | Oracle 模式不支持 | 不支持 |
| 列操作 | 重排列(BEFORE/AFTER/FIRST) |
与数据量有关,需要重整数据 | Oracle 模式不支持 | 不支持 |
| 列操作 | 添加自增列 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 列操作 | 修改为自增列 | 与数据量有关,需要查询数据 | 暂无 | 不支持 |
| 列操作 | 修改列类型 | 与数据量有关,需要重整数据 | Oracle 模式不支持 | 不支持 |
| 列操作 | 修改列为主键 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 列操作 | 添加/删除 STORED 生成列 |
与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 列操作 | 删除列 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 列操作 | 删除 VIRTUAL 列 |
与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 列操作 | 混合列操作 | 如果有 Offline 列操作,会升级成 Offline DDL。 | 暂无 | 不支持 |
| 主键操作 | 添加/删除主键 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | TRUNCATE 表 |
与是否有活跃事务有关 | 暂无 | 不支持 |
| 表操作 | 转换字符集 | 与数据量有关,需要重整数据 | Oracle 模式不支持 | 不支持 |
| 表操作 | 删除表 | 与是否有活跃事务有关 | 暂无 | 不支持 |
| 表操作 | 行存转列存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | 行存转行列混存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | 列存转行存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | 列存转行列混存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | 行列混存转列存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 表操作 | 行列混存转行存 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 分区操作 | 修改分区规则 | 与数据量有关,需要重整数据 | 暂无 | 不支持 |
| 分区操作 | 删除分区 | 与是否有活跃事务有关 | 对该分区加分区级的表锁。 | 不支持 |
| 分区操作 | TRUNCATE 分区 |
与是否有活跃事务有关 | 对该分区加分区级的表锁。 | 不支持 |
| 分区操作 | 分区交换 | 与是否有活跃事务有关 | 对该分区加分区级的表锁。 | 不支持 |
如何判断 DDL 操作为在线操作(Online DDL)
在 OceanBase 数据库中,DDL 操作的在线与离线状态对于业务运行的影响非常重要。本文将介绍如何判断 DDL 操作是否为 Online DDL,以及提供具体的操作步骤和注意事项。有些如列类型变更或混合 DDL 操作在执行前不确定是否为 Online DDL,建议先通过下述方式进行验证判断。
判断 DDL 为在线操作的方式
对于部分操作包含的范围比较广,并不能完全列举 DDL 操作为在线还是离线,建议用户如在有混合 DDL 操作的情况下,明确该操作是否为在线操作。
离线 DDL 的原理:
OceanBase 的离线 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。
创建一个用以验证的空表:
CREATE TABLE t10(a INT, b INT);查看当前
table_id:SELECT distinct(table_id) FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name='t10';执行预期的 DDL 操作:
ALTER TABLE t10 ADD c INT, ADD CONSTRAINT c_idx UNIQUE(c);再次查看
table_id:SELECT distinct(table_id) FROM oceanbase.DBA_OB_TABLE_LOCATIONS WHERE table_name='t10';如果步骤 2 和步骤 4 返回结果
table_id相同,则说明这个 DDL 操作是在线的;如果table_id发生了变化,则对应的 DDL 操作是离线的。
说明
该判断方法对表操作和分区操作无效。