---
title: DDL 排查方法-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于 DDL 排查方法相关的常见问题和使用技巧，帮助您快速解决 DDL 排查方法的难题。
---
切换语言

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

划线反馈

# DDL 排查方法

更新时间：2025-01-20 08:26

适用版本： V4.0.x、V4.1.x、V4.2.x 内容类型：Troubleshoot  

本文介绍 DDL 排查方法。

## DDL 报错排查

1. 获取 Trace ID。

   获取建索引 DDL SQL 执行的 trace id，执行如下语句：

   ```shell
   SELECT last_trace_id() FROM DUAL;

   ```
 2. 查看 OBServer 日志。

      - 使用 grep [trace_id] 在执行该 SQL 的 OBServer 日志中查找相关信息。

            - 如果是直连模式，检查客户端连接的 OBServer 机器的日志。
            - 如果是使用 OBproxy 连接，需要在所有可能的 OBServer 机器上进行查找，这种情况下先检查 RS（RootServer）日志可能更有效。
 3. 分析错误信息，确定错误是在解析阶段还是执行阶段发生。

      - 如果是解析阶段，根据错误码直接进行分析。
      - 如果是执行阶段，则使用 trace id 在 RS 日志中搜索，以找到具体错误码和问题。
 4. 如果问题出现在 RS 调度过程中的特定任务执行阶段，需要进一步检查相关 OBServer 的日志。

      - 如果涉及到 RPC 调用，检查 RPC 目的端的 OBServer 日志。
      - 对于单副本构建阶段的 `inner SQL` 错误，使用 `__all_virtual_ls_meta_table` 确定 LS 主机，并在该 OBServer 上使用 trace id 进行日志搜索。

## DDL 卡住的排查

1. 获取 DDL 状态信息。

   在系统租户下执行如下语句，获取卡住的 DDL 信息：

   ```shell
   select task_id, object_id, target_object_id, ddl_type, trace_id, status, message from oceanbase.__all_virtual_ddl_task_status;

   ```
 2. 分析 DDL 任务状态。

      - 根据 object_id 和 target_object_id 确定 DDL 操作的表和目标对象。
      - 根据 status 枚举值判断 DDL 执行的当前阶段。

       ```shell
       enum ObDDLTaskStatus {
       PREPARE = 0,
       LOCK_TABLE = 1,
       WAIT_TRANS_END = 2,
       REDEFINITION = 3,
       VALIDATE_CHECKSUM = 4,
       COPY_TABLE_DEPENDENT_OBJECTS = 5,
       TAKE_EFFECT = 6,
       WRITE_BARRIER_LOG = 7,
       CHECK_CONSTRAINT_VALID = 8,
       SET_CONSTRAINT_VALIDATE = 9,
       MODIFY_AUTOINC = 10,
       SET_WRITE_ONLY = 11,
       WAIT_TRANS_END_FOR_WRITE_ONLY = 12,
       SET_UNUSABLE = 13,
       WAIT_TRANS_END_FOR_UNUSABLE = 14,
       DROP_SCHEMA = 15,
       FAIL = 99,
       SUCCESS = 100
       }

       ```

       步骤 1 中查到的 object_id 是 DDL 去操作的表的 ID，target_object_id 是DDL 的目标对象的 ID，可能是原表，可能是两表 DDL 中的隐藏表，也可能是约束/外键 ID。
 3. 追踪 RS 日志。

      - 使用步骤 1 中得到的 trace id 在 RS 日志中搜索，确定卡在了哪个步骤。
      - 如果问题不在 RS 端，根据日志信息再到相应的 OBServer 中查找详细日志。

## 适用版本

OceanBase 数据库 V4.x 版本。

上一篇

[批量执行 DDL 和批量导入数据时如何绕过外键约束](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001819025)

下一篇

[OceanBase 数据库 Oracle 模式的快速删除列特性详解](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000001487619) ![有帮助](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) 咨询热线
