Skip to content

PostgreSQL 常见日志条目

日志级别说明

PostgreSQL支持多种日志级别,从详细的调试信息到严重的错误信息:

  • DEBUG:最详细的调试信息,用于开发和调试
  • INFO:一般信息,用于记录正常的系统活动
  • NOTICE:通知信息,用于记录需要用户注意的事件
  • WARNING:警告信息,用于记录可能的问题
  • ERROR:错误信息,用于记录操作失败
  • FATAL:致命错误,导致当前会话终止
  • PANIC:严重错误,导致整个数据库实例崩溃

连接与认证日志

1. 成功连接

LOG:  connection received: host=192.168.1.100 port=54321
LOG:  connection authorized: user=postgres database=postgres SSL enabled (protocol=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384, bits=256, compression=off)

说明:表示客户端成功连接到PostgreSQL服务器,包含连接来源、用户、数据库和SSL信息。

常见场景:正常的客户端连接,无需特殊处理。

2. 连接拒绝

FATAL:  no pg_hba.conf entry for host "192.168.1.200", user "postgres", database "postgres", SSL off
LOG:  connection failed: host=192.168.1.200 port=54322
FATAL:  password authentication failed for user "postgres"
LOG:  connection failed: host=192.168.1.100 port=54323
FATAL:  too many connections for role "postgres"

说明:表示客户端连接被拒绝,可能的原因包括:

  • 没有匹配的pg_hba.conf条目
  • 密码认证失败
  • 用户连接数超过限制

处理方法

  • 检查pg_hba.conf配置
  • 验证用户密码
  • 调整max_connections或role的connection limit

3. 连接关闭

LOG:  disconnection: session time: 0:01:23.456 user=postgres database=postgres host=192.168.1.100 port=54321
LOG:  disconnection: transaction time: 0:00:01.234 user=postgres database=postgres host=192.168.1.100 port=54321

说明:表示客户端断开连接,包含会话时间和事务时间。

常见场景:正常的连接关闭,无需特殊处理。

查询执行日志

1. 慢查询日志

LOG:  duration: 1234.567 ms  execute <unnamed>: SELECT * FROM large_table WHERE complex_condition = $1
DETAIL:  parameters: $1 = 'some_value'

说明:表示查询执行时间超过了log_min_duration_statement设置的阈值。

处理方法

  • 分析查询执行计划,优化慢查询
  • 考虑添加适当的索引
  • 调整log_min_duration_statement阈值

2. 长时间运行的查询

LOG:  process 12345 still running after 300.0 seconds: SELECT * FROM large_table ORDER BY column_name
DETAIL:  Query: SELECT * FROM large_table ORDER BY column_name

说明:表示查询运行时间超过了log_statement_stats设置的阈值。

处理方法

  • 分析并优化长时间运行的查询
  • 考虑使用LIMIT限制结果集
  • 调整log_statement_stats阈值

3. 锁等待日志

LOG:  process 12345 still waiting for ShareLock on transaction 67890 after 12000.123 ms
DETAIL:  Process holding the lock: 54321. Wait queue: 12345.

说明:表示查询等待锁的时间超过了deadlock_timeout设置的阈值。

处理方法

  • 分析锁等待原因,优化查询或事务设计
  • 调整deadlock_timeout阈值
  • 考虑使用不同的事务隔离级别

事务日志

1. 事务提交与回滚

LOG:  transaction committed, took 123.456 ms
LOG:  transaction rolled back, took 78.901 ms

说明:记录事务提交或回滚的时间。

处理方法

  • 分析长时间事务,优化事务设计
  • 考虑将长事务拆分为多个短事务

2. 死锁检测

ERROR:  deadlock detected
DETAIL:  Process 12345 waits for ShareLock on transaction 67890; blocked by process 54321.
Process 54321 waits for ShareLock on transaction 12345; blocked by process 12345.
HINT:  See server log for query details.
CONTEXT:  while updating tuple (123,45) in relation "table_name"

说明:检测到死锁,系统自动回滚其中一个事务。

处理方法

  • 分析死锁原因,优化事务设计
  • 确保所有事务以相同的顺序访问资源
  • 考虑使用更低的事务隔离级别

系统日志

1. 服务器启动与关闭

