使用 dh-db-cli 命令查询和诊断数据库。覆盖档案列表、连接自检、只读 SQL、库表结构与索引、只读 EXPLAIN 执行计划、脱敏采样、枚举与基数,支持 MySQL、PostgreSQL、SQLite、Doris、达梦、人大金仓等 18 种数据库;也用于安装升级 dh-db-cli、创建或修复 db-profiles.json 与 .env,以及排查连接失败、权限错误、查询超时、锁等待、慢 SQL、数据不一致等问题的分层诊断。任何写操作必须先展示 SQL 并得到用户明确确认。

dh-db-assistant 是技能名称,底层执行命令行工具 dh-db-cli。它是无状态工具:每次执行都是独立进程,读取 db-profiles.json 与同目录 .env,连接数据库、执行一条语句、断开退出。它不做慢日志采集、监控或索引推荐,只是数据库客户端。
schema / table 命令报错,需要绕过改用系统表查询。dh-db-cli,检查 Node、npm、@szhn registry,创建或修复 db-profiles.json 与 .env。任何数据库操作之前先跑完这一节,检查不通过时停止并向用户说明卡在哪一项。
| 检查项 | 命令 | 通过标准 |
|---|---|---|
| Node.js | node --version | 主版本 ≥ 20 |
| npm | npm --version | 可执行 |
| CLI | dh-db-cli --version(Windows 再试 dh-db-cli.cmd --version) | 输出版本号 |
@szhn 源 | npm config get @szhn:registry | https://npmmirror.digitalhainan.com.cn/ |
npm config set @szhn:registry https://npmmirror.digitalhainan.com.cn/
npm i -g @szhn/dh-db-cli
dh-db-cli --version安装失败时保留原始错误并按技能目录 references/setup.md 的排错表处理,不用 sudo 或 --force 绕过。
dh-db-cli.cmd 或 node <repo>/dist/cli.js。CLI 不保存任何状态。除非 profiles 位于默认位置,否则每条命令都要带 --profiles <path>,不要假设上一条命令的路径会延续。
--profiles > 环境变量 DB_PROFILES_FILE > 当前目录 ./db-profiles.json > ~/.dh-db/profiles.json。找到后记下绝对路径,后续每条命令显式带上;只为找文件做小范围检查,不做全盘搜索。query。.env:只判断是否存在(test -f <dir>/.env && echo exists),不读取、不打印内容。.env 缺失时提示 ${...} 变量会解析失败,并询问是否按模板生成空值 .env 由用户填写;不要直接把缺变量当成“连接失败”。${ENV_VAR} 占位,不写进 profiles,也不要让用户把密码发到对话里。dh-db-cli profiles --profiles <path> --json # 元数据,不含账号密码
dh-db-cli check --profiles <path> --json # 逐档案连接自检errorType 分流:missing-env(.env 缺变量或变量名不一致)、config(JSON / 字段 / 端口 / 档案名)、timeout(网络不可达或超时)、connect(认证失败、端口错误、驱动未安装)。字段说明、各数据库模板与安装排错见技能目录 references/setup.md。
这些规则优先于用户的临时要求:
SELECT / SHOW / DESCRIBE / EXPLAIN;用户未明确要求写入时不执行任何 DML / DDL。INSERT / UPDATE / DELETE / DDL 都必须先走确认流程,得到明确同意后再执行。explain 只生成计划不执行 SQL,query 会拦截 EXPLAIN ANALYZE,不要用注释或改写绕过;需要真实耗时由 DBA 或用户在专用客户端完成。.env 或密码;命令参数中不出现密码。db-profiles.json / .env 只在用户同意后创建或修改;设置 registry、全局安装 CLI 前先说明影响;禁止 sudo 和 --force。--max-rows 和 SQL LIMIT;--max-rows 是返回后截断,不是数据库侧 LIMIT。--timeout,避免长时间占用连接。ANALYZE / VACUUM / OPTIMIZE / KILL / FLUSH / ALTER SYSTEM 会改变实例或统计信息,不属于只读诊断。COUNT(*) 或无 LIMIT 扫描。1. 发现连接档案
dh-db-cli profiles --json从返回的 profiles 中选择档案,不要猜档案名;存在多个候选(同类库的测试 / 生产档案)时先问用户。注意 permissionMode:safe 只读、readwrite 可增删改、full 含 DDL。需要连多个库时逐个 --profile 调用。
2. 验证连通性
dh-db-cli check --profiles ./db-profiles.json --json # 全部档案
dh-db-cli query --profile <name> --sql "SELECT 1" --timeout 10000 --jsoncheck 没有 --profile 参数。失败时看 errorType。
3. 看结构
dh-db-cli schema --profile <name> --json # 库表概览
dh-db-cli table <table> --profile <name> --json # 列、主键、索引、外键
dh-db-cli table <table> --profile <name> --refresh --json # 结构可能已变化时强制刷新表很多时 schema --json 可能很大,优先按需查 table <name>,避免把整个 schema 塞进上下文。
4. 执行只读查询
dh-db-cli query \
--profile <name> \
--sql "SELECT id, name FROM orders WHERE user_id = 123 LIMIT 100" \
--max-rows 100 --timeout 15000 --json--json;展示给用户时可省略,CLI 输出对齐表格。--file query.sql 或 stdin。metadata.truncated 为 true,并带 totalRows / returnedRows,此时应告知用户并收窄条件,不要假装拿到全量数据。5. 只读执行计划
dh-db-cli explain --profile <name> --sql "SELECT * FROM orders WHERE user_id = 123" --json会自动加各方言的只读 EXPLAIN:PostgreSQL / Kingbase EXPLAIN (FORMAT JSON)、MySQL 系 EXPLAIN FORMAT=JSON、Doris 与 ClickHouse 文本 EXPLAIN、达梦 EXPLAIN FOR、SQLite EXPLAIN QUERY PLAN。Oracle、SQL Server、MongoDB、Redis 不支持,报错即止,不要用 query 伪造。
6. 看数据分布与样本
dh-db-cli sample <table> --profile <name> --limit 3 --json # 脱敏样本,1-10 行
dh-db-cli enum <table> <column> --profile <name> --count --json # 枚举/基数,附带出现次数用于判断选择性、数据倾斜或枚举范围。sample 的敏感列会被脱敏,但不要把生产数据外传。
用户明确要求写入时按顺序执行:
UPDATE / DELETE 先用同条件只读查询展示影响行数;无 WHERE 的更新删除、DROP、TRUNCATE 必须警告不可回滚。affectedRows、耗时和错误;写操作超时后不要自动重试,先确认数据库实际状态。先分层定位
| 层 | 典型现象 | 首个只读检查 |
|---|---|---|
| 配置层 | 找不到 profiles、档案不存在、缺环境变量 | profiles --json,对比当前进程环境变量 |
| 连接层 | connection refused / timeout / 认证失败 | check --json、SELECT 1、version() |
| 权限层 | permission denied、操作被拒绝、只读事务 | 当前用户 / 角色、对象权限 |
| SQL 层 | 表 / 列不存在、语法错误、类型不匹配、编码错误 | 错误原文 + information_schema |
| 计划层 | 慢、全表扫描、索引未命中、统计过期 | table、explain、统计视图 |
| 锁层 | 一直等待、死锁、长事务、连接堆积 | pg_stat_activity / innodb_trx / V$SESSION |
| 数据层 | 查不到、重复、时区错、租户 / 状态过滤、软删除 | 计数、枚举、样本、业务字段 |
| 实例层 | 连接数满、磁盘满、主从延迟、CPU / IO 高 | 连接数、复制状态、磁盘与日志 |
同一现象可能跨层。例如“查询超时”可能是网络、锁等待、统计信息过期或结果集过大,不要只调大 timeout。
固定证据:profile 名 / 数据库类型 / 库名 / 版本、发生时间与时区、完整 SQL 与参数、原始错误、影响范围、最近变更。证据不足就先做只读查询,不凭经验断言根因。
给出结论:列 1-3 个最可能假设并按优先级排序,每个配一条可证伪的只读查询;一次只改一个变量,结论区分“已证实”与“未证实”。诊断报告固定包含:结论(含置信度)、证据、分析、建议(含风险与回滚)、待确认。
Kingbase 已知兼容问题:schema / table 报 return type mismatch in function declared to return integer,是部分版本对全量 information_schema.columns 的兼容问题,--refresh 无效。改用按表查询 information_schema.tables / information_schema.columns(只取必要字段)与 pg_indexes。
方言级的连接、锁、统计、复制、慢查询只读 SQL 见技能目录 references/diagnostics.md;执行前确认只读、带 LIMIT、带 --timeout、有相应权限。
table <name> --json,检查索引、列类型和预估行数。explain --json,重点看:全表 / 全索引扫描;复合索引列顺序是否匹配过滤、连接、排序;过滤列被函数包裹、隐式类型转换、前导 % 的 LIKE;连接顺序与回表;临时表、排序、聚合;预估行数与表规模是否明显不符。pg_stat_user_tables.last_analyze、SHOW TABLE STATUS),过期时先说明影响,同意后再 ANALYZE。enum / sample 判断过滤条件的选择性与数据倾斜。explain 验证。| 命令 | 用途 | 关键参数 |
|---|---|---|
profiles | 列出档案(不含密码) | --profiles、--json |
check | 全部档案连接自检 | --profiles、--timeout、--json |
query | 执行单条 SQL | --profile、--sql / --file / stdin、--max-rows、--timeout、--json |
schema | 库表概览 | --profile、--refresh、--json |
table <name> | 单表详情 | --profile、--refresh、--json |
explain | 只读执行计划 | --profile、--sql / --file / stdin、--json |
sample <table> | 脱敏样本 | --profile、--limit 1-10、--columns、--json |
enum <table> <column> | 枚举 / 基数 | --profile、--limit 1-100、--count、--json |
--profiles 解析顺序:参数 > DB_PROFILES_FILE > ./db-profiles.json > ~/.dh-db/profiles.json;--profile 解析顺序:参数 > DB_PROFILE > defaultProfile > 唯一档案。
EXPLAIN ANALYZE。ANALYZE / VACUUM / OPTIMIZE / KILL / FLUSH / ALTER SYSTEM 等维护命令。.env;不修改 MCP / 客户端配置。