首批通过分布式安全可靠测评,为关键业务系统打造
DDL 执行进度监控指南
更新时间:2026-04-07 20:57:20
在生产环境中,DDL 执行时间较长且执行过程不透明是常见问题。为解决此问题,OceanBase 数据库 V4.1 引入了 DDL 实时执行进度监控功能,将 DDL 执行进度信息展示到 GV$SESSION_LONGOPS 视图中。更多信息,参考 GV$SESSION_LONGOPS。
本文介绍如何监控 DDL 执行过程并诊断常见问题。本文通过建索引、添加主键和删列三个典型场景说明 GV$SESSION_LONGOPS 的监控功能。建索引为单独 DDL 任务,添加主键为具有父子关系的 DDL 任务,删列同样具有父子关系但使用非排序方式进行数据补全。
监控过程需创建两个会话:一个用于执行 DDL 操作,另一个用于查询 GV$SESSION_LONGOPS 视图。两个会话均使用普通租户身份登录系统。
您可以使用以下语句查看 GV$SESSION_LONGOPS 视图中的字段:
SELECT * FROM oceanbase.gv$session_longops\G
观测建索引
建索引操作主要耗时在索引数据补全阶段。在特定环境下,建索引过程可能受到并发事务的影响。以下分别说明等待事务结束和数据补全两个阶段的进度监控。
等待事务结束阶段
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF63AE10FBBB-0-0
OPNAME: create index
TARGET: __idx_500005_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 7
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 2, STATUS: WAIT TRANS END, PENDING_TX_ID: 76
在等待事务结束阶段,MESSAGE 字段显示 WAIT TRANS END 状态,并展示第一个未结束事务的 ID(例如:PENDING_TX_ID: 76)。您可通过查询 __all_virtual_trans_stat 表中对应 trans_id 获取详细事务信息。
事务补全阶段
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F228-0-0
OPNAME: create index
TARGET: __idx_500008_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 38
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 6, STATUS: REPLICA BUILD, ROW_SCANNED: 10000000, ROW_SORTED: 19771966, ROW_INSERTED: 0
数据补全阶段,MESSAGE 字段包含以下关键信息:
- TENANT_ID: 租户标识符
- TASK_ID: DDL 任务标识符
- STATUS: 当前执行状态,
REPLICA BUILD表示处于数据补全阶段 - ROW_SCANNED: 已扫描主表数据行数
- ROW_SORTED: 排序处理的行数
- ROW_INSERTED: 已写入索引表的行数
由于排序过程可能涉及多轮归并操作,ROW_SORTED 值通常大于 ROW_SCANNED 和 ROW_INSERTED。
列存版本特性
列存版本引入后,数据补全监控发生变化。系统区分列存表和行存表,其中列存版本之前的表及行列混存表均视为行存表。
数据补全过程差异:
- 行存表:数据写入临时文件后直接写入宏块
- 列存表:数据写入临时文件后,需进一步写入列存 SS Table,总行数为 column_group_cnt * row_count
补数据阶段 MESSAGE 信息示例:
- 行存表:
TENANT_ID: 1004, TASK_ID: 4514, STATUS: REPLICA BUILD, ROW_SCANNED: 779, ROW_SORTED: 0, ROW_INSERTED: 0 - 列存表:
TENANT_ID: 1004, TASK_ID: 6064, STATUS: REPLICA BUILD, ROW_SCANNED: 100000, ROW_SORTED: 200000, ROW_INSERTED_TMP_FILE: 100000, ROW_INSERTED_SSTABLE: 500000 out of 500000 done
观测添加主键
添加主键操作与索引构建不同,在添加主键的数据补全阶段,GV$SESSION_LONGOPS 中显示两条记录:一条记录表示主表上的索引补全,另一条记录表示主表本身的变更。各字段含义与索引构建过程类似。
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F22F-0-0
OPNAME: create index
TARGET: __idx_500030_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 6
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 8, STATUS: REPLICA BUILD, ROW_SCANNED: 5518389, ROW_SORTED: 0, ROW_INSERTED: 0
*************************** 2. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F22F-0-0
OPNAME: add primary key
TARGET: t1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 63
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 7, STATUS: COPY DEPENDENT OBJECTS, CHILD TASK IDS: [ 8 ]
观测删列
*************************** 1. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F240-0-0
OPNAME: drop column
TARGET: t1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 26
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 13, STATUS: COPY DEPENDENT OBJECTS, CHILD TASK IDS: [ 14 ]
*************************** 2. row ***************************
SID: -1
TRACE_ID: YE5186458A15C-0005EF60F182F240-0-0
OPNAME: create index
TARGET: __idx_500076_i1
SVR_IP: xxx.xx.xxx.xx
SVR_PORT: 58648
START_TIME: 2022-12-09
ELAPSED_SECONDS: 8
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2022-12-09
MESSAGE: TENANT_ID: 1004, TASK_ID: 14, STATUS: REPLICA BUILD, ROW_SCANNED: 10000000, ROW_SORTED: 213098, ROW_INSERTED: 0
删列操作的数据补全不涉及排序阶段,因此 MESSAGE 字段中仅包含 ROW_SCANNED 和 ROW_INSERTED 信息。类似操作还包括中间位置添加非生成列等。