跳转至

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(默认)

journalctl -u postgresql-18 -n 50 --no-pager
journalctl -u postgresql-18 -f                 # 实时跟踪

方式二:文件输出(需开启 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 轮换
tail -f /var/lib/pgsql/18/data/log/postgresql-*.log

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 日志(磁盘) ✅ 保证不丢
  → ② 修改内存中的数据页(变成脏页) 
  → ③ background writer / checkpointer 将脏页刷回磁盘

如果第③步之前宕机,重启时通过 WAL 重放(replay) 恢复数据。

2. WAL vs MySQL 日志对比

对比项 MySQL redo log MySQL binlog PostgreSQL WAL
崩溃恢复 ✅ ❌ ✅
主从复制 ❌ ✅ ✅
时间点恢复(PITR) ❌ ✅ ✅
默认开启 ✅ ❌ 需手动 ✅ 始终开启
循环覆盖 ✅ 循环写 ❌ 追加保留 ✅ 循环回收

一句话总结:WAL 把 MySQL 需要两个日志才能做的事(redo log 崩溃恢复 + binlog 复制/PITR)一个日志全干了。

3. WAL 文件

ls -lh /var/lib/pgsql/18/data/pg_wal/

WAL 文件命名格式:

000000010000000000000001   # 每个文件默认 16MB
000000010000000000000002
...

4. WAL 运维关注点

关注点 说明
WAL 堆积 pg_wal/ 目录越来越大,说明从库落后或归档失败
WAL 归档 默认不归档,需开启 archive_mode = on 才能像 binlog 那样保留历史
WAL 回收 旧的 WAL 会被自动回收,不会无限增长

查看当前 WAL 写入情况:

-- 进 psql 执行
SELECT * FROM pg_stat_wal;

四. CLOG(事务提交日志)

CLOG 记录每个事务的最终状态(提交/回滚),自动管理,无需运维干预。

ls /var/lib/pgsql/18/data/pg_xact/

与 MySQL 的不同:MySQL 的事务状态记录在系统表空间和 undo 段中,而 PostgreSQL 用 CLOG 单独管理。

五. 启动日志

当 PostgreSQL 启动失败时,可以查看启动日志定位问题:

cat /var/lib/pgsql/18/data/log/startup.log

常见启动失败原因:

  • 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 归档 根据备份策略决定