PostgreSQL 日志¶
PostgreSQL 的日志与 MySQL 有较大不同,MySQL 的 binlog、redo log、error log 是分开的,而 PostgreSQL 的日志体系更为精简。
一. 日志总览¶
| 日志类型 | 存储位置 | 对应 MySQL | 运维关注度 |
|---|---|---|---|
| 运行日志 | journalctl 或 /var/lib/pgsql/18/data/log/ |
error.log | 🔴 天天看 |
| WAL 日志 | /var/lib/pgsql/18/data/pg_wal/ |
redo log + binlog | 🔴 需监控堆积 |
| CLOG(事务提交日志) | /var/lib/pgsql/18/data/pg_xact/ |
无直接对应 | 🟢 不用管 |
| 启动日志 | /var/lib/pgsql/18/data/log/ |
— | 🟡 启动故障时看 |
二. 运行日志(错误日志)¶
1. 日志模式¶
PostgreSQL 的运行日志有两种输出方式:
方式一:systemd journal(默认)
方式二:文件输出(需开启 logging_collector)
修改 postgresql.conf:
logging_collector = on
log_directory = 'log' # 相对于数据目录,即 /var/lib/pgsql/18/data/log/
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d # 每天轮换
log_rotation_size = 10MB # 或达到 10MB 轮换
2. 日志内容示例¶
2026-07-08 09:25:40.940 CST [2734] 日志: 数据库系统启动
2026-07-08 09:25:40.940 CST [2734] 提示: 后续日志输出将出现在目录 "log"中
2026-07-08 09:30:15.123 CST [2800] 错误: 关系 "test" 不存在 位置:42
3. 错误日志常见用途¶
| 场景 | 查看方式 |
|---|---|
| 连接不上数据库 | 查 pg_hba.conf 报错 |
| SQL 执行报错 | 查运行日志中的错误信息 |
| 服务启动失败 | journalctl -u postgresql-18 |
| 慢查询 | 开启 log_min_duration_statement |
三. WAL 日志¶
关于脏页(Dirty Pages)的概念已在安装文档的进程详解中说明,此处不再赘述。
1. 什么是 WAL¶
WAL(Write-Ahead Log)是 PostgreSQL 的核心日志,相当于 MySQL 的 redo log + binlog 合体。
WAL 的写入策略(先写日志,再写数据):
如果第③步之前宕机,重启时通过 WAL 重放(replay) 恢复数据。
2. WAL vs MySQL 日志对比¶
| 对比项 | MySQL redo log | MySQL binlog | PostgreSQL WAL |
|---|---|---|---|
| 崩溃恢复 | ✅ | ❌ | ✅ |
| 主从复制 | ❌ | ✅ | ✅ |
| 时间点恢复(PITR) | ❌ | ✅ | ✅ |
| 默认开启 | ✅ | ❌ 需手动 | ✅ 始终开启 |
| 循环覆盖 | ✅ 循环写 | ❌ 追加保留 | ✅ 循环回收 |
一句话总结:WAL 把 MySQL 需要两个日志才能做的事(redo log 崩溃恢复 + binlog 复制/PITR)一个日志全干了。
3. WAL 文件¶
WAL 文件命名格式:
4. WAL 运维关注点¶
| 关注点 | 说明 |
|---|---|
| WAL 堆积 | pg_wal/ 目录越来越大,说明从库落后或归档失败 |
| WAL 归档 | 默认不归档,需开启 archive_mode = on 才能像 binlog 那样保留历史 |
| WAL 回收 | 旧的 WAL 会被自动回收,不会无限增长 |
查看当前 WAL 写入情况:
四. CLOG(事务提交日志)¶
CLOG 记录每个事务的最终状态(提交/回滚),自动管理,无需运维干预。
与 MySQL 的不同:MySQL 的事务状态记录在系统表空间和 undo 段中,而 PostgreSQL 用 CLOG 单独管理。
五. 启动日志¶
当 PostgreSQL 启动失败时,可以查看启动日志定位问题:
常见启动失败原因:
postgresql.conf配置错误(如绑定了不存在的 IP)- 数据目录权限不对
- 端口被占用
- WAL 损坏
六. 日志相关配置总结¶
| 配置项 | 作用 | 建议值 |
|---|---|---|
logging_collector = on |
开启日志文件输出 | on |
log_filename |
日志文件名格式 | postgresql-%Y-%m-%d.log |
log_rotation_age = 1d |
日志轮换周期 | 1d |
log_rotation_size = 10MB |
日志轮换大小 | 10MB |
log_min_duration_statement |
慢查询阈值(毫秒),超过则记录 SQL | 1000(1秒) |
log_line_prefix |
日志行前缀格式 | '%t [%p]: '%m [%p] |
archive_mode = on |
开启 WAL 归档 | 根据备份策略决定 |