本文适用于 OceanBase 4.1 及以上版本索引状态查看。
OceanBase 1.4.x~3.2.x 版本需要通过其他方法,详见 OceanBase 1.4.x ~ 3.2.x 索引状态查看。
GV$SESSION_LONGOPS 视图
OceanBase 4.1 版本开始,您可以通过 GV$SESSION_LONGOPS
视图查看数据库内部耗时任务。索引创建过程是一个可能耗时较久的过程,索引创建所处的阶段、进度信息会维护在此视图。
视图 GV$SESSION_LONGOPS
字段含义如下。
列名 | 类型 | 说明 |
SID | bigint(20) | Session ID |
OPNAME | varchar(128) | 具体 DDL 操作名 |
TARGET | varchar(128) | DDL操作对象 |
SVR_IP | varchar(46) | 机器 IP |
SVR_PORT | bigint(20) | 机器 Port |
START_TIME | bigint(20) | 开始时间 |
ELAPSED_SECONDS | decimal(24,4) | 已消耗时间 |
TIME_REMAINING | bigint(20) | 预估剩余时间 |
LAST_UPDATE_TIME | bigint(20) | 记录更新时间 |
MESSAGE | varchar(500) | 补充信息 |
TRACE_ID | varchar(64) | Trace ID |
观测索引创建过程
建索引的主要时间一般发生在索引数据补全,在某些环境,可能因为建索引的时候,还有并发的事务未执行完成,也有可能在等待事务结束部分,我们的进度观测例子中主要展示下这两个部分的进度。
等待事务结束阶段
索引创建任务处于等待事务结束阶段样例
obclient> 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:
SVR_PORT: 58648
START_TIME: 2023-06-09
ELAPSED_SECONDS: 7
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2023-06-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
字段来查询对应的事务信息。
数据补全阶段
您可以通过行数统计指标判断索引创建任务的整体进度,本章通过一个查询样例解释字段和进度指标。
索引创建任务处于数据补全阶段样例
obclient> select * from oceanbase.gv$session_longops \G
*************************** 1. row ***************************
SID: -1
TRACE_ID: YFDE80BA2DA8D-0005FDA8116C1F4E-0-0
OPNAME: create index
TARGET: 500097
SVR_IP: 127.1
SVR_PORT: 65000
START_TIME: 2023-06-09 17:10:42
ELAPSED_SECONDS: 5
TIME_REMAINING: 0
LAST_UPDATE_TIME: 2023-06-09 17:10:48
MESSAGE: TENANT_ID: 1004, TASK_ID: 541, STATUS: REPLICA BUILD, ROW_SCANNED: 2000000, ROW_SORTED: 4000000, ROW_INSERTED: 503316
1 row in set (0.03 sec)
GV$SESSION_LONGOPS
字段含义
对于索引创建任务而言, 各字段含义如下
- TRACE_ID: observer程序日志的ID,可以用该ID来搜索相关的日志文件
- OPNAME:建索引时,会展示
create index
- TARGET:建索引时,展示正在创建的索引名
- SVR_IP: 调度任务在哪个 OBServer 执行
- SVR_PORT:调度任务在哪个 OBServer 执行
- START_TIME:索引构建开始时间,这里只精确到日期,跟Oracle是兼容的
- ELAPSED_SECONDS: 索引构建执行的时间,单位为秒
- TIME_REMAINING: 剩余时间预测,兼容 Oracle,暂时还没有实现
- LAST_UPDATE_TIME: 统计信息收集的时间,精确到日期,兼容 Oracle
- MESSAGE:里面包含了索引任务的具体信息,最重要的字段!
MESSAGE 字段信息详细说明
索引创建任务 MESSAGE 内部字段说明
- TENANT_ID 为租户ID
- TASK_ID 为 DDL 的任务ID
- STATUS 为 DDL 执行到的状态,如
REPLICA BUILD
指的是数据补全阶段
索引数据补全阶段的行数统计
数据补全主要分为 3 个阶段,处理行数统计字段分别为
阶段 | 行数统计指标 | 说明 |
扫描主表数据 | ROW_SCANNED | |
排序 | ROW_SORTED | 排序阶段可能会进行多轮归并,所以 ROW_SORTED 的行数通常比 ROW_SCANNED 和 ROW_INSERTED 大,耗时也更久 |
写入到索引表 | ROW_INSERTED |
上述样例中 ROW_SCANNED: 2000000, ROW_SORTED: 4000000, ROW_INSERTED: 503316 。
可以判断出:
- 数据补全的扫描主表、排序步骤已经完成,已进入最后一步写入到索引表阶段;
- 数据总行数为 2000000,写入到索引表已经完成 503316,写入到索引表进度百分比为 503316/2000000,大约为 25%。