Db Explorer

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

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

安装与下载

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

Skill 说明

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


DB Explorer

通过终端连接数据库,运行查询,探索数据结构,并导出数据。

使用场景

在以下情况激活本技能:

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

支持的数据库

数据库CLI 工具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 开启事务,展示结果后,再询问是否提交 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 锁机制 — 仅允许一个写入者;建议启用 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

已收录 8 个 Skill

相关推荐