PostgreSQL的 archive_mode 参数详解
一 archive_mode 参数概述
1.1. 基本定义
-- archive_mode 控制是否启用 WAL 归档
archive_mode = on|off|always
1.2. 三个选项的对比
| 选项 | 描述 | 使用场景 | 重启要求 |
|---|
| off | 禁用归档 | 开发/测试环境 | 不需要 |
| on | 启用归档 | 生产环境、主节点 | 需要重启 |
| always | 总是归档 | 备用服务器、所有节点 | 需要重启 |
二 off 模式
2.1. 配置和特性
archive_mode = off
2.2. 行为特点
-- 禁用 WAL 归档
- 不执行 archive_command
- 不保留归档的 WAL 文件
- 只能进行完整备份,不能进行 PITR
- 节省磁盘空间和 I/O 开销
2.3. 使用场景
# 适用于:
# - 开发/测试环境
# - 不需要时间点恢复的环境
# - 磁盘空间有限的场景
# - 临时数据库
# 配置示例
echo "archive_mode = off" >> /var/lib/postgresql/14/main/postgresql.conf
三 on 模式
3.1. 配置和特性
archive_mode = on
3.2. 行为特点
-- 启用 WAL 归档
- 执行 archive_command 归档完成的 WAL 文件
- 支持时间点恢复 (PITR)
- 支持基于 WAL 的备份策略
- 在主服务器上正常工作
- 在备用服务器上不归档
3.3. 必需的相关配置
# postgresql.conf - on 模式配置
archive_mode = on
wal_level = replica # 必须为 replica 或 logical
archive_command = 'cp %p /archive/%f' # 必须设置归档命令
# 可选配置
archive_timeout = 300 # 归档超时(秒)
3.4. 使用场景
# 适用于:
# - 生产环境主节点
# - 需要时间点恢复的环境
# - 基于 WAL 的备份策略
# - 高可用集群的主节点
四 always 模式
4.1. 配置和特性
archive_mode = always
4.2. 行为特点
-- 总是启用 WAL 归档
- 在主服务器和备用服务器上都执行归档
- 备用服务器也归档其接收的 WAL
- 支持级联复制环境中的归档
- 增加备用服务器的 I/O 负载
4.3. 必需的相关配置
# postgresql.conf - always 模式配置
archive_mode = always
wal_level = replica # 必须为 replica 或 logical
archive_command = 'cp %p /archive/%f' # 必须设置归档命令
# 在备用服务器上还需要
hot_standby = on
4.4. 使用场景
# 适用于:
# - 级联复制环境
# - 所有节点都需要归档的集群
# - 备用服务器也需要 PITR 能力的环境
# - 多层级备份架构
五 配置验证和检查
5.1. 检查当前 archive_mode
-- 查看当前 archive_mode 设置
SELECT name, setting, unit, context, pending_restart
FROM pg_settings
WHERE name = 'archive_mode';
name | setting | unit | context | pending_restart
--------------+---------+------+------------+-----------------
archive_mode | on | | postmaster | f
(1 row)
-- 检查归档相关参数
SELECT name, setting, pending_restart
FROM pg_settings
WHERE name IN ('archive_mode', 'wal_level', 'archive_command', 'archive_timeout');
5.2. 验证归档状态
-- 检查归档统计信息
SELECT * FROM pg_stat_archiver;
-- 输出示例:
archived_count | last_archived_wal | last_archived_time | failed_count | last_failed_wal | last_failed_time | stats_reset
----------------+--------------------------+-------------------------------+--------------+-----------------+------------------+-----------------------
--------
451 | 0000000100000001000000D9 | 2025-11-27 17:49:22.393339+08 | 0 | | | 2025-11-25 09:03:40.58
2174+08
(1 row)
-- 检查未归档的 WAL 文件
SELECT count(*) as pending_archive
FROM pg_ls_archive_statusdir()
WHERE name LIKE '%.ready';
六 配置示例
6.1. 开发环境配置
# 开发环境 - 禁用归档
archive_mode = off
wal_level = minimal
archive_command = ''
6.2. 生产主节点配置
# 生产主节点 - 启用归档
archive_mode = on
wal_level = replica
archive_command = 'test ! -f /var/lib/postgresql/wal_archive/%f && cp %p /var/lib/postgresql/wal_archive/%f'
archive_timeout = 300
max_wal_senders = 10
6.3. 级联复制备用节点配置
# 备用节点 - 总是归档
archive_mode = always
wal_level = replica
archive_command = 'test ! -f /var/lib/postgresql/wal_archive/%f && cp %p /var/lib/postgresql/wal_archive/%f'
archive_timeout = 300
hot_standby = on
max_wal_senders = 5
6.4. 高可用集群配置
# 主节点配置
archive_mode = on
wal_level = replica
archive_command = 'rsync -av %p backup-server:/wal_archive/%f'
# 备用节点配置 (可能升级为主节点)
archive_mode = always
wal_level = replica
archive_command = 'rsync -av %p backup-server:/wal_archive/%f'
hot_standby = on
七 修改 archive_mode
7.1. 修改步骤
# 1. 修改 postgresql.conf
echo "archive_mode = on" >> /var/lib/postgresql/14/main/postgresql.conf
# 2. 设置归档命令(如果启用归档)
echo "archive_command = 'cp %p /archive/%f'" >> /var/lib/postgresql/14/main/postgresql.conf
# 3. 确保 wal_level 正确
echo "wal_level = replica" >> /var/lib/postgresql/14/main/postgresql.conf
# 4. 重启 PostgreSQL(从 off 到 on/always 需要重启)
systemctl restart postgresql
# 5. 验证修改
psql -c "SELECT name, setting FROM pg_settings WHERE name = 'archive_mode';"
7.2. 修改注意事项
-- 重要提醒:
-- 1. 从 off 切换到 on/always 需要重启 PostgreSQL
-- 2. 从 on/always 切换到 off 需要重启 PostgreSQL
-- 3. 启用归档必须设置有效的 archive_command
-- 4. 启用归档要求 wal_level = replica 或 logical
-- 5. 确保归档目录存在且有正确权限
-- 检查是否需要重启
SELECT name, setting, pending_restart
FROM pg_settings
WHERE name = 'archive_mode' AND pending_restart;