【异地备份】如何让pg_rman支持异地备份?

要让 pg_rman 支持异地备份,可以通过以下方式实现:

方法 1:使用 NFS 挂载远程存储

1、在目标服务器上配置 NFS 服务

  • 确保远程存储服务器上安装并启用了 NFS 服务。

  • 配置共享目录,例如 /backup

  • /etc/exports 中添加导出配置,例如:

1/backup 192.168.1.0/24(rw,sync,no_root_squash)
  • 重启 NFS 服务:

1sudo systemctl restart nfs-server

2、在 PostgreSQL 服务器上挂载 NFS

  • 在 PostgreSQL 服务器上安装 NFS 客户端:

1sudo apt install nfs-common    # 对于 Debian/Ubuntu
2sudo yum install nfs-utils    # 对于 CentOS/Red Hat
  • 创建挂载点并挂载远程目录:

1sudo mkdir -p /mnt/backup
2sudo mount -t nfs 192.168.1.100:/backup /mnt/backup
  • /etc/fstab 中配置自动挂载:

1192.168.1.100:/backup /mnt/backup nfs defaults 0 0

3、配置 pg_rman

  • 将备份路径设置为 NFS 挂载点:

1pg_rman init -B /mnt/backup

方法 2:通过 SSHFS 远程挂载

1、安装 SSHFS

  • 在 PostgreSQL 服务器上安装 SSHFS:

1sudo apt install sshfs   # 对于 Debian/Ubuntu
2
3sudo yum install fuse-sshfs   # 对于 CentOS/Red Hat

2、挂载远程存储

  • 创建挂载点并挂载远程目录:

1sudo mkdir -p /mnt/backup
2sshfs -o allow_other -p 922 root@192.16.7.162:/minio/data/pgbk/pg16  /bk
  • 如果需要在启动时自动挂载,可以使用 sshfs 配合 fstabautofs

3、配置 pg_rman

  • 将备份路径设置为 SSHFS 挂载点:

 1mkdir /bk
2chmod 777 /bk/
3pg_rman init -B /bk
4more /bk/pg_rman.ini
5
6-- 全量
7pg_rman backup --backup-mode=full -B /bk
8pg_rman show -B /bk
9pg_rman show '2024-07-08 15:24:04' -B /bk/
10pg_rman validate -B /bk
11
12-- 增量
13pg_rman backup --backup-mode=incremental -B /bk
14
15
16pg_ctl stop 
17rm -rf /pg16/pgdata/
18
19-- 还原到最新状态
20pg_rman restore -B /bk
21
22
23-- 增量还原
24pg_rman restore -B /bk --recovery-target-time="2024-07-08 15:18:10"
25
26
27pg_ctl start
28
29
30
31create table t(id int, col2 text);
32insert into t select n, 'test123' || n || md5(random()::varcharfrom generate_series(16000000as n;

方法 3:使用对象存储,将S3挂载为本地盘(使用 s3fs-fuse或 rclone)

如果希望直接使用对象存储(如 Amazon S3 或 MinIO),需要通过工具实现对对象存储的挂载或同步:

1、使用 s3fs-fuse 挂载对象存储

 1sudo yum install s3fs-fuse -y
2
3echo "12345678:12345678" > ~/.passwd-s3fs
4chmod 600 ~/.passwd-s3fs
5
6
7mkdir -p /s3fs_dbbk
8s3fs dbbk /s3fs_dbbk -o passwd_file=~/.passwd-s3fs -o url=http://192.16.7.162:9001 -o use_path_request_style  -o allow_other
9
10
11fusermount -uz /s3fs_dbbk
12pkill -9 s3fs

2、使用 rclone 挂载对象存储

rclone 是一个强大的命令行工具,支持多种云存储服务,包括 S3。可以用它将 S3 存储桶挂载为本地文件系统。

 1wget https://downloads.rclone.org/v1.68.1/rclone-v1.68.1-linux-amd64.zip 
2unzip rclone-v1.68.1-linux-amd64.zip  -d /usr/local/
3ln -s /usr/local/rclone-v1.68.1-linux-amd64 /usr/local/rclone
4ln -s /usr/local/rclone/rclone /usr/local/bin
5
6# /usr/local/rclone/rclone config
7
8cat > ~/.config/rclone/rclone.conf <<"EOF"
9[mys3]
10type = s3
11provider = Minio
12access_key_id = minioadmin
13secret_access_key = minioadmin
14region = us-east-1
15endpoint = http://192.16.7.162:9001
16acl = private
17EOF
18
19
20rclone lsd mys3: -vv
21
22
23
24mkdir ~/s3bucket
25ln -s /usr/bin/fusermount /usr/bin/fusermount3
26
27/usr/local/rclone/rclone mount  mys3:pgbk  ~/s3bucket --allow-other &
28
29
30rclone config show
31
32pkill -9 rclone
33umount ~/s3bucket

方法 4:使用脚本直接传输备份文件

1、备份完成后推送文件

  • 使用 pg_rman 在本地执行备份:

1pg_rman backup
  • 使用 rsyncscp 将备份文件传输到远程:

1rsync -av /path/to/local/backup user@192.168.1.100:/backup

2、自动化脚本

  • 编写脚本完成备份和传输:

1#!/bin/bash
2pg_rman backup
3rsync -av /path/to/local/backup user@192.168.1.100:/backup

方法选择建议

  • 如果需要实时备份到远程,推荐使用 NFSSSHFS

  • 如果需要与云存储集成,推荐使用 rclones3fs-fuse

  • 如果备份文件较大且传输速度是关键,推荐使用 rsync 进行增量传输。

通过这些方法,可以让 pg_rman 支持异地备份,同时满足高效和安全的需求。

总结

1、pg_rman只从postgresql.conf取log_directory和archive_command参数的值。所以,需要配置该文件,而不能使用postgresql.auto.conf文件。

2、每次备份完(无论是全备还是增备),都必须要做一次校验,否则备份集不可用来恢复,增量备份时也会报错。没有验证的话,pg_rman show也能看到这个没有验证的备份,但是状态显示DONE而非OK

3、pg_rman必须和数据库服务器安装在一块
4、pg_rman软件的版本需要和数据库的版本匹配,安装完成后,可执行文件pg_rman和PostgreSQL的bin目录在一块。

5、可以利用sshfs、nfs、samba等共享文件系统进行类似的异地备份。





请使用浏览器的分享功能分享到微信等