WAL (Write-Ahead Logging) 日志膨胀通常由以下原因引起:
SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0')::bigint);
SELECT * FROM pg_replication_slots;
SELECT pid, usename, application_name, client_addr,
now() - xact_start AS duration,
query
FROM pg_stat_activity
WHERE state IN ('idle in transaction', 'active')
ORDER BY duration DESC;
SELECT name, setting, unit FROM pg_settings
WHERE name IN ('wal_keep_segments', 'max_wal_size', 'checkpoint_timeout');
SELECT pg_drop_replication_slot('slot_name');
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE state = 'idle in transaction' AND now() - xact_start > interval '1 hour';
修改postgresql.conf:
max_wal_size = 1GB # 默认1GB,可适当增大
min_wal_size = 80MB # 默认80MB
checkpoint_timeout = 5min # 默认5分钟
wal_keep_segments = 0 # 如果不使用复制,可以设为0
CHECKPOINT;
在主库上检查备库状态:
SELECT * FROM pg_stat_replication;
如果备库已不再需要,可以删除复制槽。
通过以上方法,可以有效诊断和处理PostgreSQL WAL日志膨胀问题,并预防未来发生类似情况。