Db Explorer

支持多数据库连接与查询,可查看表结构、导出数据并诊断性能问题。

已扫描
适合谁
后端开发工程师、数据库管理员
不适合谁
无数据库权限的普通用户、未配置本地数据库客户端的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @lrg913427-dot/db-explorer-hermes

Skill 说明

命令、参数、文件名以原文为准

DB Explorer

连接数据库、执行查询、探索数据结构并导出数据——全部通过终端完成。

何时使用

在用户提出以下需求时激活此技能:

  • 说“检查数据库”、“查询DB”、“给我看看数据”
  • 想查看表结构、行数或样本数据
  • 需要将数据导出为 CSV/JSON 格式
  • 想查找慢查询或检查数据库健康状态
  • 提及数据库连接字符串或数据库名称

支持的数据库

数据库命令行工具macOS 安装方式Linux 安装方式
PostgreSQLpsqlbrew install postgresqlapt install postgresql-client
MySQLmysqlbrew install mysqlapt install mysql-client
SQLitesqlite3(macOS 内置)apt install sqlite3
MongoDBmongoshbrew install mongosh参见 mongodb.com/docs/shell
Redisredis-clibrew install redisapt install redis-tools

快速开始

1. 识别数据库类型

向用户询问:

  • 数据库类型(postgres/mysql/sqlite/mongo/redis)
  • 连接字符串,或主机、端口、数据库名、用户名、密码
  • 对于 SQLite:只需提供文件路径

2. 连接并探索

# PostgreSQL
psql "postgresql://user:password@host:5432/dbname" -c "\dt"           # 列出所有表
psql "postgresql://user:password@host:5432/dbname" -c "\d table_name" # 查看表详情
psql "postgresql://user:password@host:5432/dbname" -c "SELECT count(*) FROM table_name;"

# MySQL
mysql -h host -u user -p dbname -e "SHOW TABLES;"
mysql -h host -u user -p dbname -e "DESCRIBE table_name;"
mysql -h host -u user -p dbname -e "SELECT count(*) FROM table_name;"

# SQLite
sqlite3 /path/to/db.db ".tables"                    # 列出所有表
sqlite3 /path/to/db.db ".schema table_name"         # 查看表结构
sqlite3 /path/to/db.db "SELECT count(*) FROM table_name;"

# MongoDB
mongosh "mongodb://user:password@host:27017/dbname" --eval "db.getCollectionNames()"
mongosh "mongodb://user:password@host:27017/dbname" --eval "db.collection_name.countDocuments()"

# Redis
redis-cli -h host -p 6379 -a password INFO keyspace
redis-cli -h host -p 6379 -a password DBSIZE
redis-cli -h host -p 6379 -a password KEYS "*"

3. 安全规则

必须遵守以下规则:

  1. 默认只读 —— 除非用户明确确认,否则绝不执行 INSERT/UPDATE/DELETE/DROP 操作
  2. 限制结果数量 —— 所有 SELECT 查询都应添加 LIMIT 100(或等效限制),除非用户要求获取全部数据
  3. 先展示再执行 —— 对任何写入操作,需显示完整的 SQL 或命令,并请求用户确认
  4. 不记录密码 —— 使用环境变量或连接字符串,避免在命令历史中暴露密码
  5. 事务安全 —— 写入操作应先用 BEGIN/ROLLBACK 包裹,展示结果后,再询问是否提交 COMMIT

4. 模式探索流程

当用户说“探索数据库”或“显示模式”时:

# 步骤 1:列出所有表
# 步骤 2:对每张表,展示字段名、数据类型和约束
# 步骤 3:显示每张表的行数
# 步骤 4:展示外键关系
# 步骤 5:生成可读的结构概览图

PostgreSQL 完整模式导出:

psql "$CONN" -c "
SELECT table_name, column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position;
"

MySQL 完整模式导出:

mysql "$CONN" -e "
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
ORDER BY TABLE_NAME, ORDINAL_POSITION;
"

5. 导出格式

将查询结果导出为常用格式:

# CSV(PostgreSQL)
psql "$CONN" -c "\copy (SELECT * FROM table_name) TO '/tmp/export.csv' WITH CSV HEADER"

# CSV(MySQL)
mysql "$CONN" -e "SELECT * FROM table_name" | sed 's/\t/,/g' > /tmp/export.csv

# JSON(PostgreSQL)
psql "$CONN" -t -c "SELECT json_agg(t) FROM (SELECT * FROM table_name LIMIT 100) t;" > /tmp/export.json

# SQLite 导出为 CSV
sqlite3 /path/to/db.db ".mode csv" ".headers on" ".output /tmp/export.csv" "SELECT * FROM table_name;" ".quit"

6. 常见诊断查询

-- PostgreSQL:表大小
SELECT schemaname, tablename, pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename))
FROM pg_tables WHERE schemaname = 'public' ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;

-- PostgreSQL:活跃连接
SELECT pid, usename, application_name, client_addr, state, query_start, query
FROM pg_stat_activity WHERE state != 'idle';