LOG:  starting PostgreSQL 15.3 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0, 64-bit
LOG:  listening on IPv4 address "0.0.0.0", port 5432
LOG:  listening on IPv6 address "::", port 5432
LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
LOG:  database system is ready to accept connections
LOG:  received fast shutdown request
LOG:  aborting any active transactions
LOG:  background worker "logical replication launcher" (PID 12345) exited with exit code 1
LOG:  shutting down
LOG:  database system is shut down

说明:记录PostgreSQL服务器的启动和关闭过程。

处理方法

  • 检查服务器启动日志,确保所有组件正常启动
  • 检查服务器关闭日志,了解关闭原因

2. 自动真空日志

LOG:  automatic vacuum of table "postgres.public.table_name": index scans: 1
    pages: 0 removed, 1000 remain, 0 skipped due to pins, 0 skipped frozen
    tuples: 1000 removed, 2000 remain, 0 are dead but not yet removable, oldest xmin: 123456
    buffer usage: 1000 hits, 500 misses, 200 dirtied
    avg read rate: 10.000 MB/s, avg write rate: 4.000 MB/s
    system usage: CPU: user: 0.10 s, system: 0.05 s, elapsed: 0.50 s

说明:记录自动真空进程的活动情况。

处理方法

  • 监控自动真空进程,确保表得到及时维护
  • 调整autovacuum相关参数,优化自动真空性能
  • 检查长时间运行的事务,它们可能会阻止自动真空回收空间

3. 检查点日志

LOG:  checkpoints are occurring too frequently (10 seconds apart)
HINT:  Consider increasing the configuration parameter "max_wal_size".
LOG:  checkpoint starting: time
LOG:  checkpoint complete: wrote 1000 buffers (5.0%)
    0 transaction log file(s) added, 0 removed, 5 recycled
    write: 0.200 s, sync: 0.100 s, total: 0.350 s
    sync files: 100, longest: 0.050 s, average: 0.001 s
    distance write/sync: 123456 kB, buffer usage: 2000/40000 buffers (5.0%)

说明:记录检查点的执行情况,包括检查点过于频繁的警告。

处理方法

  • 调整max_wal_size参数,减少检查点频率
  • 优化WAL写入性能,如使用更快的存储设备

复制相关日志

1. 流复制日志

LOG:  started streaming WAL from primary at 0/12345678 on timeline 1
LOG:  replication terminated by primary server
DETAIL:  End of WAL reached on timeline 1 at 0/12345678.
LOG:  new timeline 2 forked off current database system timeline 1 before 0/12345678

说明:记录流复制的状态和事件。

处理方法

  • 监控复制状态,确保复制正常运行
  • 检查复制延迟,调整相关参数
  • 处理复制中断,恢复复制关系

2. 逻辑复制日志

LOG:  logical decoding found consistent point at 0/12345678
DETAIL:  There are no running transactions.
LOG:  logical replication table synchronization worker for subscription "sub_name", table "table_name" has started
LOG:  logical replication apply worker for subscription "sub_name" has started

说明:记录逻辑复制的状态和事件。

处理方法

  • 监控逻辑复制状态,确保同步正常
  • 处理逻辑复制冲突
  • 调整逻辑复制相关参数

索引相关日志

1. 索引创建与删除

LOG:  create index
DETAIL:  index "idx_table_name_column" on table "table_name" using btree (column_name)
LOG:  index "idx_table_name_column" on table "table_name" (column_name) created, tablespace "pg_default"
LOG:  drop index
DETAIL:  index "idx_table_name_column" on table "table_name"

说明:记录索引的创建和删除过程。

处理方法

  • 监控索引创建和删除操作,确保操作成功
  • 分析索引创建时间,优化索引创建过程

2. 索引损坏日志

ERROR:  invalid page in block 1234 of relation base/12345/67890
HINT:  Please REINDEX that index.

说明:表示索引页面损坏。

处理方法

  • 运行REINDEX命令重建损坏的索引
  • 检查硬件设备,确保存储系统正常
  • 考虑启用data_checksums

存储相关日志

1. 磁盘空间不足

WARNING:  disk "pg_tblspc/12345/PG_15_202209061" has only 100 MB available
LOG:  checkpoints are occurring too frequently (5 seconds apart)
HINT:  Consider increasing the configuration parameter "max_wal_size".

说明:表示磁盘空间不足,可能导致检查点频繁触发。

