要让 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配合fstab或autofs。
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()::varchar) from generate_series(1, 6000000) as 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
使用
rsync或scp将备份文件传输到远程:
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
方法选择建议
如果需要实时备份到远程,推荐使用 NFS 或 SSHFS。
如果需要与云存储集成,推荐使用 rclone 或 s3fs-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等共享文件系统进行类似的异地备份。