OceanBase 4.1 开始,查看索引创建任务有了更简单的方式,并且还可以查看进度!

2024年 5月 7日 86.5k 0

本文适用于 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%。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论