处理方法

  • 检查磁盘空间,清理不必要的文件
  • 考虑扩展磁盘空间
  • 调整max_wal_size参数

2. 文件系统错误

ERROR:  could not write to file "pg_wal/xlogtemp.12345": No space left on device
LOG:  could not open temporary statistics file "pg_stat/tmp/global.tmp": Permission denied

说明:表示文件系统错误,如磁盘空间不足或权限问题。

处理方法

  • 检查磁盘空间和文件系统权限
  • 修复文件系统错误
  • 确保PostgreSQL进程有正确的权限

配置相关日志

1. 配置参数变更

LOG:  parameter "work_mem" changed to "16MB"
LOG:  parameter "shared_buffers" cannot be changed without restarting the server

说明:记录配置参数的变更情况,包括需要重启才能生效的参数。

处理方法

  • 监控配置参数变更,确保变更符合预期
  • 对于需要重启的参数,安排合适的时间重启服务器

2. 配置文件错误

FATAL:  syntax error in file "/etc/postgresql/15/main/postgresql.conf" line 1234: invalid value for parameter "shared_buffers": "invalid_value"

说明:表示配置文件中存在语法错误或无效的参数值。

处理方法

  • 检查配置文件,修复语法错误
  • 验证参数值的有效性
  • 使用pg_ctl config check命令检查配置文件

扩展相关日志

1. 扩展安装与卸载

LOG:  extension "pg_stat_statements" was successfully created
LOG:  extension "pg_stat_statements" is now uninstalled

说明:记录扩展的安装和卸载过程。

处理方法

  • 监控扩展的安装和卸载操作,确保操作成功
  • 检查扩展的依赖关系,确保正确安装

2. 扩展版本不兼容

ERROR:  incompatible library version: libpq.so.5 requires version 15.0 or later, but PostgreSQL is version 14.0

说明:表示扩展库版本与PostgreSQL版本不兼容。

处理方法

  • 安装与PostgreSQL版本兼容的扩展版本
  • 升级PostgreSQL到兼容的版本
  • 重新编译扩展以匹配PostgreSQL版本

日志分析工具

1. pgBadger

pgBadger是一个强大的PostgreSQL日志分析工具,可以生成详细的HTML报告:

bash
# 使用pgBadger分析日志
pgbadger -o report.html /var/log/postgresql/postgresql-15-main.log

2. pgAudit

pgAudit是一个PostgreSQL扩展,提供详细的审计日志:

sql
-- 安装pgAudit扩展
CREATE EXTENSION IF NOT EXISTS pgaudit;

-- 配置pgAudit
ALTER SYSTEM SET pgaudit.log = 'all';
SELECT pg_reload_conf();

3. 内置日志查看工具

PostgreSQL提供了内置的日志查看工具:

sql
-- 查看当前日志
SELECT * FROM pg_current_logfile();

-- 查看日志目录
SHOW log_directory;

日志分析最佳实践

1. 日志配置优化

  • 合理设置日志级别:根据实际需求设置合适的日志级别
  • 配置日志格式:使用jsonb格式,便于日志分析工具处理
  • 启用详细日志:在排查问题时,临时提高日志级别
  • 配置日志轮换:设置合理的日志轮换策略,避免日志文件过大

2. 日志监控与告警

  • 实时监控日志:使用工具实时监控日志文件
  • 设置日志告警:针对特定的日志模式设置告警
  • 定期分析日志:定期分析日志,发现潜在问题
  • 保留日志历史:保留足够的日志历史,便于追溯问题

3. 故障排查流程

  • 收集日志信息:收集相关的日志条目,包括错误发生前后的日志
  • 分析日志内容:理解日志条目的含义,确定问题类型
  • 定位问题根源:根据日志信息,定位问题的根本原因
  • 实施解决方案:根据问题根源,实施相应的解决方案
  • 验证解决方案:验证解决方案是否有效,确保问题得到解决

不同版本的日志差异

1. PostgreSQL 9.x

  • 日志格式较为简单
  • 支持基本的日志级别
  • 不支持jsonb日志格式

2. PostgreSQL 10.x

  • 引入了jsonb日志格式
  • 增强了日志内容,包含更多的上下文信息
  • 支持log_destination的组合设置

3. PostgreSQL 11.x及以上

  • 增强了日志的可读性
  • 支持更多的日志参数
  • 改进了自动真空日志的格式
  • 支持log_replication_commands参数

