PostgreSQL 连续归档(WAL 归档)全解析:从原理到实战

17 阅读22分钟

PostgreSQL 连续归档(WAL归档)全解析:原理、配置与实战

在PostgreSQL中,预写式日志(WAL) 是保证数据库崩溃恢复的核心,而基于WAL的连续归档(也被多数数据库厂商称为“在线备份”)则是实现高可靠性数据备份与时间点恢复(PITR)的关键方案。相较于pg_dump逻辑备份、简单文件系统备份,连续归档兼顾了备份的灵活性、连续性和恢复的精准性,是大型生产库高可用架构的核心组成部分。

本文将从核心原理出发,逐步讲解WAL归档的开启配置、基础备份制作、数据恢复流程,同时解析时间线的核心概念,并给出实战配置示例与避坑指南,覆盖PostgreSQL连续归档的全生命周期操作。

一、连续归档的核心原理与优势

PostgreSQL的WAL日志存储在数据簇目录的pg_wal/子目录中,其核心作用是崩溃恢复:系统崩溃后,可重放最后一次检查点后的WAL日志,恢复数据库一致性。而连续归档则是将文件系统基础备份WAL日志归档结合,形成一套完整的备份恢复体系。

1.1 连续归档的核心优势

相较于传统备份方案,连续归档的优势十分显著,也是其成为生产库首选备份方案的原因:

  1. 无需完美的文件系统备份:备份中的内部不一致性可通过WAL重放修正,无需文件系统快照功能,仅用tar/cpio等常规归档工具即可。
  2. 支持连续备份:可通过归档无穷长的WAL文件序列,实现增量式的连续备份,解决大型数据库频繁全量备份的痛点。
  3. 时间点恢复(PITR) :可在任意WAL日志节点停止重放,将数据库恢复到备份后任意时间点的一致状态。
  4. 支持热后备系统:将WAL文件实时同步到已载入基础备份的从机,可快速构建近乎实时的热备节点。

1.2 重要前提说明

  1. pg_dump/pg_dumpall为逻辑备份,不包含WAL重放所需的底层信息,无法用于连续归档方案
  2. 连续归档仅支持整个数据库集簇的恢复,无法单独恢复某个库/表。
  3. 连续归档需要一定的存储资源:基础备份体积通常较大,高写入量的系统会产生大量WAL日志,需做好归档存储规划。

二、开启WAL归档(核心配置)

要实现连续归档,首先需配置PostgreSQL的WAL归档机制,核心是捕获并持久化所有已完成的WAL段文件,防止其被系统回收重用。PostgreSQL对归档方式不做限制,仅要求管理员通过配置指定归档命令/归档库,将WAL段文件保存到持久化存储(本地目录、NFS、对象存储等)。

2.1 核心配置参数

WAL归档的配置均在PostgreSQL主配置文件postgresql.conf中完成,需修改以下核心参数,修改后需重启数据库(部分参数支持重载,下文会标注)。

配置参数取值要求说明是否需要重启
wal_levelreplica/logical/minimal(禁用归档)开启归档需设置为replica及以上;logical适用于逻辑复制场景
archive_modeon/off/alwayson:主库开启归档;always:主备均开启(备库归档需配合流复制)
archive_command自定义Shell命令核心归档命令,将完成的WAL段文件归档到指定位置;空字符串''表示临时停止归档否(重载即可)
archive_library自定义C语言归档库路径替代archive_command的高级方案,性能更高,需自行开发C模块否(重载即可)
archive_timeout数值(单位:s),如60强制WAL段切换的超时时间,解决低写入量系统WAL归档延迟问题;建议设为60s左右否(重载即可)

关键说明

  • wal_level是归档的基础,设为minimal时,PostgreSQL会优化部分SQL的WAL日志记录,导致日志无法用于归档恢复。
  • archive_timeout不宜设置过短(如1s),否则会生成大量小体积WAL段文件,导致归档存储膨胀。

2.2 配置archive_command(最常用方式)

archive_command是最通用的归档配置方式,支持自定义Shell命令,PostgreSQL会自动将**%p替换为WAL段文件的相对路径**(相对于数据簇目录), %f替换为WAL段文件的纯文件名,命令执行成功返回0,失败返回非0。

