首批通过分布式安全可靠测评,为关键业务系统打造
DDL 排查方法
更新时间:2025-01-20 08:26
本文介绍 DDL 排查方法。
DDL 报错排查
获取 Trace ID。
获取建索引 DDL SQL 执行的 trace id,执行如下语句:
SELECT last_trace_id() FROM DUAL;查看 OBServer 日志。
使用 grep [trace_id] 在执行该 SQL 的 OBServer 日志中查找相关信息。
如果是直连模式,检查客户端连接的 OBServer 机器的日志。
如果是使用 OBproxy 连接,需要在所有可能的 OBServer 机器上进行查找,这种情况下先检查 RS(RootServer)日志可能更有效。
分析错误信息,确定错误是在解析阶段还是执行阶段发生。
如果是解析阶段,根据错误码直接进行分析。
如果是执行阶段,则使用 trace id 在 RS 日志中搜索,以找到具体错误码和问题。
如果问题出现在 RS 调度过程中的特定任务执行阶段,需要进一步检查相关 OBServer 的日志。
如果涉及到 RPC 调用,检查 RPC 目的端的 OBServer 日志。
对于单副本构建阶段的
inner SQL错误,使用__all_virtual_ls_meta_table确定 LS 主机,并在该 OBServer 上使用 trace id 进行日志搜索。
DDL 卡住的排查
获取 DDL 状态信息。
在系统租户下执行如下语句,获取卡住的 DDL 信息:
select task_id, object_id, target_object_id, ddl_type, trace_id, status, message from oceanbase.__all_virtual_ddl_task_status;分析 DDL 任务状态。
根据 object_id 和 target_object_id 确定 DDL 操作的表和目标对象。
根据 status 枚举值判断 DDL 执行的当前阶段。
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。
追踪 RS 日志。
使用步骤 1 中得到的 trace id 在 RS 日志中搜索,确定卡在了哪个步骤。
如果问题不在 RS 端,根据日志信息再到相应的 OBServer 中查找详细日志。
适用版本
OceanBase 数据库 V4.x 版本。