适用场景:DMDRS 同步链路出现入库失败、数据异常、检查点持续堆积时,如何借助
drdgtool快速定位根因。
关键词:DMDRS、drdgtool、ERRLOG DUMP、RECID、SITEID、CKPT、检查点堆积。
DMDRS 诊断工具 drdgtool 是 DMDRS 提供的专业诊断工具,主要用于:
工具位于 DMDRS 执行程序目录下,与 drctl 控制台工具同级。启动方式:
cd /data/dmdr5/bin_exec_dm8_5345
./drdgtool exec.xml
进入后,可使用 ERRLOG DUMP 分析错误日志,或使用 CKPT 系列命令分析检查点。
当同步链路出现入库失败或数据异常时,除了分析源端归档日志,还可以用 drdgtool 分析目标端 EXEC 模块错误日志,精准定位失败的 SQL 和执行错误。
当 DML 操作发生绑定失败或入库失败时,DMDRS 日志会打印一行“保存操作”日志,其中包含:
RECID:记录 ID;SITEID:源端站点号。RECID 为十六进制,组成方式为:
<文件号><记录在文件中的偏移>
其中:
示例:
10007ECF7
表示:
10007ECF7日志示例:
EXE[INFO]: 保存操作(recid:20000000 siteid:1)
Isn:164712603,trxid:2814762652096001,op_id:1,
rowid:AABoRyAAEAALxb1Amgs: syshalt!
获取方式:从 EXEC 模块运行日志中查找“保存操作”关键字,即可拿到 RECID 和 SITEID。
语法:
ERRLOG DUMP RECID:<RECID> SITEID:<SITEID> [SQL|STRUCT|BIN]
[OUTDIR:"<OUTDIR_PATH>"] [DIR:"<DIR_PATH>"]
功能:根据目标端错误日志文件夹路径和记录 ID,输出指定错误信息。
参数说明:
| 参数 | 说明 |
|---|---|
RECID:<RECID> |
记录 ID,每条异常日志操作对应一个记录 ID,可从 DMDRS 日志获取 |
SITEID:<SITEID> |
记录 ID 对应的源端站点号,可从 DMDRS 日志获取 |
SQL |
输出 SQL 格式文件,默认文件名 out.sql |
STRUCT |
输出 JSON 格式文件,默认文件名 out.json |
BIN |
输出 BIN 格式文件,默认文件名 <事务号>-<OP_ID号>.bin |
OUTDIR |
输出文件目录,默认当前程序工作目录 |
DIR |
错误日志文件夹路径,默认当前工作目录下 <EXEC模块名>/ERRLOG_<站点号> |
使用示例:
# 分析 1 号站点下,记录 ID 为 10007ECF7 的错误信息,按 SQL 格式输出
drdgtool> ERRLOG DUMP RECID:10007ECF7 SITEID:1
# 手动指定错误日志文件夹路径
drdgtool> ERRLOG DUMP RECID:10007ECF7 SITEID:1 DIR:"/opt/dmdrS/INST_DRS/node1/exec_dm8/ERRLOG_1"
# 按 JSON 格式输出到指定目录
drdgtool> ERRLOG DUMP RECID:10007ECF7 SITEID:1 STRUCT OUTDIR:"/opt/dmdrS/ERR_OUT"
执行成功后,会在指定目录生成 out.sql 或 out.json,内容为故障日志操作详情。
out.sql 示例:
op_id:1,trxid:2814762652096001,Isn:164712603,Ifs:0,
rowid:AABoRyAAEAALxb1AAA,errno:-70011,
commit_Isn:16471
INSERT INTO "DMDRS"."ORA_INS_23114"("C1")
values("10000000000000000000000000000000000000000000000000000000000000000")
语法:
ERRLOG DUMP MIN:<MIN_RECID> MAX:<MAX_RECID> SITEID:<SITEID>
[<TRX_ID>] [<OP_ID>] [SQL|STRUCT|BIN]
[OUTDIR:"<OUTDIR_PATH>"] [DIR:"<DIR_PATH>"]
["<SCHNAME>.<TABNAME>"] [ROWID:<ROWID>]
[FROM "<START_TIME>" TO "<END_TIME>"]
功能:根据目标端错误日志文件夹路径,输出从起始记录 ID 到截止记录 ID 区间内的所有错误信息。
参数说明:
| 参数 | 说明 |
|---|---|
MIN:<MIN_RECID> |
区间起始记录 ID,十六进制,不支持模糊起始记录 ID |
MAX:<MAX_RECID> |
区间截止记录 ID,支持模糊截止记录 ID,即截止记录 ID 可不对应存在的记录 |
SITEID:<SITEID> |
记录 ID 对应的源端站点号 |
<TRX_ID> |
需要输出的事务号。配置后只输出指定事务错误信息,不配置则输出区间内所有事务错误信息 |
<OP_ID> |
日志操作在事务内的操作序号。配置后按操作序号过滤,不配置则输出所有操作序号 |
SQL\|STRUCT\|BIN |
输出格式,含义同命令一 |
OUTDIR |
输出文件目录 |
DIR |
错误日志文件夹路径 |
"<SCHNAME>.<TABNAME>" |
按模式名和表名过滤,不配置则输出所有表错误信息 |
ROWID:<ROWID> |
按 ROWID 过滤 |
FROM "<START_TIME>" TO "<END_TIME>" |
按错误发生起始时间和截止时间过滤,格式为 yyyy-mm-dd HH:MM:SS |
使用示例:
# 分析 1 号站点下,从记录 ID 10007ECF7 到 10009BEC3 的所有错误信息
drdgtool> ERRLOG DUMP MIN:10007ECF7 MAX:10009BEC3 SITEID:1
# 分析 26 号站点下,3 号文件中记录的所有错误信息,按 JSON 格式输出到指定目录
drdgtool> ERRLOG DUMP MIN:30000000 MAX:3FFFFFFF SITEID:26 STRUCT OUTDIR:"/opt/dmdrS/ERR_OUT"
# 分析 26 号站点下,3 号文件和 4 号文件中模式名为 DMDRS、表名为 ORA_INS_23435 的表上的错误信息
# 按 JSON 格式输出,并按错误发生时间从 2024 年 2 月 3 日至 2024 年 2 月 8 日过滤
drdgtool> ERRLOG DUMP MIN:30000000 MAX:4FFFFFFF SITEID:26 STRUCT
OUTDIR:"/opt/dmdrS/ERR_OUT" "DMDRS.ORA_INS_23435"
FROM "2024-02-03 00:00:00" TO "2024-02-08 23:59:59"
场景:Oracle 到 DM8 同步链路,目标端 DMDRS 打印错误后主动停机。
日志:
EXE[ERROR]: DRS-9011 执行已经准备好的SQL语句失败
DB-70011 无效的转换字符串
EXE[INFO]: 保存操作(recid:20000000 siteid:1)
Isn:164712603,trxid:2814762652096001,op_id:1,
rowid:AABoRyAAEAAALxb1Amgs: syshalt!
分析步骤:
# 1. 在目标端执行程序目录中启动诊断工具
cd /data/dmdr5/bin_exec_dm8_5345
./drdgtool exec.xml
# 2. 根据日志提示指定 recid 和站点号输出错误信息
drdgtool> ERRLOG DUMP RECID:20000000 SITEID:1
# 3. 查看生成的 out.sql 文件,分析引发故障的 SQL
cat out.sql
输出结果分析:
op_id:1,trxid:2814762652096001,Isn:164712603,Ifs:0,
rowid:AABoRyAAEAAALxb1AAA,errno:-70011,
commit_Isn:16471
INSERT INTO "DMDRS"."ORA_INS_23114"("C1")
values("10000000000000000000000000000000000000000000000000000000000000000")
根据报错信息“无效的转换字符串”,检查 SQL 后发现:
DMDRS.ORA_INS_23114 中 NUMBER(38) 类型的精度范围;定位原因后,可根据具体应用场景处理该问题。
ERRLOG DUMP 命令属于 drdgtool,与 drctl 控制台工具不同,需要单独启动。ERRLOG_<站点号> 目录中存在错误日志文件;如果目录为空,则无法分析。RECID 和 SITEID 必须从 EXEC 模块运行日志中准确获取,否则无法输出对应错误信息。yyyy-mm-dd HH:MM:SS,且需确保时间范围在日志文件实际覆盖范围内。dmdba 用户有写入权限。当检查点数量持续增长且不回落时,除了常规状态查看命令,还可以使用 drdgtool 对检查点文件进行深度分析,精确定位导致检查点堆积的具体事务。
drdgtool 可以加载检查点文件,并查看其中包含的事务和操作详情,从而定位是哪个事务长时间未提交导致检查点堆积。
启动方式:
cd /data/dmdr5/bin_exec_dm8_5345
./drdgtool exec.xml
初步定位问题
在 EXEC 控制台中执行:
show exec_dm8 ckpt
观察检查点数量是否持续增长且不回落。正常情况检查点数量应保持在较低水平。
加载检查点文件
进入诊断工具后,通过 ckpt load 加载目标 EXEC 模块的检查点目录。
查看已加载文件
使用 ckpt show 查看已加载的检查点文件列表。
定位问题事务
通过 ckpt dump trx <TRXID> 输出指定事务的详细操作信息,分析是哪个事务导致检查点无法释放。
输出分析报告
诊断工具会将检查点文件内容解析为文本文件,便于进一步分析。
CKPT LOAD <PATH>
功能:加载指定目录或文件路径的检查点文件,使诊断工具能够对其进行分析。
参数说明:
| 参数 | 说明 |
|---|---|
PATH |
如果为目录,则加载目录下所有合法检查点文件;如果为文件路径,则加载指定检查点文件 |
使用示例:
# 加载目标 EXEC 检查点目录下所有文件
drdgtool> ckpt load /home/dmdrsexec/CKPT00001
LOAD CKPT FILE [1]:/home/dmdrsexec/CKPT00001/CKPT_00000000004008996999_0000000000000000000_0000000000000000000001.ckpt (pages:63, version date:20240112)
LOAD CKPT FILE [2]:/home/dmdrsexec/CKPT00001/CKPT_00000000004009046151_0000000000000000000_0000000000000000000001.ckpt (pages:62, version date:20240112)
加载指定检查点文件:
drdgtool> ckpt load /home/dmdrsexec/CKPT00001/CKPT_00000000004008996999_0000000000000000000_0000000000000000000001.ckpt
预期输出:
LOAD CKPT FILE [1]:/home/dmdrsexec/CKPT00001/CKPT_00000000004008996999_0000000000000000000_0000000000000000000001.ckpt (pages:63, version date:20240112)
CKPT SHOW
功能:查看所有已加载的检查点文件及其文件 ID 序号。
使用示例:
drdgtool> ckpt show
预期输出:
CKPT FILE [ID:1]:4008996999-0-1 pages:63 size:4224 KB
CKPT FILE [ID:2]:4009046151-0-1 pages:62 size:4864 KB
CKPT DUMP FILE [<FILEID>]
功能:将检查点文件内容输出为文本格式,便于查看文件内部详细数据。输出文件路径与检查点文件相同,以 .txt 作为后缀。
参数说明:
| 参数 | 说明 |
|---|---|
FILEID |
CKPT SHOW 命令结果中显示的检查点文件 ID 序号,如果不配置则输出所有 |
使用示例:
# 输出文件 ID 序号为 1 的检查点文件内容
drdgtool> ckpt dump file 1
输出说明:详细内容输出至检查点文件所在目录下的同名 .txt 文件中,例如:
/home/dmdr/s/exec/CKPT00001/CKPT_00000000004008996999_000000000000000000_000000000000000000000000000000000000000000000000000000000000001.txt
CKPT DUMP TRX <TRXID>
功能:在已加载的检查点文件中,根据指定事务 ID 查找并输出该事务的详细操作信息。这是定位“哪个事务导致检查点堆积”的关键步骤。
参数说明:
| 参数 | 说明 |
|---|---|
TRXID |
事务 ID,可通过 show exec_dm8 trx 命令获取当前活动事务的 ID |
命名规则:输出文件命名为:
trx_<trxid>_<commit|active>_<objmd5>.txt
其中:
commit|active:标识该事务是已提交事务还是活动事务;objmd5:对象的 MD5 值。根据执行端分组执行策略,一个事务可能按表归类生成多个文件。使用示例:
# 输出 ID 为 9885113 的事务的详细操作信息
drdgtool> ckpt dump trx 9885113
预期输出:
详细内容输出至文件:
trx_9885113_commit_0x45A009D57DE918949574651846E8ADAD.txt
生成的文本文件中包含该事务的所有操作详情,包括:
通过分析这些信息,可以明确判断是哪个表、哪条 SQL 导致事务长时间未提交,从而针对性解决问题。
CKPT CLEAR
功能:在需要分析其他环境的检查点文件时,使用该命令重置环境,清空已加载的所有检查点文件。
使用示例:
drdgtool> ckpt clear
CKPT GET OBJMD5 <SCH> <TAB>
功能:根据模式名和表名计算 OBJMD5 值,用于在检查点文件中查找和定位特定表的事务信息。
参数说明:
| 参数 | 说明 |
|---|---|
SCH |
模式名 |
TAB |
表名 |
使用示例:
drdgtool> ckpt get objmd5 SYSDBA T1
# 1. 在 EXEC 控制台中查看检查点数量异常
show exec_dm8 ckpt
# 检查点数持续增长,超过 500
# 2. 查看当前活动事务,获取可疑事务 ID
show exec_dm8 trx
# 发现事务 ID 为 9885113 长时间未提交
# 3. 启动诊断工具
cd /data/dmdr5/bin_exec_dm8_5345
./drdgtool exec.xml
# 4. 加载检查点文件
drdgtool> ckpt load /data/dmdr5/bin_exec_dm8_5345/exec_dm8/CKPT00001
# 5. 查看已加载文件列表
drdgtool> ckpt show
# 6. 输出事务 9885113 的详细信息
drdgtool> ckpt dump trx 9885113
# 7. 分析生成的文本文件,定位具体操作
cat trx_9885113_commit_*.txt
CKPT LOAD 加载的检查点文件必须与当前分析的问题对应,否则可能定位到错误的检查点。.ckpt。如果从未执行过检查点,则无法分析。| 功能 | 命令 |
|---|---|
| 启动诊断工具 | ./drdgtool exec.xml |
| 输出指定 RECID 错误信息 | ERRLOG DUMP RECID:<RECID> SITEID:<SITEID> |
| 输出指定区间错误信息 | ERRLOG DUMP MIN:<MIN_RECID> MAX:<MAX_RECID> SITEID:<SITEID> |
| 加载检查点文件 | CKPT LOAD <PATH> |
| 查看已加载检查点 | CKPT SHOW |
| 输出检查点文件内容 | CKPT DUMP FILE [<FILEID>] |
| 输出指定事务详情 | CKPT DUMP TRX <TRXID> |
| 清空已加载检查点 | CKPT CLEAR |
| 计算表 OBJMD5 | CKPT GET OBJMD5 <SCH> <TAB> |
drdgtool 是 DMDRS 排障中非常实用的诊断工具,核心能力可以概括为两条线:
错误日志分析线
通过 ERRLOG DUMP,结合从“保存操作”日志中提取的 RECID 和 SITEID,定位入库失败的 SQL、错误码和具体数据。
检查点分析线
通过 CKPT LOAD / SHOW / DUMP TRX,加载检查点文件并定位长时间未提交的事务,解决检查点持续堆积问题。
实际排障时,建议先看 EXEC 运行日志和状态命令,获取 RECID、SITEID、TRXID 等关键线索,再进入 drdgtool 做精准分析。分析完成后,及时清理输出文件,避免占用过多磁盘空间。
文章
阅读量
获赞