4. 版本兼容性处理

  • 了解不同版本的日志格式差异
  • 使用兼容的日志分析工具
  • 考虑使用中间件统一日志格式

常见问题与解决方案

1. 日志文件过大

问题:日志文件增长过快,占用过多磁盘空间

解决方案

  • 调整日志级别,减少不必要的日志输出
  • 配置日志轮换,定期归档和清理日志
  • 考虑使用日志压缩,减少日志文件大小

2. 日志中没有足够的信息

问题:日志中缺少必要的信息,无法进行故障排查

解决方案

  • 提高日志级别,增加日志详细程度
  • 启用相关的日志参数,如log_statement、log_duration等
  • 考虑使用调试日志,获取更详细的信息

3. 日志分析工具无法解析日志

问题:日志分析工具无法解析PostgreSQL日志

解决方案

  • 检查日志格式,确保日志格式符合工具要求
  • 更新日志分析工具到最新版本
  • 考虑转换日志格式,使其兼容分析工具

4. 日志中出现大量重复的条目

问题:日志中出现大量重复的日志条目,影响日志分析

解决方案

  • 检查应用程序,避免重复执行相同的操作
  • 调整日志级别,减少重复日志
  • 考虑使用日志去重工具,过滤重复的日志条目

常见问题(FAQ)

Q1: 如何查看PostgreSQL的日志文件位置?

A1: 可以通过以下方法查看PostgreSQL的日志文件位置:

  • 查看postgresql.conf配置文件中的log_directory参数
  • 执行SQL命令:SHOW log_directory;
  • 查看PostgreSQL进程的启动命令,通常包含-c log_directory参数

Q2: 如何启用慢查询日志?

A2: 启用慢查询日志的方法包括:

  • 设置log_min_duration_statement参数,如log_min_duration_statement = 1000(毫秒)
  • 设置log_statement = 'all',记录所有SQL语句(不推荐在生产环境使用)
  • 重启PostgreSQL服务或执行SELECT pg_reload_conf();使配置生效

Q3: 如何分析PostgreSQL的慢查询日志?

A3: 分析PostgreSQL慢查询日志的方法包括:

  • 使用pgBadger生成可视化报告
  • 使用pg_stat_statements扩展查看查询统计信息
  • 使用EXPLAIN ANALYZE分析慢查询的执行计划
  • 检查查询是否缺少适当的索引

Q4: 如何处理PostgreSQL的死锁日志?

A4: 处理PostgreSQL死锁日志的方法包括:

  • 分析死锁日志,确定参与死锁的事务和查询
  • 优化事务设计,确保事务以相同的顺序访问资源
  • 考虑使用更低的事务隔离级别
  • 减少事务的执行时间,避免长时间持有锁

Q5: 如何监控PostgreSQL的复制日志?

A5: 监控PostgreSQL复制日志的方法包括:

  • 实时查看复制相关的日志条目
  • 使用pg_stat_replication视图查看复制状态
  • 使用pg_wal_lsn_diff函数计算复制延迟
  • 设置复制相关的告警,如复制延迟超过阈值

Q6: 如何配置PostgreSQL的日志格式?

A6: 配置PostgreSQL日志格式的方法包括:

  • 设置log_destination参数,选择日志输出目标
  • 设置log_format参数,选择日志格式(text或jsonb)
  • 设置log_line_prefix参数,自定义日志行前缀
  • 重启PostgreSQL服务或执行SELECT pg_reload_conf();使配置生效

Q7: 如何处理PostgreSQL的自动真空日志?

A7: 处理PostgreSQL自动真空日志的方法包括:

  • 监控自动真空进程,确保表得到及时维护
  • 调整autovacuum相关参数,优化自动真空性能
  • 检查长时间运行的事务,它们可能会阻止自动真空回收空间
  • 考虑手动执行VACUUM ANALYZE命令,优化表和索引

Q8: 如何备份PostgreSQL的日志文件?

A8: 备份PostgreSQL日志文件的方法包括:

  • 使用日志轮换工具,自动归档日志文件
  • 配置log_rotation_age和log_rotation_size参数,定期轮换日志
  • 使用备份工具,定期备份日志目录
  • 考虑使用集中式日志管理系统,如ELK Stack或Graylog