目录搜索

达梦 SQL 日志怎么读:把日志里的 ? 还原成真实参数 · 交互版

日志里全是 where id = ?,谁也复现不了现场。dmsqlq 把 PARAMS 行里的真实值填回去, 输出能直接贴进 disql 跑的语句,顺带出一份「先优化哪条 SQL」的报告。单个可执行文件、不连数据库、不建表、不联网。

本机实测 v2.37 DM8 SQL 日志(dmsql_*.log) 不落库 · 零依赖 4 步全程可复制
dmsqlq PARAMS 还原 -s 报告 -o 可执行 SQL -m 只看慢的

先把它拿到手

单文件、免安装、零依赖:不装运行时、不连数据库、不建表、不联网。下完先对一遍校验值(十秒,能挡住中间人替换安装包)。
平台下载大小
Windows x64dmsqlq-V2.37-windows-x64.zip2.2 MB
Linux x86_64dmsqlq-V2.37-linux-x64.zip2.1 MB
Linux arm64(鲲鹏/飞腾)dmsqlq-V2.37-linux-arm64.zip1.9 MB
校验(Linux 进解压后的目录):sha256sum -c CHECKSUMS.txt; Windows:Get-FileHash .\dmsqlq-V2.37-windows-x64.zip -Algorithm SHA256,和 CHECKSUMS.txt 里那一行比。 装进 PATH 不用手动挪:./dmsqlq install(装到当前用户 ~/.local/bin,--remove 可撤销)。

四条命令,从上不了手到能交付

命令里的目录换成你日志所在的目录,其余照抄。点任一步,右侧就是命令和真实执行输出。
1找到日志
认准 dmsql_*.log
点击查看 →
2出报告
先扫一眼有没有问题
点击查看 →
3还原参数导出 SQL
? 变回真实值,可直接执行
点击查看 →
4只要慢的
按耗时卡一道,出交付清单
点击查看 →
步骤明细 已固定

左侧点一步,这里显示该步的命令和真实执行输出。点同一块可取消固定,按 Esc 也可。

输出来源:dmsqlq v2.37(go1.27.1 windows/amd64),命令与屏幕输出是本机实跑取的。 演示用的是一份合成样例日志;性能与还原率数字来自工具文档中的现网实测(1.03 GB 单文件、以及 14 个来源 13.9 GB 全量),页面里都标了样本。

日志默认落在实例目录的 log 下,文件名形如 dmsql_DMSERVER_20260910.log:

ls /opt/dmdbms/data/DAMENG/log/dmsql_*.log
三个不要认错:
  • dmsql_*.log —— 要的就是这个(SQL 日志)
  • dm_*.log —— 实例事件日志,不是它
  • dmtrc_*.log —— 跟踪日志,也不是它
机器上没有?说明 SQL 日志没开或没采到,看问题区第一条。

一条命令,HTML 报告自动生成并用浏览器打开:

dmsqlq D:\dmsql_log -s
屏幕上长这样(-S 是不出文件、只在屏幕扫一眼的版本):
dmsqlq 2.37 统计报告   2026-10-31 00:45:14
────────────────────────────── 概览 ──────────────────────────────
  ★ 头号问题:累计耗时最高的是一类语句(600 次 / 累计 18.03s,
    占语句总耗时的 89.2%)—— 从它开始优化收益最大。
  日志文件         1 个(0.2 MB)
  SQL 事件         686 条
  参数还原         600 成功 / 86 待还原  (87.46%)
  扫描耗时         7ms → 36 MB/s
  日志时段         2026-09-10 09:00:00 → 09:09:59(跨度 10.0 分钟)
────────────── 优先优化推荐 Top2(按影响占比排序) ───────────────
    1 [优先] 影响占比 89.2%  次数 600  平均 30ms  累计 18.03s
      问题信号:SELECT * 取全字段(直接查基表)
      建议动作:只取需要的列 —— 覆盖索引时才可能免回表
      语句样例:SELECT * FROM t_rim_invoice WHERE fbill_id = 'dac000000' AND status = 0
注意它排的是累计耗时占比,不是「单次最慢」——一天只跑一次的慢查询不该排在高频慢查询前面。

把 ? 换成真实值,写成能直接执行的 .sql:

dmsqlq D:\dmsql_log -o out.sql
out.sql 里长这样:
-- 2026-09-10 09:00:00 · [SEL] · 0.1ms · SYSDBA, · trxid:3816438, · SAMPLE
SELECT * FROM t_rim_invoice WHERE fbill_id = 'dac000000' AND status = 0;

-- 2026-09-10 09:00:00 · [UPD] · 0.5ms · SYSDBA, · trxid:3816438, · SAMPLE · /*未找到匹配参数: 占位符2个*/
update ACCOUNTS set BALANCE = BALANCE + ? where ACCT_ID = ?;
两条对照看就懂了:第一条参数填好了,第二条工具明说了「没找到参数」而不是假装还原成功 —— 这类行多半是采集侧没记下 PARAMS(见问题区)。

只想看超过 1 秒的、按耗时倒序取最慢 20 条:

dmsqlq D:\dmsql_log -m 1000 -B 20 -o slow.sql
实际输出(样例取最慢 3 条):
-- 2026-09-10 09:09:59 · [SEL] · 60ms · SYSDBA, · trxid:3816637, · SAMPLE
SELECT * FROM t_rim_invoice WHERE fbill_id = 'dac000599' AND status = 5;

-- 2026-09-10 09:09:58 · [SEL] · 59.9ms · SYSDBA, · trxid:3816637, · SAMPLE
SELECT * FROM t_rim_invoice WHERE fbill_id = 'dac000198' AND status = 0;
要发给开发商当优化清单,加 -e 交付_202609.xlsx 直接出 Excel(按累计耗时降序标好优先级)。