PostgreSQL会对归档失败的WAL文件周期性重试,直到归档成功;仅当命令返回0时,才会认为文件归档完成,后续可回收该WAL段。

2.2.1 基础归档配置示例

Unix/Linux系统:将WAL文件归档到本地/mnt/server/archivedir/目录,且禁止覆盖已归档文件(核心安全要求):

# postgresql.conf
wal_level = replica
archive_mode = on
# 先检查目标文件是否存在,不存在则拷贝,避免覆盖
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
# 解决低写入量归档延迟,60s强制切换WAL段
archive_timeout = 60

Windows系统

archive_command = 'copy "%p" "C:\server\archivedir\%f"'
2.2.2 archive_command的核心要求
  1. 禁止覆盖已归档文件:这是保护归档完整性的关键,防止多服务器归档到同一目录时的文件冲突。
  2. 正确的退出码:仅成功时返回0,失败时返回非0;PostgreSQL根据退出码判断是否重试。
  3. 权限要求:归档命令以运行PostgreSQL的系统用户(如postgres)执行,需保证归档目录的读写权限,且归档目录需限制访问(WAL包含数据库所有数据,防止泄露)。
  4. 保留纯文件名%f:归档时可忽略相对路径%p,但必须保留WAL段的原始文件名%f,否则恢复时无法识别。

2.3 归档的其他注意事项

  1. 归档速度要求:只需跟上WAL日志的平均生成速率即可,短暂落后不影响数据库正常运行,但严重落后会增加灾难恢复时的数据丢失风险,且会导致pg_wal/目录膨胀。

  2. 配置文件不归档:WAL归档仅恢复数据库数据修改,postgresql.conf、pg_hba.conf、pg_ident.conf等配置文件不会被归档,需单独纳入文件系统备份。

  3. 手动触发WAL切换:若需立即归档最新事务,可执行手动切换命令:

    1. SELECT pg_switch_wal();
      
  4. 临时停止归档:将archive_command设为空字符串'',重载配置即可,此时WAL文件会在pg_wal/中积累,恢复归档时重新配置有效命令即可。

三、制作基础备份

连续归档的备份体系以基础备份为起点,后续通过归档的WAL日志重放,实现数据的连续恢复。基础备份是数据库集簇的一次文件系统级快照,PostgreSQL提供了两种制作方式:pg_basebackup工具(推荐,简单高效)低级API(灵活,适合自定义脚本)

3.1 推荐方式:使用pg_basebackup工具

pg_basebackup是PostgreSQL官方提供的基础备份工具,专为连续归档设计,操作简单,支持普通文件/ tar归档格式,无需手动执行WAL相关函数,是生产环境的首选。

3.1.1 核心特点
  1. 备份过程中数据库正常提供服务,属于热备份。
  2. 可通过-X参数自动包含备份过程中生成的WAL日志,保证备份的完整性。
  3. 支持远程备份,适用于主库备份的场景。
3.1.2 基础使用命令
# 本地备份:将基础备份保存到/opt/pg_backup/目录,自动包含备份过程的WAL日志
pg_basebackup -D /opt/pg_backup/ -X stream -P -U postgres

# 远程备份:备份远程主库(192.168.1.100),保存为tar归档格式
pg_basebackup -h 192.168.1.100 -p 5432 -U postgres -D /opt/pg_backup/ -X stream -P -F t

参数说明

  • -D:备份存储目录/文件(tar格式时为文件);
  • -X stream:流式复制备份过程中生成的WAL日志,保证备份完整性;
  • -P:显示备份进度;
  • -U:执行备份的数据库用户(需超级用户权限);
  • -F t:生成tar归档格式的备份,便于传输和存储;
  • -h/-p:远程数据库的主机和端口。

3.2 灵活方式:使用低级API制作备份

若需要更高的自定义性(如整合到自研备份脚本),可使用PostgreSQL提供的pg_backup_start/pg_backup_stop低级API,步骤需严格按顺序执行,且需验证每一步的成功性。