-- PostgreSQL:慢查询(超过 1 秒)
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity WHERE state = 'active' AND now() - pg_stat_activity.query_start > interval '1 second';

-- MySQL:表大小
SELECT table_name, ROUND(data_length/1024/1024, 2) AS data_mb, table_rows
FROM information_schema.tables WHERE table_schema = DATABASE() ORDER BY data_length DESC;

-- MySQL:进程列表
SHOW FULL PROCESSLIST;

性能分析

PostgreSQL 性能分析

慢查询(执行时间超过 1 秒)

psql "$CONN" -c "
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '1 second'
ORDER BY duration DESC;
"

索引使用情况

psql "$CONN" -c "
SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC LIMIT 20;
"

表膨胀检测

psql "$CONN" -c "
SELECT schemaname, tablename,
  pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS total_size,
  pg_size_pretty(pg_relation_size(schemaname||'.'||tablename)) AS table_size,
  pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename) - pg_relation_size(schemaname||'.'||tablename)) AS index_size
FROM pg_tables
WHERE schemaname = 'public'
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC LIMIT 10;
"

缓存命中率(应高于 99%)

psql "$CONN" -c "
SELECT
  sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) AS cache_hit_ratio
FROM pg_statio_user_tables;
"

MySQL 性能监控

# 慢查询
mysql "$CONN" -e "SELECT * FROM information_schema.processlist WHERE TIME > 1 ORDER BY TIME DESC;"

# 索引使用情况
mysql "$CONN" -e "
SELECT table_name, index_name, cardinality
FROM information_schema.statistics
WHERE table_schema = DATABASE()
ORDER BY cardinality DESC LIMIT 20;
"

# 表大小统计
mysql "$CONN" -e "
SELECT table_name,
  ROUND(data_length/1024/1024, 2) AS data_mb,
  ROUND(index_length/1024/1024, 2) AS index_mb,
  table_rows
FROM information_schema.tables
WHERE table_schema = DATABASE()
ORDER BY data_length DESC LIMIT 10;
"

备份与恢复

PostgreSQL

# 备份单个数据库
pg_dump "$CONN" > backup_$(date +%Y%m%d).sql

# 备份单个表
pg_dump "$CONN" -t table_name > table_backup.sql

# 恢复数据
psql "$CONN" < backup.sql

# 带压缩的备份
pg_dump "$CONN" | gzip > backup_$(date +%Y%m%d).sql.gz

MySQL

# 备份单个数据库
mysqldump -h host -u user -p dbname > backup_$(date +%Y%m%d).sql

# 备份单个表
mysqldump -h host -u user -p dbname table_name > table_backup.sql

# 恢复数据
mysql -h host -u user -p dbname < backup.sql

SQLite

# 备份数据库
sqlite3 /path/to/db.db ".backup /tmp/backup.db"

# 或直接复制文件
cp /path/to/db.db /tmp/backup_$(date +%Y%m%d).db

数据迁移辅助工具

在不同数据库间复制表数据

# PostgreSQL 导出为 CSV,再导入 MySQL
psql "$PG_CONN" -c "\copy table_name TO '/tmp/export.csv' WITH CSV HEADER"
mysql "$MYSQL_CONN" -e "LOAD DATA LOCAL INFILE '/tmp/export.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;"

模式对比

# 获取 PostgreSQL 模式的哈希值用于对比
psql "$CONN" -c "
SELECT md5(string_agg(table_name || column_name || data_type, '' ORDER BY table_name, ordinal_position))
FROM information_schema.columns
WHERE table_schema = 'public';
"

常见陷阱

  • 连接字符串包含特殊字符 — 若密码中包含 @、:、/ 等符号,请对密码进行 URL 编码。
  • SSL 要求 — 许多云数据库(如 RDS、Cloud SQL、Supabase)要求添加 ?sslmode=require--ssl-mode=REQUIRED
  • 大表导出超时 — 除非用户明确需要完整导出,否则始终使用 LIMIT 限制数据量。
  • SQLite 写锁问题 — SQLite 一次只允许一个写入操作;若需并发读取,请启用 WAL 模式:PRAGMA journal_mode=WAL;
  • MongoDB 认证数据库 — 认证有时在 admin 数据库上,而非目标数据库:?authSource=admin
  • Redis 数据库选择 — Redis 支持 16 个数据库(编号 0-15),请确认当前使用的是哪个:redis-cli INFO keyspace

连接验证步骤

连接成功后,请按以下顺序验证:

  1. 执行一条简单查询,确认连接正常。
  2. 列出表或集合,查看数据库结构。
  3. 对关键表执行计数查询,确认数据可访问。
  4. 检查缓存命中率(PostgreSQL)或慢查询列表(MySQL)。
  5. 通过测试导出验证备份功能是否可用。

环境变量支持

本技能会优先使用以下环境变量(如存在):

  • DATABASE_URL — 完整的连接字符串(优先级最高)
  • DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD — 各项独立参数
  • DB_TYPE — 数据库类型:postgres、mysql、sqlite、mongo、redis
LD
@lrg913427-dot

已收录 5 个 Skill

相关推荐