Skip to main content
Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Faq

PostgreSQL 目前常见的问题有哪些?如何解决?

PostgreSQL 常见的问题主要包括 表和索引膨胀、连接数过多、以及 Autovacuum(自动清理)调优不当。

表和索引膨胀 (Bloat)

表现:表中的数据删除或更新后,占用的物理磁盘空间没有释放,导致查询变慢、磁盘空间耗尽。

原因:PostgreSQL 采用 MVCC(多版本并发控制)机制,旧版本数据不会立即擦除。

解决办法:

  • 定期执行 VACUUM FULL 或使用 pg_repack 工具在线重建表和索引,避免锁表。
  • 调整 autovacuum 参数,使其更积极地清理死行。

连接数过多与瓶颈

表现:报 FATAL: sorry, too many clients already 错误,或者 CPU 与内存资源被连接耗尽。

原因:每个连接在 PostgreSQL 中都会消耗一定的内存进程开销,应用端未正确关闭连接。

解决办法:

  • 在 postgresql.conf 中适当增大 max_connections,但不能过大。
  • 在应用层或数据库前端部署连接池工具,如 PgBouncer 或 Pgpool-II。

Autovacuum 滞后或触发不及时

表现:长事务导致系统无法清理旧元组,引发事务 ID(XID)耗尽风险(Wraparound),甚至导致数据库拒绝写入。

原因:默认的自动清理阈值对大表不够敏感,或者存在长事务阻塞。

解决办法:

  • 监控并缩短长运行时间的事务。
  • 针对大表单独调小 autovacuum_vacuum_scale_factor 和 autovacuum_vacuum_threshold 参数。

内存与工作负载配置未调优

表现:复杂查询频繁使用磁盘临时文件,I/O 飙升。

原因:默认配置较为保守,shared_buffers、work_mem 和 maintenance_work_mem 没有根据服务器物理内存进行调整。

解决办法:

  • 将 shared_buffers 设置为系统内存的 25% 左右。
  • 适当调大 work_mem(针对单个排序/哈希操作的内存),避免复杂查询落盘。