作者简介:郭桂强,瑞蓝创数据库工程师
原创内容未经授权不得随意使用,转载请联系小编并注明来源
1、环境信息
OceanBase 构建版本号:4.2.1.11-111020032025051316
[root@xx-xxxx2-pb01a ~]# lscpu | grep Architecture
Architecture: aarch64
租户模式:ob_oracle
2、问题现象
执行CTAS(CREATE TABLE AS SELECT)超时,不符合超时时间预期。在执行CTAS(CREATE TABLE AS SELECT)之前设置了会话级ob_query_timeout以及ob_trx_timeout均为3600s。SQL实际执行了1000s左右就超时断开。
obclient(SYS@test_t01_rst)[SYS]> set ob_query_timeout =3600000000;
Query OK, 0 rows affected (0.056 sec)
obclient(SYS@test_t01_rst)[SYS]> set ob_trx_timeout = 3600000000;
Query OK, 0 rows affected (0.056 sec)
obclient(SYS@test_t01_rst)[SYS]> create table "TEST_DBO"."CCS_TEST_BAK" as select * from "TEST_DBO"."CCS_TEST_CALL"; -- 这里执行了1000s左右
ORA-00600: internal error code, arguments: -4012, Timeout
obclient(SYS@test_t01_rst)[SYS]>
3、问题分析
OceanBase 数据库中,一般 DDL 语句的超时时间由集群级隐藏参数 _ob_ddl_timeout 控制,默认值为 1000 秒,修改后动态生效。该参数影响的范围是集群级别,在 SYS 租户下通过 ALTER SYSTEM SET 进行修改。
3.1、受 _ob_ddl_timeout 控制的 DDL:CREATE TABLE AS SELECT(CTAS)目前属于受该参数控制的 DDL。这意味着当源表数据量巨大、复制耗时超过 1000 秒时,CTAS 会直接超时失败。
3.2、不受 _ob_ddl_timeout 限制的 DDL:创建索引(CREATE INDEX)、创建外键约束、创建 check 约束等会受表中数据量影响的 DDL,其内部超时时间为 102 年,可简单理解为不会受 1000 秒限制而超时。
4、问题诊断与排查
查看当前 DDL 超时参数 在 SYS 租户下查看 _ob_ddl_timeout 当前值:
-- 通过虚拟表查看
SELECT * FROM oceanbase.__all_virtual_tenant_parameter_stat WHERE name LIKE '_ob_ddl_timeout';
-- 查看是否被修改过(非默认值查询)
SELECT name, data_type, value FROM oceanbase.__all_sys_parameter WHERE name = '_ob_ddl_timeout';
若 __all_sys_parameter 中查询为空,说明集群从未修改过该参数,当前使用默认值 1000 秒。
5、规避方法
5.1、修改 DDL 超时参数(不推荐)
在 SYS 租户下执行:
ALTER SYSTEM SET _ob_ddl_timeout = '1h';
注意:虽然可以调大 _ob_ddl_timeout,但 1000 秒默认值通常已足够长。DDL 超时大多是由于并发执行大批量 DDL 导致在 RS 队列中排队时间超过阈值,或 CTAS 数据量过大导致。
5.2、将 CREATE TABLE AS SELECT 拆分为以下两步(推荐方案)
步骤一:单独创建目标表结构
步骤二:使用 INSERT INTO SELECT 导入数据并提速
方案 A:旁路导入 + 并行 DML(推荐,V4.x 适用)
旁路导入通过 Hint 使用 append 和 enable_parallel_dml 来跳过事务缓冲区,直接写入存储层,大幅提升大数据量写入性能。
语法示例:
INSERT /*+ append enable_parallel_dml parallel(16) */ INTO new_tbl SELECT * FROM big_tbl;
参数说明: append:走旁路导入路径。
enable_parallel_dml parallel(N):指定并行度 N,开启并行 DML。
执行计划确认(Oracle 模式示例):
EXPLAIN EXTENDED INSERT /*+ append enable_parallel_dml parallel(16) */ INTO new_tbl SELECT * FROM big_tbl;
在返回结果的 Note 中应包含 Direct-mode is enabled in insert into select,确认已走旁路导入。
旁路导入使用限制:
-
只支持 PDML(并行 DML),非 PDML 场景无法使用旁路导入。 -
导入过程中会加表锁,同一表不能同时被多个旁路导入语句写入。 -
不支持在触发器(Trigger)中使用。 -
支持 LOB 类型,但 LOB 会走原事务写入路径,性能较差。 -
旁路导入属于 DDL 语句,无法在多行事务中执行;Autocommit 必须设置为 1;不能在 BEGIN 块中执行。
并行 DML 优先级说明:
SQL 语句中的 Hint(如 PARALLEL(3))优先级高于会话级强制指定的并行度。
ENABLE_PARALLEL_DML 必须配合 PARALLEL(N) 使用(当目标表 Schema 未指定表级并行度时)。
并行 DML 不支持的限制:
-
不支持 REPLACE、INSERT INTO ON DUPLICATE KEY UPDATE、多表 DML。 -
表上存在触发器、外键、唯一索引时,不支持并行 DML。
方案 B:会话级开启并行 DML(V4.x 适用)
Oracle 模式:
ALTER SESSION ENABLE PARALLEL DML;
-- 或强制指定并行度
ALTER SESSION FORCE PARALLEL DML PARALLEL 16;
set ob_query_timeout =3600000000;
set ob_trx_timeout = 3600000000;
create table "TEST_DBO"."CCS_TEST_BAK" as select * from "TEST_DBO"."CCS_TEST_CALL";
总结
-
大数据量复制避免使用 CTAS:在预估数据量超过千万级或执行时间可能超过 1000 秒时,尽量启用旁路导入与并行 DML。
-
评估 DDL 超时影响:在执行批量 DDL 任务前,检查当前状态,避免并发 DDL 过多。
END
瑞蓝创 OceanBase OBCP V4 精英训练营
点击下方图片立即了解详情


▼ 点击「阅读原文」,了解更多产品技术文章