3.2.1 完整操作步骤
  1. 确认WAL归档已正常运行(核心前提,否则备份无法用于后续恢复)。

  2. 连接数据库,启动备份模式

    1. -- label:备份唯一标识,自定义;fast:false等待定期检查点,true强制立即检查点(会影响性能)
      SELECT pg_backup_start(label => '20260127_prod_backup', fast => false);
      
    2.   ⚠️ 注意:执行该命令的数据库连接需保持到备份结束,否则备份会被自动中止。
  3. 执行文件系统备份:使用tar/cpio等工具拷贝数据库集簇目录,无需停止数据库,示例:

    1. tar -zcvf /opt/pg_backup/20260127_prod_backup.tar.gz /var/lib/postgresql/16/main/
      
  4. 结束备份模式,生成备份元数据

    1. -- wait_for_archive:true等待备份过程的WAL全部归档,保证备份完整性
      SELECT * FROM pg_backup_stop(wait_for_archive => true);
      
    2.   该命令返回3个值,需将第二个字段写入备份根目录的backup_label文件,第三个字段(非空时)写入tablespace_map文件,这两个文件是恢复的关键,需逐字节无修改写入

  5. 验证WAL归档完成pg_backup_stop返回的第一个值为备份所需的最后一个WAL段文件,确认该文件已归档到指定存储,备份完成。

3.3 基础备份的关键注意事项

  1. 备份内容过滤:备份时需忽略pg_wal/(归档的WAL已单独存储,避免冗余)、postmaster.pid/postmaster.opts(运行时文件,恢复时会生成)、pg_replslot/(复制槽,避免备机WAL无限保留);pg_dynshmem/pg_stat_tmp/等临时目录的内容也可忽略。
  2. 表空间处理:若使用了自定义表空间,需保证备份时归档符号链接(如pg_tblspc/中的链接),而非实际文件,否则恢复时表空间会损坏。
  3. 性能影响:若数据库关闭了full_page_writes,备份模式下会强制开启,可能导致备份期间性能下降,属于正常现象。
  4. 备份历史文件:基础备份过程中会生成备份历史文件(如0000000100001234000055CD.007C9330.backup),并自动归档到WAL目录,该文件记录了备份的标签、起止时间、起止WAL段,是恢复时的重要依据。

3.4 基础备份的间隔规划

基础备份的间隔需结合两个因素:

  1. 归档存储容量:需保存基础备份后所有的WAL日志,间隔过久会导致WAL归档存储膨胀;
  2. 恢复时间:恢复时需重放基础备份后的所有WAL日志,间隔过久会增加恢复耗时。

生产环境建议根据数据库写入量设置,如每日/每周一次基础备份,结合实时WAL归档。

四、从连续归档备份恢复数据

当数据库发生故障(如误删表、磁盘损坏、数据篡改)时,可通过基础备份+归档WAL日志实现数据恢复,支持恢复到最新状态指定时间点,恢复流程需严格按步骤执行,确保数据一致性。

4.1 完整恢复步骤

步骤1:停止数据库服务
# 停止PostgreSQL服务
pg_ctl stop -D /var/lib/postgresql/16/main/
# 验证服务已停止
ps -ef | grep postgres
步骤2:备份现有数据(可选但推荐)

若磁盘空间足够,建议将现有数据簇目录完整拷贝到临时目录,作为故障排查依据,避免恢复失败后无法回滚:

cp -r /var/lib/postgresql/16/main/ /opt/pg_fault_backup/

若磁盘空间不足,至少保存pg_wal/目录中的未归档WAL文件(可能包含故障前未归档的最新事务)。

步骤3:清理现有数据目录

删除数据簇目录及自定义表空间根目录下的所有文件/子目录,确保恢复环境干净:

