当前位置: 代码网 > it编程>数据库>MsSqlserver > PostgreSQL物理备份与搭建从库详细过程

PostgreSQL物理备份与搭建从库详细过程

2026年02月11日 MsSqlserver 我要评论
在 postgresql 中,物理备份(physical backup)是 postgresql 高可用、灾难恢复和搭建从库(standby)的核心手段。一、物理备份基础概念1.1 什么是物理备份?物

在 postgresql 中,物理备份(physical backup)是 postgresql 高可用、灾难恢复和搭建从库(standby)的核心手段。

一、物理备份基础概念

1.1 什么是物理备份?

物理备份是指直接复制 postgresql 的数据文件(即 $pgdata 目录下的所有文件),包括:

  • 表数据文件(base/
  • wal 日志(pg_wal/
  • 控制文件(global/pg_control
  • 配置文件(postgresql.conf, pg_hba.conf 等)

与逻辑备份(pg_dump)不同,物理备份:

  • 保留数据库内部结构(如 oid、文件布局);
  • 恢复速度极快(直接拷贝文件);
  • 支持时间点恢复(pitr)(配合 wal 归档);
  • 可用于搭建流复制从库

1.2 物理备份的前提条件

要执行有效的物理备份,必须满足:

  • wal_level >= replica(默认 replica 即可);
  • 启用连续归档(continuous archiving)或使用 pg_basebackup -x stream
  • 备份期间数据库可正常运行(热备份);
  • 所有节点 postgresql 版本、操作系统架构一致(主从搭建时)。

二、物理备份的两种主流方法

2.1 方法一:使用 pg_basebackup(官方推荐)

pg_basebackup 是 postgresql 自带的工具,专为创建基础备份(base backup)设计,支持流式传输 wal,操作简单、安全可靠。

基本语法

pg_basebackup [选项] -d <目标目录>

常用选项说明

选项说明
-h <host>主库 ip 或主机名
-u <user>复制用户(需 replication 权限)
-d <dir>备份输出目录
-fp / -ft输出格式:plain(默认)或 tar
-x stream同时流式接收 wal,避免备份期间 wal 被清理
-p显示进度
-v详细输出
-r自动生成 standby 配置(用于搭建从库)
-c在主库创建复制槽(防止 wal 过早回收)
-s <slot_name>指定复制槽名称

实战:创建物理备份(用于 pitr)

# 创建备份目录
mkdir -p /backup/base_$(date +%y%m%d)
# 执行备份
pg_basebackup -h 192.168.10.50 \
  -u repuser \
  -d /backup/base_$(date +%y%m%d) \
  -fp -p -v -x stream

此备份可用于后续 pitr 恢复,但不能直接启动为从库(缺少 standby.signal)。

2.2 方法二:文件系统级快照(lvm/zfs/btrfs)

适用于支持快照的存储系统,备份速度接近瞬时,对数据库性能影响极小。

以 lvm 为例

创建快照卷

lvcreate -l 10g -s -n pgdata_snap /dev/vg0/pgdata

快照大小需容纳备份期间的写入量。

挂载快照并拷贝

mkdir /mnt/snap
mount /dev/vg0/pgdata_snap /mnt/snap
rsync -ahaxx /mnt/snap/ /backup/base_$(date +%y%m%d)/
umount /mnt/snap

删除快照

lvremove /dev/vg0/pgdata_snap

优势与限制

  • 几乎零停机、低 i/o 压力;
  • 依赖特定存储技术;
  • 需手动处理 wal 归档一致性(建议配合 pg_start_backup() / pg_stop_backup())。

注意:postgresql 15+ 已弃用 pg_start_backup(),推荐使用 pg_basebackup 或存储快照 + wal 归档。

三、基于物理备份搭建从库(流复制 standby)

物理备份是搭建从库最标准、最高效的方式。以下演示如何使用 pg_basebackup 一键初始化从库。

3.1 环境准备

节点ip角色
node1192.168.10.50primary
node2192.168.10.51standby

前提:

  • 主库已配置流复制(见下文);
  • 从库已安装相同版本 postgresql;
  • 网络互通,ssh 免密(可选,用于文件同步)。

3.2 主库配置(node1)

1. 修改postgresql.conf

listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1gb          # pg 13+,旧版用 wal_keep_segments
hot_standby = on

2. 配置pg_hba.conf

# 允许复制连接
host replication repuser 192.168.10.51/32 md5

3. 创建复制用户

create user repuser with replication encrypted password 'replpass123';

4. 重载配置

pg_ctl reload -d $pgdata

3.3 从库初始化(node2)

步骤 1:停止 postgresql(如有)

sudo systemctl stop postgresql-14

步骤 2:清空数据目录

rm -rf /var/lib/pgsql/14/data/*

步骤 3:使用 pg_basebackup 初始化

sudo -u postgres pg_basebackup \
  -h 192.168.10.50 \
  -u repuser \
  -d /var/lib/pgsql/14/data \
  -p -v -r -x stream -c -s standby_slot_1

关键选项解释

  • -r:自动生成 standby.signalpostgresql.auto.conf(含 primary_conninfo);
  • -c -s:在主库创建名为 standby_slot_1 的复制槽,防止 wal 被过早清理。

步骤 4:验证生成的文件

  • /var/lib/pgsql/14/data/standby.signal(空文件,标识为从库);
  • postgresql.auto.conf 内容示例:
primary_conninfo = 'user=repuser password=replpass123 host=192.168.10.50 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
primary_slot_name = 'standby_slot_1'

步骤 5:启动从库

sudo systemctl start postgresql-14

3.4 验证从库状态

在从库执行:

-- 确认处于恢复模式
select pg_is_in_recovery();  -- 应返回 true
-- 查看是否只读
show hot_standby;            -- on

在主库执行:

-- 查看复制状态
select * from pg_stat_replication;

关键字段:

  • application_name:默认为 pg_basebackup,可通过 -e 指定;
  • statestreaming 表示正常流复制;
  • sync_stateasync(异步)或 sync(同步)。

四、物理备份 + wal 归档实现 pitr

若仅用于灾难恢复(非搭建从库),需配合 wal 归档实现任意时间点恢复。

4.1 配置 wal 归档(主库)

# postgresql.conf
archive_mode = on
archive_command = 'cp %p /archive/wal/%f'

确保 /archive/wal/ 目录存在且 postgresql 有写权限。

4.2 恢复流程

停止 postgresql

pg_ctl stop -d $pgdata

清理原数据目录

rm -rf $pgdata/*

还原物理备份

cp -r /backup/base_20260210/* $pgdata/

创建 recovery.signal

touch $pgdata/recovery.signal

配置恢复目标(可选)
$pgdata/postgresql.auto.conf 中添加:

restore_command = 'cp /archive/wal/%f %p'
recovery_target_time = '2026-02-10 18:00:00'

启动数据库

pg_ctl start -d $pgdata

数据库将重放 wal 至目标时间点,然后自动转为主库模式。

五、高级技巧与最佳实践

5.1 使用复制槽(replication slot)保护 wal

复制槽可防止主库在从库断连时清理 wal,避免从库无法追平。

创建槽(主库):

select pg_create_physical_replication_slot('standby1');
  • 从库配置中指定槽名(primary_slot_name)。

注意:需监控槽的 lag,避免磁盘爆满。

5.2 压缩与远程备份

  • 压缩备份
    pg_basebackup ... -ft | gzip > backup.tar.gz
  • 远程备份
    pg_basebackup ... -d - | ssh user@remote "cat > backup.tar"

5.3 自动化脚本示例

#!/bin/bash
backup_dir="/backup/base_$(date +%y%m%d)"
pg_basebackup -h 192.168.10.50 -u repuser -d "$backup_dir" -fp -p -x stream
if [ $? -eq 0 ]; then
  echo "backup succeeded: $backup_dir"
  # 清理7天前的备份
  find /backup -name "base_*" -mtime +7 -exec rm -rf {} \;
else
  echo "backup failed!"
  exit 1
fi

5.4 常见问题排查

问题原因解决方案
pg_basebackup: could not connect to server主库未监听、防火墙、认证失败检查 listen_addressespg_hba.conf、网络
从库启动报错 “wal ends before end of backup”备份期间主库重启使用 -x stream 或确保 wal 归档完整
从库延迟高网络慢、主库负载高监控 pg_stat_replication,优化硬件
无法写入从库正常行为从库为只读,需 promote 后才可写

六、物理备份 vs 逻辑备份对比

维度物理备份逻辑备份
恢复速度极快(文件拷贝)慢(sql 重放)
备份体积大(含所有文件)小(仅数据+ddl)
跨版本迁移不支持(需相同主版本)支持(需兼容)
搭建从库唯一标准方式不可行
pitr 支持是(需 wal)
存储开销

结论:生产环境高可用架构必须依赖物理备份;逻辑备份适用于跨版本迁移或部分表导出。

总结:postgresql 物理备份是构建高可用、实现灾难恢复的基石。通过 pg_basebackup,可一键完成:

  • 安全的热备份;
  • 从库的快速初始化;
  • 与 wal 归档结合实现 pitr。

关键要点:

  1. 主库必须配置 wal_level = replica 和复制权限;
  2. 使用 -r -x stream -c 选项简化从库搭建;
  3. 复制槽可防止 wal 丢失,但需监控;
  4. 定期验证备份可恢复性。

掌握物理备份技术,是 postgresql dba 的必备技能。

到此这篇关于postgresql物理备份与搭建从库的文章就介绍到这了,更多相关postgresql物理备份内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com