现网实测:大到什么程度还扛得住

数字来自工具仓库文档里的实测记录,样本与版本都列在下面,能自己复核。
样本实测结果说明
单文件 1.03 GB 现网日志
334 万条记录 / 92 万 SQL 事件
2.26 s
≈ 455 MB/s(单线程)
输出 46.8 万条可直接执行 SQL;参数还原成功率 97.8%。热数据单文件实测 549 MB/s
7 个日志 7.3 GB(冷盘) -j 1 → 99 MB/s
-j 4 → 157 MB/s
-j 8 → 146 MB/s
并发甜点在 4;到 8 已经撞上磁盘读带宽,再加没用
13.9 GB 全量(14 个来源) 锁等待 1,446 次
最长 1.71 s
顺带给出被争抢最狠的对象(表 10175:1,156 次、占全部等待 80%),拿 table id 反查字典即可定位
一句话结论:这个活是 I/O 型的,CPU 从来不是瓶颈 —— 否则单线程跑不到 549 MB/s。 所以「外面包一层 rg 会不会更快」在本任务上站不住:真正花钱的是磁盘读和 gzip 解压,不是匹配。

常见问题:只有卡住了才需要往下看

大概率是没采集到,不是没发生。工具会直接把这件事挑明:

  采集缺口   缺位号 29:本批日志无事务/锁事件行(TRX: / DLCK / LOCK_TID 全为 0)
             → 「锁等待」「长事务」「TPS」是没采集到,不是没发生

判据很硬:29 位号一旦开启,事务事件行必然大量出现,不可能恰好是 0。 要这一维度就在 sqllog.ini 的 SQL_TRACE_MASK 里打开 29 重采; 短期替代是在库上查 V$TRXWAIT / V$LOCK。

工具还会顺手做一份采集配置体检:缺 28 就没有参数行,缺 27 就没有原始语句,缺 23 就没有报错语句 —— 这类「查不出来」的问题,第一嫌疑永远是采集侧配置,不是解析器。

因为「没还原」和「还原错了」是两种完全不同的后果:前者你知道要手工补,后者你会拿着一条假 SQL 去复现一个不存在的现场。 所以工具把还原不出来的语句原样保留 ?,并在注释头里写明占位符个数,绝不静默编一个值进去。

常见原因:这条语句执行前日志里根本没有对应的 PARAMS 行(采集侧没记,位号 28); 或者是日志被截断、跨文件的会话块不匹配。

不会。并发只作用于多个文件 / 压缩包内的多个条目;单个大文件开满核也没用(实测 -j 1 与 -j 30 同速)。 在库服务器上跑建议 -j 2~4:解析只吃本机 CPU 和磁盘读,留几核给数据库实例比抢那几秒重要。

先说清楚:DMLOG 是这条路上的先行者,从零到一把「SQL 日志能分析」这件事做成了, 后来者(包括 dmsqlq)都是站在它提供的思路和口径上往前走的。下面只讲形态差异,不是谁替代谁:

维度官方 DMLOG 8.183dmsqlq
运行方式 需要 DM 分析库 + 32K 页 + dmlog.properties + JDBC 单二进制,dmsqlq .
结果落地 在被分析的库里 DROP/CREATE 6 张表 直接出 SQL 文本文件(不落库)
参数含 ? 的语句 因「值里含 ?」整条放弃(同一批现网日志实测还原率 10.9%) 继续还原(同批 97.8%)
值里带逗号 会静默切掉前缀仍标记成功 实测 14.9 万条含逗号/含引号的值全部完整

怎么选:要长期建库做趋势分析、有专门的 analys 库 → DMLOG 那套仍然合适; 要临时拿一份现网日志、几分钟内出结论、且绝不能在生产库上建表(尤其不能出现 LOG_COMMIT 同名被 DROP 的风险)→ 用不落库的这一支。

没做的事也说明白:本次没有对 DMLOG 做计时实测,所以这里不引用任何耗时对比,只比有实测支撑的维度。

都不。单个可执行文件,不连数据库、不建表、不装运行时、不联网,只读日志文件写结果文件。 dmsqlq install 也只是把二进制放进用户级目录并修 PATH(不动 /usr、不碰其他账号), --remove 整套撤销。

直接敲 dmsqlq 不带参数就是向导,五问(日志在哪 / 要什么结果 / 时间范围 / 耗时下限 / 操作类型), 每一步回车就是推荐值,最后还会把等效命令行打印出来,下次照着敲就行:

① 日志在哪里?
  * 1) D:\dmsql_log   (7 个日志/压缩包)
    2) 手动输入其他路径…
② 想要什么结果?  1) HTML 统计报告  2) 只在屏幕上看统计  3) 导出全部可执行 SQL  4) Excel 交付件
...
等效命令(以后可跳过向导直接用):
    dmsqlq D:\dmsql_log -s

顺带一提:TAB 补全会在首次交互运行时自动装好,选项和路径都能补。

卡在哪一步了?

把报错原文贴出来,比描述现象有用得多。
要我微信?点开看二维码(不点也行)
微信二维码
扫了备注「达梦」
不备注我也加
贴什么最有帮助

① 完整报错或异常输出(含工具提示的「采集缺口」行);
② 你执行的那条命令原文;
③ dmsqlq --version 的输出与操作系统 —— 版本不同,行为可能不同。

不要贴什么

生产库的真实日志全文、客户表结构、连接串与口令。定位问题不需要这些 —— 先用 -m / -B 把范围卡小。

邮件:jiang-chuang@qq.com

安装包与 issue 都在 dm-tools 发布仓(只放编译好的包)。

← 返回指南索引