rm -rf /var/lib/postgresql/16/main/*
# 若有自定义表空间,同步清理
rm -rf /data/pg_tblspc/*
步骤4:恢复基础备份

将基础备份恢复到原数据簇目录,确保文件权限正确(归postgres用户所有,避免root权限):

# 解压基础备份到数据目录
tar -zxvf /opt/pg_backup/20260127_prod_backup.tar.gz -C /var/lib/postgresql/16/main/
# 修改文件权限
chown -R postgres:postgres /var/lib/postgresql/16/main/
chmod -R 700 /var/lib/postgresql/16/main/

若使用了表空间,需验证pg_tblspc/中的符号链接是否正确恢复。

步骤5:清理并重建pg_wal目录

删除基础备份中带有的pg_wal/文件(过时),若原pg_wal/是符号链接,需重新建立:

# 清理过时pg_wal文件
rm -rf /var/lib/postgresql/16/main/pg_wal/*
# 若pg_wal是符号链接,重新建立(示例:指向/data/pg_wal)
ln -s /data/pg_wal /var/lib/postgresql/16/main/pg_wal
# 恢复未归档的WAL文件(步骤2中保存的)
cp /opt/pg_fault_backup/pg_wal/* /var/lib/postgresql/16/main/pg_wal/
步骤6:配置恢复参数并创建恢复信号文件
  1. 修改postgresql.conf中的恢复配置,核心是指定restore_command(从归档中检索WAL文件的命令):

    1. # 恢复命令:从归档目录拷贝WAL文件到指定路径%p
      restore_command = 'cp /mnt/server/archivedir/%f %p'
      # 可选:指定恢复到的时间点(PITR),示例:恢复到2026-01-27 10:00:00
      # recovery_target_time = '2026-01-27 10:00:00'
      
  2. 创建恢复信号文件 recovery.signal:这是PostgreSQL进入恢复模式的核心标识,创建在数据簇目录下:

    1. touch /var/lib/postgresql/16/main/recovery.signal
      
  3. 临时修改pg_hba.conf(可选):禁止普通用户连接,避免恢复过程中数据库被操作,恢复完成后再恢复:

    1. # 注释原有普通用户连接规则,仅保留postgres本地连接
      # host    all    all    0.0.0.0/0    md5
      host    all    postgres    127.0.0.1/32    trust
      
步骤7:启动数据库,开始恢复
pg_ctl start -D /var/lib/postgresql/16/main/
# 查看恢复日志,验证恢复过程
tail -f /var/log/postgresql/16-main.log

数据库启动后会自动进入恢复模式,通过restore_command从归档中读取WAL文件并重放;若恢复过程被中断(如系统崩溃),重新启动数据库即可继续恢复,无需重新执行前面的步骤。

恢复完成后,PostgreSQL会自动删除 recovery.signal 文件,退出恢复模式,进入正常运行状态。

步骤8:验证恢复结果并恢复用户访问
  1. 连接数据库,验证数据是否恢复到预期状态(如误删的表是否存在、数据是否完整):

    1. \l  -- 查看数据库列表
      \d  -- 查看表结构
      SELECT * FROM test_table LIMIT 10;  -- 验证数据
      
  2. 若恢复正常,修改pg_hba.conf,恢复普通用户的访问权限,并重载配置:

    1. pg_ctl reload -D /var/lib/postgresql/16/main/
      

4.2 时间点恢复(PITR)配置

若需要将数据库恢复到指定时间点(如误删表前1分钟),而非最新状态,只需在postgresql.conf中添加恢复目标参数,常用的恢复目标配置如下:

# 方式1:按时间恢复(最常用),格式:YYYY-MM-DD HH:MM:SS
recovery_target_time = '2026-01-27 10:00:00'
# 方式2:按命名恢复点恢复(需提前创建恢复点)
# SELECT pg_create_restore_point('before_drop_table');
# recovery_target_name = 'before_drop_table'
# 方式3:按事务ID恢复(不推荐,需精准获取事务ID)
# recovery_target_xid = '123456'
# 可选:恢复到目标时间点的前一个状态(避免包含目标时间点的错误操作)
recovery_target_inclusive = false

⚠️ 注意:恢复目标必须晚于基础备份的结束时间,无法恢复到基础备份过程中的时间点;若需恢复到更早的时间点,需使用更早的基础备份。

4.3 restore_command的核心要求

  1. 正确的退出码:请求的WAL文件不存在时,返回非0退出码(这是正常情况,PostgreSQL会停止重放);命令执行失败(如归档目录不可访问)也返回非0。
  2. 支持历史文件:恢复时不仅会请求WAL段文件,还会请求.history后缀的时间线历史文件,restore_command需能正确检索。
  3. 优先级规则:PostgreSQL会优先从归档存储中检索WAL文件,若归档中不存在,再从pg_wal/目录中查找未归档的WAL文件。

五、时间线:理解PITR的核心概念

时间线是PostgreSQL为了解决多次时间点恢复后WAL日志冲突而引入的概念,是实现精准PITR的基础,理解时间线能避免恢复过程中出现WAL日志覆盖、恢复分支混乱的问题。

5.1 时间线的产生背景

假设一个场景:

  1. 数据库在周二20:15发生误删表操作,周三10:00发现后,通过基础备份+WAL归档恢复到周二20:14
  2. 恢复后数据库正常运行,生成新的WAL日志;
  3. 若后续想恢复到周三09:00的状态(原历史中的状态),却发现新生成的WAL日志覆盖了原历史的WAL文件,无法恢复。

简单来说,时间点恢复会产生新的数据库历史分支,若不做区分,新分支的WAL会覆盖原分支的WAL,导致无法回滚到原历史的任意时间点。

5.2 时间线的核心概念

  1. 时间线ID:每个数据库历史分支对应一个唯一的时间线ID(TLI),以十六进制形式嵌入WAL段文件名中,例如0000000100001234000055CD中,开头的00000001就是时间线ID。
  2. 时间线创建:每当归档恢复完成(删除recovery.signal),PostgreSQL会自动创建新的时间线,新时间线的ID为原ID+1,新生成的WAL日志会带有新的时间线ID,与原历史分支的WAL彻底区分。
  3. 时间线历史文件:新时间线创建时,会生成时间线历史文件(如00000002.history),该文件是纯文本文件,记录了新时间线从哪个原时间线、哪个WAL点分支而来,且会被自动归档到WAL存储目录。

5.3 时间线的恢复配置

默认情况下,PostgreSQL会沿着归档中最新的时间线进行恢复;若需要恢复到指定时间线(如原历史分支、某次恢复后的分支),需在postgresql.conf中配置:

# 恢复到基础备份对应的原始时间线
recovery_target_timeline = 'current'
# 恢复到指定时间线ID(如00000001)
recovery_target_timeline = '1'

⚠️ 注意:无法恢复到基础备份之前分支的时间线,仅能恢复到基础备份之后的时间线分支。

5.4 时间线的最佳实践

  1. 保留时间线历史文件:该文件体积极小,建议无限期保留,便于后续恢复到任意历史分支。
  2. 为时间线添加注释:可手动编辑时间线历史文件,添加注释(如2026-01-27 10:00:00 恢复到误删表前,从时间线1分支),便于多分支恢复时的管理。
  3. 监控时间线数量:避免无意义的多次PITR产生过多时间线,导致归档管理混乱。

六、实战配置示例与最佳实践

6.1 单机热备份配置

若仅需实现单机热备份(无需PITR,仅快速恢复最新状态),使用pg_basebackup-X参数即可,无需额外配置WAL归档恢复:

# 制作热备份,自动包含备份过程的WAL日志
pg_basebackup -D /opt/pg_hot_backup/ -X stream -P -U postgres
# 恢复时,直接将备份拷贝到数据目录,修改权限后启动即可
cp -r /opt/pg_hot_backup/* /var/lib/postgresql/16/main/
chown -R postgres:postgres /var/lib/postgresql/16/main/
pg_ctl start -D /var/lib/postgresql/16/main/

该方式备份和恢复速度快,适合对恢复时间要求高、无需时间点恢复的场景。

6.2 压缩WAL归档(节省存储)

若担心WAL归档的存储占用,可使用gzip对归档的WAL文件进行压缩,归档和恢复时需对应解压缩:

# postgresql.conf中配置压缩归档
archive_command = 'gzip < %p > /mnt/server/archivedir/%f.gz'
# 恢复时配置解压缩命令
restore_command = 'gunzip < /mnt/server/archivedir/%f.gz > %p'

6.3 自定义归档脚本(复杂场景)

当归档需求较复杂时(如归档到对象存储、场外存储、批量传输WAL、对接监控),建议将archive_command指向自定义脚本,简化配置文件的同时,提高扩展性。

示例:归档脚本pg_archive_wal.sh
#!/bin/bash
# 接收PostgreSQL传递的%p(WAL路径)和%f(WAL文件名)
PG_WAL_PATH=$1
PG_WAL_NAME=$2
# 归档目录
ARCHIVE_DIR=/mnt/server/archivedir/
# 检查归档目录是否存在
if [ ! -d $ARCHIVE_DIR ]; then
    mkdir -p $ARCHIVE_DIR
    chown postgres:postgres $ARCHIVE_DIR
fi
# 禁止覆盖已归档文件,拷贝并压缩
if [ ! -f $ARCHIVE_DIR/$PG_WAL_NAME.gz ]; then
    gzip < $PG_WAL_PATH > $ARCHIVE_DIR/$PG_WAL_NAME.gz
    # 拷贝失败则返回非0,触发PostgreSQL重试
    if [ $? -ne 0 ]; then
        exit 1
    fi
fi
exit 0
配置文件中引用脚本
# 给脚本添加执行权限
# chmod +x /opt/pg_scripts/pg_archive_wal.sh
archive_command = '/opt/pg_scripts/pg_archive_wal.sh "%p" "%f"'
脚本最佳实践
  1. 开启PostgreSQL的logging_collector,脚本的stderr输出会被写入数据库日志,便于故障排查;
  2. 脚本中添加错误处理日志记录,记录归档成功/失败的信息;
  3. 对归档文件做校验(如MD5校验),防止归档文件损坏。

七、注意事项与限制

PostgreSQL的连续归档功能虽强大,但目前仍存在一些限制,且生产环境中需注意避坑,否则可能导致备份失效或恢复失败。

7.1 官方功能限制

  1. CREATE DATABASE与模板库修改冲突:基础备份过程中,若执行CREATE DATABASE后又修改了其模板库(如template1),恢复时模板库的修改会被传播到新建的数据库中,导致数据不一致。解决方案:基础备份期间不修改任何模板库。
  2. 表空间绝对路径问题CREATE TABLESPACE命令会将绝对路径记录在WAL中,若在另一台机器恢复,或在本机恢复到新数据目录,WAL重放时会尝试在原绝对路径创建表空间,可能覆盖原有数据。解决方案:创建/删除表空间后,立即制作新的基础备份。

7.2 生产环境避坑指南

  1. 监控WAL归档状态:通过pg_stat_archiver视图监控归档进度,及时发现归档失败:

    1. -- 查看归档统计:已归档数量、失败数量、最后归档时间
      SELECT * FROM pg_stat_archiver;
      
  2. 防止pg_wal目录膨胀:若归档命令持续失败,WAL文件会在pg_wal/中不断积累,最终占满磁盘,导致PostgreSQL紧急关闭。需配置监控告警(如pg_wal目录使用率>80%时告警),并及时处理归档失败。

  3. full_page_writes的取舍:默认开启的full_page_writes会将磁盘页面快照写入WAL,导致WAL体积增大,但能防止部分写入的磁盘页面损坏。若硬件/文件系统支持原子写(如RAID、ZFS),可关闭该参数以减少WAL体积,不影响PITR功能。

  4. 检查点间隔优化:增大checkpoint_timeoutmax_wal_size可减少检查点次数,从而减少WAL中的页面快照数量,降低WAL体积,需结合业务场景调整。

  5. 多服务器归档目录隔离:禁止将多个PostgreSQL服务器的WAL归档到同一目录,否则会导致文件冲突,破坏归档完整性。

7.3 恢复相关注意事项

  1. 恢复时的文件权限:基础备份恢复后,必须将文件权限修改为postgres用户所有,否则PostgreSQL启动失败。
  2. WAL归档的连续性:恢复时需要从基础备份开始的连续WAL归档序列,若中间某个WAL文件丢失/损坏,恢复会在该点终止。
  3. 损坏WAL的处理:若恢复时遇到损坏的WAL文件,需指定损坏点之前的恢复目标,重新执行恢复流程。

八、总结

PostgreSQL的连续归档是基于WAL日志的企业级备份方案,其核心是基础备份+WAL日志持续归档,既解决了大型数据库频繁全量备份的痛点,又实现了精准的时间点恢复,是生产库高可用的核心保障。

核心要点回顾

  1. 开启归档的核心是配置wal_level=replicaarchive_mode=onarchive_command,且需保证归档命令不覆盖、退出码正确;
  2. 基础备份推荐使用pg_basebackup,简单高效,自定义需求可使用低级API;
  3. 恢复的核心是创建recovery.signal并配置restore_command,时间点恢复需添加恢复目标参数;
  4. 时间线是PITR的核心,用于区分不同的数据库历史分支,需保留时间线历史文件;
  5. 生产环境需监控归档状态,避免pg_wal目录膨胀,同时规避表空间、模板库的功能限制。

在实际生产中,建议将连续归档与流复制结合,构建“基础备份+WAL归档+流复制热备”的高可用架构,实现数据的多重保障,最大化降低数据丢失风险。