Install
openclaw skills install @thcjp/db-connectoropenclaw skills install @thcjp/db-connector核心功能: 本技能提供时使用、化工作流场景等能力。
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| input | string | 是 | 数据库设计与运维处理的输入数据或指令 |
| options | object | 否 | 附加配置选项,如模式选择、格式偏好等 |
| callback_url | string | 否 | 异步处理完成后的回调通知URL |
| 能力 | 免费版 | 付费版 |
|---|---|---|
| 基础功能 | 支持 | 支持 |
| 高清分辨率与无损输出 | 不支持 | 支持 |
| 批量生成与风格预设 | 不支持 | 支持 |
| 自定义模型微调 | 不支持 | 支持 |
| 商用版权授权 | 不支持 | 支持 |
| 多版本对比与A/B优选 | 不支持 | 支持 |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| LLM API | API | 必需 | 由Agent内置LLM提供 |
需要配置对应API Key,详见上文环境配置章节
API Key配置方式:
export API_KEY="${API_KEY:?请设置环境变量}"
配置后需重启会话或开启新终端生效。API Key应妥善保管,避免泄露到版本控制系统.
| 陷阱 | 表现 | 规避方案 |
|---|---|---|
| 连接池耗尽 | 应用静默挂起,无错误日志 | 设置最大连接数,监控连接池使用率 |
| Serverless连接泄漏 | 每次调用打开新连接 | 使用连接池代理(RDS Proxy、PgBouncer) |
| 连接阻塞Schema变更 | ALTER TABLE 等待所有事务完成 | 维护窗口期执行,或设置 lock_timeout |
| 空闲连接占用内存 | 大量空闲连接耗尽数据库内存 | 设置 idle_in_transaction_session_timeout,定期清理 |
| 陷阱(续) | 表现 | 规避方案 |
|---|---|---|
| 长事务锁膨胀 | 事务持锁过久,MVCC版本堆积 | 保持事务简短,避免事务内做HTTP调用 |
| 只读事务阻塞清理 | 只读事务仍取快照,阻塞 VACUUM | Postgres 中设置 statement_timeout,及时关闭事务 |
| 隐式自动提交差异 | 不同数据库自动提交行为不一致 | 显式使用 BEGIN/COMMIT,不依赖隐式行为 |
| 死锁 | 多事务以不同顺序锁定相同资源 | 统一加锁顺序,使用 SELECT FOR UPDATE 预锁定 |
| 丢失更新 | 读-改-写无锁导致并发覆盖 | 使用 SELECT FOR UPDATE 悲观锁或乐观锁(版本号) |
| 操作 | 风险 | 安全方案 |
|---|---|---|
| 带默认值加列 | 旧版MySQL/Postgres全表重写 | 先加 NULL 默认列,回填数据,再 ALTER 设默认值 |
| 创建索引 | 部分数据库锁写操作 | Postgres 用 CREATE INDEX CONCURRENTLY,MySQL 8+ 用 ONLINE |
| 重命名列 | 运行中应用引用旧列名报错 | 先加新列,迁移代码,再删旧列 |
| 删除列 | 活跃查询引用被删列报错 | 先部署代码变更(不再引用该列),再执行Schema变更 |
| 批量插入外键检查 | 外键约束拖慢批量插入 | 先 SET CONSTRAINTS DEFERRED,插入后重新启用 |
| 陷阱 | 风险 | 优选实践 |
|---|---|---|
| 逻辑备份锁表 | pg_dump/mysqldump 锁表或丢失并发写入 | 使用一致性快照(--snapshot 或 --single-transaction) |
| PITR不可用 | 未配置WAL/binlog保留 | 在需要之前配置WAL归档(archive_mode=on) |
| 备份未验证 | 恢复时才发现备份损坏 | 定期从备份恢复到测试环境验证 |
| 副本备份不一致 | 复制延迟导致备份与主库不一致 | 从副本备份后验证一致性,或从主库一致性快照备份 |
| 陷阱(续)(续) | 表现 | 规避方案 |
|---|---|---|
| 复制延迟导致脏读 | 从副本读取到过期数据 | 读取前检查复制延迟(pg_stat_replication) |
| 副本写入破坏复制 | 写入副本导致复制中断 | 设置副本为只读(hot_standby=on + default_transaction_read_only=on) |
| Schema变更破坏复制 | 分别在主从执行Schema变更 | 通过复制通道同步Schema变更,不手动在副本执行 |
| 故障转移脑裂 | 两个主库同时接受写入 | 使用 fencing/STONITH 机制防止旧主库继续写入 |
| 提升副本后连接未切换 | 应用仍连旧主库 | 应用层实现重连逻辑,或使用VIP/DNS自动切换 |
| 问题 | 原因 | 优化方案 |
|---|---|---|
| N+1查询 | ORM懒加载关联关系 | 预加载(eager load)或批量查询 |
| 外键缺索引 | JOIN和级联删除全表扫描 | 为外键列创建索引 |
| 大IN子句变慢 | IN (1,2,...,10000) 性能下降 | 拆分为多个查询或使用临时表JOIN |
COUNT(*) 慢 | 大表全表扫描计数 | 使用近似计数(pg_class.reltuples)或缓存结果 |
| 无界SELECT | SELECT * FROM huge_table 导致OOM | 必须加 LIMIT,或使用游标分批读取 |
| 陷阱 | 后果 | 保障方案 |
|---|---|---|
| 应用层唯一检查竞态 | 并发下产生重复数据 | 使用数据库唯一约束(UNIQUE) |
| CHECK约束被禁用 | 数据逐渐腐化 | 保持 CHECK 约束启用,不做"灵活性"让步 |
| 外键缺失致孤儿行 | 引用完整性破坏 | 先清理孤儿行,再添加 FOREIGN KEY 约束 |
| 时区混乱 | 跨时区显示错误 | 存储 UTC,显示时转换(TIMESTAMPTZ) |
| 浮点数存金额 | 舍入误差导致账目不平 | 使用 DECIMAL 或整数分(INTEGER 存分) |
| 限制 | 阈值 | 规划方案 |
|---|---|---|
| 单表行数过多 | 超过 1 亿(100M)行 | 提前规划分片策略,按时间或哈希分区 |
| Autovacuum滞后 | 死元组比率过高 | 监控 pg_stat_user_tables 的死元组比率,调优 autovacuum 参数 |
| 统计信息过期 | 批量导入后查询计划变差 | 大批量导入后手动执行 ANALYZE |
| 连接数非线性扩展 | 连接越多锁竞争越激烈 | 使用连接池限制最大连接数(PgBouncer) |
| 磁盘IOPS瓶颈 | I/O等待先于CPU成为瓶颈 | 监控 iostat 的 I/O wait,使用SSD或Provisioned IOPS |
结果验证: 任务完成后,查看输出确认状态。成功时返回摘要和数据;失败时根据错误信息排查,参考恢复章节获取修复步骤.
-- 错误做法(旧版Postgres会全表重写,锁表数小时):
-- ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'pending';
# ...
-- 安全做法(分三步):
-- 领先步: 添加NULL列(瞬时完成,不锁表)
ALTER TABLE orders ADD COLUMN status VARCHAR(20);
# ...
-- 第2步: 分批回填数据
UPDATE orders SET status = 'pending' WHERE id BETWEEN 1 AND 100000;
UPDATE orders SET status = 'pending' WHERE id BETWEEN 100001 AND 200000;
# ...
-- 第3步: 设置默认值与非空约束
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 'pending';
ALTER TABLE orders ALTER COLUMN status SET NOT NULL;
-- Postgres: CONCURRENTLY 不阻塞写入(但不能在事务块中使用)
CREATE INDEX CONCURRENTLY idx_orders_customer_id ON orders(customer_id);
# ...
-- MySQL 8+: ONLINE DDL
ALTER TABLE orders ADD INDEX idx_customer_id (customer_id), ALGORITHM=INPLACE, LOCK=NONE;
# 错误: N+1查询(100个订单 = 101次查询)
orders = Order.objects.all() # 1次查询
for order in orders:
print(order.customer.name) # 每次循环1次查询
# ...
# 正确: 预加载(2次查询)
orders = Order.objects.select_related('customer').all() # JOIN一次查出
for order in orders:
print(order.customer.name) # 无额外查询
-- 错误: 读-改-写无锁,并发下丢失更新
SELECT balance FROM accounts WHERE id = 1; -- 读到 balance=100
-- 另一事务同时读到100,各自扣减20
UPDATE accounts SET balance = 80 WHERE id = 1; -- 丢失了另一事务的扣减
# ...
-- 正确: 使用 SELECT FOR UPDATE 悲观锁
BEGIN;
SELECT balance FROM accounts WHERE id = 1 FOR UPDATE; -- 加行锁
UPDATE accounts SET balance = balance - 20 WHERE id = 1;
COMMIT;
-- 错误: 浮点数存金额(舍入误差)
CREATE TABLE bad_orders (total FLOAT); -- 0.1+0.2 = 0.30000000000000004
# ...
-- 正确: DECIMAL 精确存储
CREATE TABLE good_orders (total DECIMAL(10,2)); -- 0.10+0.20 = 0.30
# ...
-- 或: 整数分存储
CREATE TABLE cent_orders (total_cents INT); -- 10分+20分=30分
-- 慢: COUNT(*) 全表扫描(1亿行需数十秒)
SELECT COUNT(*) FROM huge_table;
# ...
-- 快: 近似计数(毫秒级,误差约5%)
SELECT reltuples::BIGINT FROM pg_class WHERE relname = 'huge_table';
# ...
-- 或: 缓存计数
SELECT count FROM table_count_cache WHERE table_name = 'huge_table';
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
lock timeout Schema变更超时 | ALTER TABLE 等待长事务释放锁 | 设置 lock_timeout='5s',超时后避免无限等待 |
deadlock detected 死锁 | 多事务以不同顺序锁定相同资源 | 统一加锁顺序,捕获死锁异常后事务 |
too many connections 连接耗尽 | 连接池配置过小或连接泄漏 | 使用 PgBouncer 连接池,设置 max_connections 上限 |
replication lag 复制延迟 | 大事务或网络带宽不足 | 监控 pg_stat_replication.replay_lag,将大事务拆小 |
out of memory 查询OOM | SELECT * 无界查询加载全表 | 添加 LIMIT,使用游标分批读取,或增加 work_mem |
duplicate key value 唯一约束冲突 | 应用层检查与插入之间存在竞态 | 使用 INSERT ... ON CONFLICT DO NOTHING 或数据库唯一约束 |
integer out of range 整数溢出 | INT 最大值 2147483647 不足 | 改用 BIGINT(最大 9223372036854775807) |
column "x" cannot be cast automatically 类型转换失败 | ALTER COLUMN TYPE 不兼容 | 先添加新类型列,迁移数据,再删除旧列 |
A: 公式:pool_size = (核心数 * 2) + 有效磁盘数。但连接数不是越多越好——连接越多锁竞争越激烈。建议从 pool_size = 10 开始,根据监控调整。Serverless 环境必须使用 RDS Proxy 或 PgBouncer.
A: 事务应只包含数据库操作,不包含HTTP调用、文件IO等耗时操作。Postgres 中长事务会持有 MVCC 快照,阻塞 VACUUM 清理死元组。建议设置 idle_in_transaction_session_timeout = 60s.
A: 不一定。如果查询都命中索引,1亿行仍可高效运行。需要分片的信号:(1) 写入QPS超过单库极限;(2) 索引维护成本过高;(3) 维护窗口不足以完成 VACUUM。可以先尝试分区表(按时间或哈希),分片是最后手段.
A: IEEE 754浮点数无法精确表示十进制小数。0.1 + 0.2 在浮点数中等于 0.30000000000000004。大量累加后误差会累积,导致账目不平。必须使用 DECIMAL(10,2) 或整数分(INT 存分).
CREATE INDEX CONCURRENTLY 失败了怎么办?A: CONCURRENTLY 失败后会留下 INVALID 索引。需要先 DROP INDEX 删除无效索引,再重新执行 CREATE INDEX CONCURRENTLY。注意:CONCURRENTLY 不能在事务块中使用.
A: 数据库数据库 中查询 pg_stat_replication 视图:SELECT application_name, replay_lag FROM pg_stat_replication;。延迟超过30秒应告警。大事务是延迟的主要原因,建议将大事务拆分为小批次.
{
"success": true,
"data": {
"result": "数据库设计与运维处理结果",
"execution_time": "0.5s",
"metadata": {
"version": "1.0",
"processor": "db"
}
},
"execution_log": [
"解析输入参数",
"执行核心处理",
"格式化输出结果"
],
"error": null
}
| 错误现象 | 可能原因 | 诊断步骤 | 解决方案 |
|---|---|---|---|
| 数据库连接失败 | 网络问题、数据库服务未启动、认证信息错误 | 检查网络连接、确认数据库服务状态、验证认证信息 | 修复网络问题、启动数据库服务、修正认证信息 |
| 备份文件损坏 | 备份过程中出现错误、存储介质故障 | 尝试从其他备份恢复、检查存储介质状态 | 重新备份、更换存储介质 |
| 复制延迟 | 网络带宽不足、主从数据库负载不均 | 监控网络带宽、检查主从数据库负载 | 增加网络带宽、优化数据库负载 |
| 查询性能下降 | 索引失效、统计信息过时 | 执行 ANALYZE、检查索引状态 | 重建索引、更新统计信息 |
| 事务死锁 | 多事务竞争相同资源 | 检查事务日志、分析死锁原因 | 优化事务逻辑、调整锁顺序 |
| 风险项 | 等级 | 防护措施 | 验证方法 |
|---|---|---|---|
| 数据泄露 | 高 | 实施访问控制、加密敏感数据 | 定期审计访问日志、检查加密状态 |
| 未授权访问 | 高 | 限制登录尝试次数、使用强密码策略 | 监控登录尝试、定期检查密码策略 |
| SQL注入攻击 | 高 | 使用参数化查询、输入验证 | 定期进行安全扫描、测试代码 |
| 备份未加密 | 中 | 对备份文件进行加密 | 检查加密配置、定期验证加密状态 |
| 复制中断 | 中 | 配置复制心跳、监控复制状态 | 定期检查复制日志、验证复制状态 |
| 系统漏洞 | 高 | 保持系统更新、应用安全补丁 | 定期进行安全扫描、检查更新日志 |
| 数据完整性破坏 | 高 | 实施数据完整性约束、定期验证数据 | 检查约束设置、定期进行数据校验 |
| 场景 | 效率提升量化分析 | 差异化对比 |
|---|---|---|
| 连接池管理 | 通过连接池减少连接创建和销毁的开销,提升性能 | 传统方法需要频繁创建和销毁连接,效率低下 |
| 事务优化 | 通过减少事务持有时间,降低锁竞争,提升并发性能 | 传统方法可能导致长事务阻塞其他事务,降低系统吞吐量 |
| 备份验证 | 通过定期从备份恢复验证数据完整性,确保备份可用性 | 传统方法可能依赖人工检查,效率低且易出错 |
| 复制监控 | 通过实时监控复制状态,及时发现并解决复制问题 | 传统方法可能需要等待长时间才能发现问题,影响系统可用性 |
| 查询优化 | 通过优化查询语句和索引,提升查询性能 | 传统方法可能依赖经验丰富的DBA进行优化,效率低且成本高 |
| 数据完整性保障 | 通过实施数据完整性约束,确保数据一致性 | 传统方法可能依赖应用层检查,容易出现数据不一致问题 |
A1: 识别并规避数据库连接、事务、Schema变更、备份恢复、复制、查询、数据完整性与扩展性陷阱。数据库设计与运维——帮助设计和操作数据库时避免常见的扩展性、可靠性和。支持文本指令和结构化参数输入,具体格式参考使用流程章节。
A2: 是的,部分功能需要配置对应平台的API Key。请在依赖说明章节查看具体要求,并通过环境变量安全配置。
A3: 检查命令参数是否正确,确认运行环境支持exec能力。如遇权限问题,请参照错误处理章节排查。
| 操作场景 | 手动耗时 | 自动化耗时 | 效率提升 |
|---|---|---|---|
| 文件解析与提取 | 5-10分钟/个 | <5秒/个 | 60-120x |
| 批量文件处理(100个) | 8-16小时 | <5分钟 | 96-192x |
| API调用与响应解析 | 2-3分钟/次 | <1秒/次 | 120-180x |
| 多接口数据聚合 | 15-30分钟 | <10秒 | 90-180x |
| 命令执行与结果收集 | 3-5分钟/次 | <2秒/次 | 90-150x |
| 重复任务批量执行 | 因任务而异 | 线性缩减 | 5-50x |
| 错误排查与修复 | 10-30分钟 | <30秒 | 20-60x |
| 对比维度 | 数据库设计与运维 | 传统手动方式 | 通用脚本工具 |
|---|---|---|---|
| 自动化程度 | 全流程自动 | 完全手动 | 部分自动 |
| 错误处理 | 内置错误恢复 | 依赖人工经验 | 基本try-catch |
| 可复用性 | 参数化配置 | 一次性脚本 | 模板化 |
| 安全合规 | 内置安全检查 | 无安全保障 | 无安全保障 |
| 适用场景 | 识别并规避数据库连接、事务、Schema变更、备份恢复、复制、查询、数据完整性与 | 通用场景 | 通用场景 |