---
title: "Online DDL 和 Offline DDL 操作 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: Online DDL 和 Offline DDL 操作 在线 DDL (Online DDL) 定义 ：在进行 DDL 操作时，用户仍然可以访问数据库，包括读取和写入操作。 优点 ：对业务的影响小，能够在系统运行时执行 DDL 操作，通常用于高可用性要求的场景。 特点 ：通常支持并发访问和更少的锁定，能够减少停机时间…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# Online DDL 和 Offline DDL 操作

更新时间：2026-06-26 15:06:57

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/200.common-tenant-of-mysql-mode/700.ddl-function-of-mysql-mode/150.online-and-offline-ddl-list-of-mysql-mode.md)  

## 在线 DDL (Online DDL)

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

## 离线 DDL (Offline DDL)

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

## 事务关联性

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

## 事务等待策略

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

## 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`。 | 支持   #### 注意    对于 OceanBase 数据库 V4.3.5 版本，从 V4.3.5 BP1 版本开始支持物化视图日志基表增加列。 |
| 列操作 | 中间加列（`BEFORE`/`AFTER`/`FIRST`） | 与数据量有关，需要重整数据（即把原来的数据要重写一遍） | 暂无 | 支持   #### 注意    对于 OceanBase 数据库 V4.3.5 版本，从 V4.3.5 BP1 版本开始支持物化视图日志基表增加列。 |
| 列操作 | 添加 `VIRTUAL` 列 | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 修改列为 `NOT NULL` | 与数据量有关，需要查询数据 | 暂无 | 不支持 |
| 列操作 | 修改列为 `NULL` | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 设列默认值 | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 删除列默认值 | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 修改自增列值 | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 重命名列 | 只需要修改元数据 | 暂无 | 不支持 |
| 列操作 | 增加列类型长度或精度 | 只需要修改元数据 | 例如 `INT` 长度增长、`VARCHAR` 变长。 | 不支持 |
| 列操作 | 混合列操作 | 与耗时最长的操作有关 | 单个列操作为 Online，混合列操作大部分都是 Online，如需确认是否为 Online DDL，通过下述章节 **如何判断 DDL 操作为在线操作（Online DDL）** 中的方式确认。 | 不支持 |
| 外键约束操作 | 增加外键、`CHECK`/`NOT NULL` 约束 | 与数据量有关，需要查询数据。 | 暂无 | 支持增加外键约束，不支持增加 `CHECK`/`NOT NULL` 约束 |
| 外键约束操作 | 删除外键、`CHECK`/`NOT NULL` 约束 | 与数据量有关，需要查询数据。 | 暂无 | 支持删除外键约束，不支持删除 `CHECK`/`NOT NULL` 约束 |
| 表操作 | 重命名表 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改行格式 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改块大小 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 修改压缩算法 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 优化表空间 | 只需要修改元数据 | 暂无 | 不支持 |
| 表操作 | 行存转列存   #### 注意    执行 `ALTER TABLE` 时添加 `DELAYED` 标识，为 Online DDL。 | 只更改 Table Schema | 暂无 | 不支持 |
| 表操作 | 行存转行列混存   #### 注意    执行 `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');` | 不支持 |

## OceanBase 数据库 V4.x 版本 MySQL 模式下所支持的 Offline DDL 操作如下表所示

#### 注意

- 下表中关于创建全文索引、多值索引和向量索引后的 DDL 支持情况适用于 V4.3.5 BP2 版本及之后的版本。
 - 共享存储模式下的全文/多值/向量索引不支持 Offline DDL。

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

## 如何判断 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。

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

```

**判断步骤**：

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

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

   ```sql
   CREATE TABLE t10(a INT, b INT);

   ```
 2. 查看当前 `table_id`：

   ```sql
   SELECT distinct(table_id)
   FROM oceanbase.DBA_OB_TABLE_LOCATIONS
   WHERE table_name='t10';

   ```
 3. 执行预期的 DDL 操作：

   ```sql
   ALTER TABLE t10 ADD c INT, ADD CONSTRAINT c_idx UNIQUE(c);

   ```
 4. 再次查看 `table_id`：

   ```
 5. 如果步骤 2 和步骤 4 返回结果 `table_id` 相同，则说明这个 DDL 操作是在线的；如果 `table_id` 发生了变化，则对应的 DDL 操作是离线的。

#### 说明

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

  上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
