SuperAPI AI 工具集

production-postgres

数据与分析

查看项目

更新于 10-16 03:58

技能介绍

Production PostgreSQL 是一个面向生产环境的 PostgreSQL 实践技能,编码了经过实战检验的数据库模式,用于零停机部署、安全 schema 演进和生产级性能。其每条建议都来自真实的故障复盘。

一、用途 该技能用于指导在生产环境中安全地执行 PostgreSQL 迁移、索引、连接池配置、schema 设计与查询优化,核心目标是避免因迁移不当导致的生产数据库故障。

二、主要能力

  1. 迁移安全:强调每条迁移必须对零停机滚动部署安全,因为部署窗口内新旧代码会同时运行。要求每条迁移首条语句设置 SET lock_timeout = '2s',若 2 秒内无法获取锁则失败。禁止在大表上添加带 DEFAULT 的 NOT NULL 列(会取 ACCESS EXCLUSIVE 锁并重写整表),改用三步安全模式:先加可空列、分批回填、再加 NOT NULL 约束。要求使用 CREATE INDEX CONCURRENTLY,且该迁移不能包在事务中。禁止在单条迁移中重命名列,改用 expand-contract 模式。约束采用 NOT VALID 后单独 VALIDATE。外键遵循同样模式。
  2. 连接池:推荐 Web 应用默认使用 PgBouncer 的 transaction 模式,并给出 pgbouncer.ini 配置示例与池大小建议(OLTP 从 20-30 开始,监控 SHOW POOLS 的 cl_waiting)。说明 transaction 模式会破坏 prepared statements、advisory locks、SET 命令、LISTEN/NOTIFY、临时表等会话级特性,PgBouncer 1.21+ 可用 max_prepared_statements 支持预处理语句。还给出 asyncpg 池与 SQLAlchemy 池配置示例,以及通过 idle_in_transaction_session_timeout 和 statement_timeout 终止停滞连接。
  3. 索引策略:强调必须为外键建索引(PostgreSQL 不会自动索引外键)。复合索引将选择性最高的列放前面。介绍部分索引、JSONB 的 GIN 索引、时序数据的 BRIN 索引,并给出监控未使用索引的查询。
  4. Schema 设计:主键采用内部 BIGSERIAL、对外 UUID 的模式;始终添加带触发器的时间戳;避免 ENUM,改用 CHECK 约束或查找表;软删除配合部分索引;JSONB 最佳实践(始终用 JSONB、加 GIN 索引、用 CHECK 约束校验结构);先规范化到 3NF,有实测证据再反规范化。
  5. 查询优化:始终使用 EXPLAIN ANALYZE,识别 Seq Scan、估算行数偏差、Nested Loop、磁盘排序等红旗;检测 N+1 查询并改用 eager load;批量插入与 COPY;生产代码禁止 SELECT *;说明 CTE 在 PG 12+ 默认内联。
  6. 备份与恢复:给出 pg_dump/pg_restore 逻辑备份命令、WAL 归档与 pgBackRest 的 PITR 示例,并强调未测试的备份不算备份,需每月恢复到 staging 并测量恢复时间。
  7. 监控查询:pg_stat_statements 扩展、活动查询与锁等待查询、缓存命中率、长事务、表膨胀等健康检查,以及迁移安全清单。

三、使用方式 该技能以文档与代码示例形式提供,包含 SQL、Python(Alembic、SQLAlchemy、asyncpg)等示例。用户可在编写迁移、配置连接池、设计索引与 schema、优化查询时参照其中的模式与清单。

四、适用场景 适用于需要零停机滚动部署的 Web 应用、OLTP 数据库、时序数据表、使用 JSONB 的应用,以及需要生产级迁移安全与性能优化的 PostgreSQL 项目。

五、限制 资料未提供该技能的安装方式、收费信息、支持平台或具体版本要求,这些事实暂未提供。