? 还原成真实参数 · 交互版日志里全是 where id = ?,谁也复现不了现场。dmsqlq 把 PARAMS 行里的真实值填回去,
输出能直接贴进 disql 跑的语句,顺带出一份「先优化哪条 SQL」的报告。单个可执行文件、不连数据库、不建表、不联网。
| 平台 | 下载 | 大小 |
|---|---|---|
| Windows x64 | dmsqlq-V2.37-windows-x64.zip | 2.2 MB |
| Linux x86_64 | dmsqlq-V2.37-linux-x64.zip | 2.1 MB |
| Linux arm64(鲲鹏/飞腾) | dmsqlq-V2.37-linux-arm64.zip | 1.9 MB |
sha256sum -c CHECKSUMS.txt;
Windows:Get-FileHash .\dmsqlq-V2.37-windows-x64.zip -Algorithm SHA256,和 CHECKSUMS.txt 里那一行比。
装进 PATH 不用手动挪:./dmsqlq install(装到当前用户 ~/.local/bin,--remove 可撤销)。
左侧点一步,这里显示该步的命令和真实执行输出。点同一块可取消固定,按 Esc 也可。
日志默认落在实例目录的 log 下,文件名形如 dmsql_DMSERVER_20260910.log:
ls /opt/dmdbms/data/DAMENG/log/dmsql_*.log
dmsql_*.log —— 要的就是这个(SQL 日志)dm_*.log —— 实例事件日志,不是它dmtrc_*.log —— 跟踪日志,也不是它一条命令,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
-- 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
-- 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 反查字典即可定位 |
大概率是没采集到,不是没发生。工具会直接把这件事挑明:
采集缺口 缺位号 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.183 | dmsqlq |
|---|---|---|
| 运行方式 | 需要 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 把范围卡小。
安装包与 issue 都在 dm-tools 发布仓(只放编译好的包)。