关于 postgres
用于运维 PostgreSQL 的工具技能,涵盖配置、查询计划、维护、恢复、复制、扩展、升级和故障诊断。只读采集器 pgdiag 会在考虑变更前收集有界证据。
主要功能
- 01使用 pgdiag 进行只读诊断
- 02配置与连接审查
- 03索引、查询计划和膨胀分析
- 04WAL 归档与 PITR 检查
- 05复制与故障转移指导
- 06扩展和升级规划
适用场景
- 01排查慢查询和索引使用情况
- 02检查 WAL 归档与恢复准备
- 03诊断复制延迟
- 04规划 PostgreSQL 版本升级
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ magnus919/ agent-skills --skill postgres安装后在 Claude Code 中输入/postgres确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
README.mdevals/evals.jsonreferences/00-source-index.md01-configuration.md02-indexes-and-query-plans.md03-vacuum-and-bloat.md04-backups-wal-pitr.md05-replication-and-failover.md06-extensions.md07-upgrades.md08-diagnostics.mdscripts/pgdiagtests/test_pgdiag.py详细介绍
PostgreSQL 运维
使用此技能可以安全地运维 PostgreSQL 数据库引擎:根据工作负载审查配置,查找索引和查询计划问题,管理 vacuum 和膨胀,设置并验证 WAL 归档和时间点恢复,采用可靠的故障转移方案运行复制,处理扩展,规划主版本升级,并通过证据诊断故障。这是针对一种指定工具(PostgreSQL)的工具技能。数据库方法论——跨数据库引擎的备份策略、迁移模式、SQL 分析模式——属于 data-engineering;应用层数据访问模式属于 backend-engineering;架构和数据建模属于 data-architect 和 data-engineering。Supabase 平台管理属于 supabase。
运维约定
- 任何变更前先进行只读探查。 首先检查配置、目录统计信息和日志。随附的
pgdiag脚本会收集只读证据,并以default_transaction_read_only=on打开每个会话。 - 操作前确认目标、范围和回滚路径。 无需确认即可进行只读探查。变更操作——例如执行
pg_ctl停止、提升为主库、安装扩展或运行pg_upgrade——都必须获得明确的人类指令,并且指令中要指出实例。 - 备份不等于可恢复性证据。 按计划在临时实例上验证恢复;切勿仅凭备份日志就声称可以恢复。
- 控制证据范围。 概述目录查询结果和日志摘录;切勿在对话中倾倒完整日志、
postgresql.conf或包含密码的连接字符串。 - 在交付边界进行验证。
SELECT 1的结果只能证明连接正常,不能证明运行健康;重放pg_basebackup只能证明可恢复性,不能证明今天的 WAL 正在归档。
pgdiag 脚本
scripts/pgdiag 是面向 Agent 的只读诊断收集器。它会调用 psql,以 default_transaction_read_only=on 打开每个会话,并输出有界的 JSON。即使没有服务器且未安装 psql,也可以使用 --help。
scripts/pgdiag --help # no cluster needed
scripts/pgdiag --json # all checks, machine-readable
scripts/pgdiag --host db1 --dbname app --json
scripts/pgdiag --check identity --check wal_archive --json
scripts/pgdiag --plan-for "SELECT * FROM orders WHERE id = 42" --json
退出代码:0 表示正常,1 表示运行时错误/收集错误,2 表示用法错误,127 表示未找到 psql 二进制文件,124 表示超时。--check 会运行指定子集;--plan-for 会为一条只读语句添加 EXPLAIN (FORMAT JSON) 查询计划。脚本不会执行任何更改数据的语句;服务器端的只读会话设置会拒绝任何意外执行的此类语句。
运维流程
- 识别实例:版本、恢复状态、配置文件位置、连接字符串格式,以及该实例是主库还是备用库。
- 收集证据:运行
pgdiag --json,检查配置、连接、索引使用情况、膨胀信号、WAL 归档、恢复、复制和数据库大小。 - 根据症状分诊:将报告的问题与证据对应起来(查询缓慢 → 查询计划和索引使用情况;备份停滞 → 归档器;数据不一致 → 复制延迟)。
- 经确认后操作:获得人类指令后,执行范围明确、影响受限的变更,并事先说明回滚路径。
- 验证:重新运行相关检查,并确认交付边界上的可观察结果。
配置
- 运行时的事实来源是
pg_settings,而不是配置文件:SHOW/current_setting()会反映重新加载和覆盖项(ALTER SYSTEM、命令行-c、环境变量PGOPTIONS)。pgdiag的config检查会列出对运维人员至关重要的值。 - 了解哪些更改需要重新加载(
pg_ctl reload/SELECT pg_reload_conf()),哪些需要重启:内存相关参数(shared_buffers、max_connections、wal_level、max_wal_senders)需要重启;大多数调优和日志参数可以重新加载。 - 检查
log_destination、logging_collector和log_min_duration_statement,确保在需要慢查询证据之前就已记录;启用track_io_timing=on后,pg_stat_database中的 I/O 计时才有意义。 - 连接压力:将
pg_stat_activity的状态计数与max_connections对比;连接池器属于应用架构决策,适用于 backend-engineering。 - GUC 的设置理由、重新加载与重启对照表,以及参数更改审查模式:
references/01-configuration.md。
索引与查询计划
- 先看证据:
pg_stat_user_indexes会显示idx_scan/idx_tup_read/idx_tup_fetch;如果某个表存在筛选条件,却被顺序扫描且seq_tup_read很大,那么它可能缺少索引。 - 对实际工作负载查询执行
EXPLAIN (ANALYZE, BUFFERS),比凭猜测判断更可靠;比较估算行数与实际行数——差异很大,说明规划器统计信息可能已过时(pg_statistic新鲜度问题),或某个参数设置不当(random_page_cost、effective_cache_size)。 - 未使用的索引(长时间窗口内
idx_scan = 0)会增加写入和维护成本;无效索引(pg_index.indisvalid = false)会在下次 vacuum 时被删除,应有计划地修复或移除。 - 索引选择(BRIN 与 btree、部分索引、覆盖索引)属于模式设计,应由 data-architect 负责;本技能负责衡量和运维现有索引。
- 查询计划解读、索引用法 SQL 探查和计划审查清单:
references/02-indexes-and-query-plans.md。
Vacuum 与膨胀
- Vacuum 会回收死元组并刷新规划器统计信息;autovacuum 应自动完成这些工作。确认它确实在运行:检查
autovacuum=on、工作进程数量,以及各表relfrozenxid/n_dead_tup的变化趋势。 - 膨胀是表文件大小与有效数据之间的差距:
pg_stat_user_tables.n_dead_tup的增长速度超过 vacuum 的运行频率,是最主要的信号;因 vacuum 失败或跳过而产生的堆膨胀,则表现为relpages较大而有效元组较少。 - 如果 autovacuum 跟不上,应安排有针对性且经过确认的维护窗口(对指定表执行
VACUUM,而非不加区分地全面执行),然后查明 autovacuum 落后的原因(长事务、连接饱和、工作进程资源不足)。 - 切勿将
VACUUM FULL视为例行操作:它会重写表、获取锁,并且需要维护窗口和经验证的备份方案。 - 膨胀测量探查和 autovacuum 调优模式:
references/03-vacuum-and-bloat.md。
备份:WAL 归档与时间点恢复
- 恢复模型:基础备份加上连续的 WAL 归档可实现时间点恢复(PITR)——还原基础备份,并重放归档的 WAL,直到目标时间。
- 恢复目标分为两类:基于时间(
pitr|point.in.time模式是这一类的简写——例如“昨天 02:00”这样的墙上时钟时间目标)和基于位置(特定的 LSN 或时间线标记)。两者都是有效的recovery_target输入。 - WAL 归档就绪状态要求
archive_mode=on、archive_command正常工作且归档进程健康:pg_stat_archiver中的archived_count必须持续增长,failed_count保持稳定,且last_failed_wal为空或记录较早。 - 归档和流复制都要求
wal_level为replica(或更高);更改该设置需要重启。 - 使用
pg_basebackup(或专用工具)进行备份,并确保与 WAL 一致:为每个备份添加标签,记录其pg_stop_backup()LSN / 时间线,并先使用归档测试还原,再信任该备份。 - PITR 流程、
recovery_target选项、还原到某个时间点的步骤,以及 RPO/RTO 的考量方式(方法见 data-engineering):references/04-backups-wal-pitr.md。
复制与故障转移
- 流复制:备用节点通过复制槽连接并持续接收 WAL;使用
pg_stat_replication(state=streaming、replay_lsn保持同步、replay_lag较小)以及备用节点的恢复状态进行验证。 - 应审慎决定采用同步还是异步复制:同步复制(
synchronous_standby_names)以提交延迟换取持久性保证;异步复制在故障转移时可能丢失最近提交的事务。 - 故障转移计划不只是执行
pg_ctl promote:还应明确由谁提升备用节点、如何重定向客户端、旧主节点恢复后如何处理,以及如何验证数据(提升时的延迟、时间线分歧)。 - 提升是一次变更——请先确认目标和范围。使用复制管理工具(Patroni、repmgr)时,应使用其切换命令,而不是手动提升;将旧主节点重新加入为备用节点,绝不可让两个主节点同时写入。
- 流复制配置、复制槽管理、延迟测量和故障转移操作手册:
references/05-replication-and-failover.md。
扩展
- 先盘点:
pg_extension(已安装)和pg_available_extensions(可用)会告诉你当前有哪些扩展,以及磁盘上有哪些版本;pgdiag的extensions检查也会执行此操作。 - 安装扩展会更改共享目录,而且某些扩展会以难以撤销的方式更改数据库——安装扩展是一项需要回滚方案的变更,而不是条件反射式地执行
CREATE EXTENSION。 - 主版本升级通常需要在新的二进制文件上重新安装或重新构建扩展(例如 PostGIS、pgvector);执行
pg_upgrade前,请查看每个扩展的升级说明。 - 受信任的扩展可由非超级用户安装到其自己的数据库中;扩展策略和共享库可用性属于 platform-engineering 的基础设施决策。
- 常见扩展、生命周期及版本升级注意事项:
references/06-extensions.md。
升级
- 次要版本升级是原地替换二进制文件(然后重启);主要版本升级(例如,从 15 升至 16)会改变磁盘上的格式,需要使用
pg_upgrade或逻辑转储/恢复。 - 先规划升级路径:阅读整个版本跨度的发行说明和升级指南,检查扩展和不受支持的功能,选择方法(使用链接模式的
pg_upgrade,或逻辑升级),并在具有真实数据形态的临时环境中演练。 pg_upgrade是需要停机的变更操作,必须有经过验证的备份:停止写入,使用--old/--new二进制文件运行升级,在新集群上运行analyze,并在退役旧集群之前,从应用层验证。- 逻辑复制(发布者/订阅者)可作为近乎零停机的主要版本升级路径;这也是一种迁移模式,其方法详见 data-engineering。
- 版本矩阵、升级操作手册和回滚决策:
references/07-upgrades.md。
依据证据进行诊断
按证据顺序诊断:身份/版本 → 配置 → 连接 → 索引使用情况和执行计划 → 清理/膨胀 → WAL 归档 → 复制 → 扩展。
pgdiag --json可在一个有界载荷中收集第一层证据;任何变更后,都要重新运行受影响的检查。- 查询缓慢 → 使用
EXPLAIN (ANALYZE, BUFFERS)和pg_stat_user_indexes/seq_tup_read;调整random_page_cost之前,先检查规划器统计信息是否足够新。 - 备份停滞 → 检查
pg_stat_archiver:failed_count、last_failed_wal,以及归档目标的磁盘/网络。 - 备用服务器落后 → 检查
pg_stat_replication的延迟列、槽保留情况(pg_replication_slots),以及主服务器与备用服务器之间的网络饱和情况。 - 切勿将相关性说成因果关系:查询缓慢和
n_dead_tup偏高只是证据,并非诊断结果——应说明测量了什么、发生了什么变化,以及验证了什么。 - 故障模式路由及“症状→探测→修复”表:
references/08-diagnostics.md。
参考资料索引
| 加载时机 | 参考资料 |
|---|---|
| 调优、GUC 审查、重新加载与重启 | references/01-configuration.md |
| 查询缓慢、索引使用情况、执行计划审查 | references/02-indexes-and-query-plans.md |
| 自动清理、死元组、膨胀测量 | references/03-vacuum-and-bloat.md |
| WAL 归档、基础备份、PITR、恢复演练 | references/04-backups-wal-pitr.md |
| 流复制设置、槽、延迟、故障转移操作手册 | references/05-replication-and-failover.md |
| 扩展清单与升级注意事项 | references/06-extensions.md |
| 次要和主要版本升级、pg_upgrade、回滚 | references/07-upgrades.md |
| 按症状查找探测方式的诊断表 | references/08-diagnostics.md |
| 来源、版本观察结果、刷新流程 | references/00-source-index.md |
随附产物
scripts/pgdiag:只读诊断收集器(仅使用标准库;--json、--check、--plan-for、--help可在无集群时运行)。tests/test_pgdiag.py:针对伪造的 psql 存根的确定性测试,包括只读约束测试。references/:九份带日期并按来源索引的参考资料,涵盖上述运维主题。
验证边界
| 声明 | 最低证据要求 |
|---|---|
| 实例可访问且已确认版本 | pgdiag --check identity --json 可解析,并报告版本和恢复状态 |
| 配置已知 | pgdiag 的 config 检查列出运维人员必须关注的 GUC |
| 归档运行正常 | pg_stat_archiver:archived_count 持续增加,failed_count 未上升,last_failed_wal 已过时 |
| 复制处于最新状态 | pg_stat_replication:state=streaming,且延迟在约定范围内 |
| 备份可用于恢复 | 在临时实例上恢复基础备份,并将 WAL 重放至目标时间 |
| 诊断可靠 | 提出结论前已收集证据,且通过重新运行检查验证了修复效果 |
严格边界
- 未经人工明确指示目标并说明回滚路径,绝不执行变更操作(
pg_ctl stop、提升、pg_upgrade、安装扩展、维护性VACUUM)。只读探查可随时进行。 - 绝不将未经验证的说法作为证据:说明测量了什么、何时测量以及如何测量。
- 绝不公开完整日志、
postgresql.conf内容或包含密码的连接字符串。 - 绝不使用具备写入权限的会话运行
pgdiag;该工具本身按设计为只读。
不适用场景
- 应用层数据访问模式(应用代码中的连接池、ORM 用法、查询构造、服务中的事务)——请参阅 backend-engineering。
- 架构设计和数据建模(表、键、规范化、维度模型)——请参阅 data-architect 和 data-engineering。
- 跨数据库引擎的方法论(备份策略、迁移模式、分析型 SQL)——请参阅
data-engineering。 - Supabase 平台管理(托管项目、CLI 堆栈、自托管的 Supabase 堆栈)——请参阅 supabase;不使用 Supabase 约定的常规 PostgreSQL 操作属于此处。要衡量 Agent 执行 Supabase 任务的能力,请使用该技能的 agent evals harness reference。
- 其他数据库引擎(Redis、MongoDB、Elasticsearch、向量存储)——这些内容归
data-engineering参考资料所有;此技能仅负责 PostgreSQL。