pg_rman是PostgreSQL的在线备份和恢复工具。
pg_rman项目的目标是提供一种像pg_dump一样简单的在线备份和PITR方法。
它就是pgsql实现全量备份和增量备份的最简易的工具。
github地址:https://github.com/ossc-db/pg_rman
操作思想:
因为pgsql是建议使用postgres用户对pgsql进行使用,所以尽量避免使用root用户去操作数据库。所以pg_rman安装在root用户下之后,我们要切换到postgres用户下去使用它。那么pgsql和pg_rman的相关文件夹要赋予权限给postgres用户。
1.环境准备
1.1 postgres的设置
设置pgsql的配置文件,使得:archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
这个参数设置的是用来表示wal文件归档命令,会被pg_rman使用。命令中的“/mnt/server/archivedir”目录可以配置到任意自己想要的目录。
a.先寻找配置文件位置
root@VM-20-13-ubuntu: locate postgresql.conf
结果如下图,红框就是它的位置:
b.使用vim进行配置文件编辑
root@VM-20-13-ubuntu: vim /etc/postgresql/10/main/postgresql.conf
c.使用“/”进行搜索archive_command
/archive_command
结果如下图:
d.配置archive_command的值。这里可以自己把文件cp的路径改成自己喜欢的路径。
archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
e.继续设置文档中的值wal_level和archive_mode
设置:
wal_level = replica
archive_mode = on
d.去建立该wal文件存储路径,并赋予权限
这一步非常重要,如果没有赋予wal文件存储路径给postgres权限的话,在postgres用户下的pgsql根本没有权限去写wal文件进入该文件夹。
root@VM-20-13-ubuntu: mkdir -p /mnt/server/archivedir
root@VM-20-13-ubuntu: chown postgres:postgres -R /mnt/server/archivedir
root@VM-20-13-ubuntu: su postgres -c "chmod 700 -R /mnt/server/archivedir"
e.重启pgsql
root@VM-20-13-ubuntu: service postgresql restart
2.下载pg_rman
2.1查看pgsql的版本:
root@VM-20-13-ubuntu: su postgres
postgres@VM-20-13-ubuntu:/$ psql --version
结果如下图,我用的是psql 10 的版本:
2.2 去github上获取pg_rman的对应版本
a.打开网站:https://github.com/ossc-db/pg_rman
b.点击这里:
c.我使用的是10版本,所以在最新的V1.3.15版本中没找到10版本:
d.于是我在历史的v 1.3.14中找到10版本:
e.然后我们下载source文件,因为rpm文件不好在ubuntu系统上安装。
3.安装pg_rman
3.1把刚才下载的文件放到Linux服务器上,然后解压
postgres@VM-20-13-ubuntu:/$ su root
密码输入
root@VM-20-13-ubuntu: tar xzvf pg_rman-1.3.14-pg10.tar.gz -C ./
3.2 解压完进入解压出来的文件夹./pg_rman-1.3.14-pg10
root@VM-20-13-ubuntu: cd ./pg_rman-1.3.14-pg10
3.3 按着readme.md指示操作
3.4 make
root@VM-20-13-ubuntu: make
这里make的时候我报了很多错:
a.没找到postgres_fe.h
解决方案:
root@VM-20-13-ubuntu: apt install postgresql-server-dev-10
这命令中的10是pgsql的版本号,我是用10版本就写10 ,如果是别的版本就自己改成别的版本号。
b.动态链接库的缺失
解决方案:
先 locate lib缺的库的名字.so
然后使用ln -s 去建立该库的软连接
eg.比如我刚才上图的 cannot find -lselinux 说明缺少的是selinux库(-l后面的就是缺少的库)
所以我要找libselinux.so(lib+库名+.so)
所以要:
root@VM-20-13-ubuntu: locate libselinux.so
结果:发现一个libselinux.so.1的位置,如下图:
那直接ln -s去建立真正的软连接
root@VM-20-13-ubuntu: ln -s /lib/x86_64-linux-gnu/libselinux.so.1 /lib/x86_64-linux-gnu/libselinux.so
然后make一下看看是否成功:
成功结果:
3.5 make install
root@VM-20-13-ubuntu: make install
成功结果:
4.初始化pg_rman
a.寻找pgsql的data文件夹路径,首先进入数据库。
root@VM-20-13-ubuntu: su postgres
postgres@VM-20-13-ubuntu:/$ psql
b.查找数据目录
postgres=# show data_directory;
结果如图:/var/lib/postgresql/10/main
c.设置pg_rman的备份文件夹目录,我这里设置为/home/backup_home/pgsql/pgrman_data(自己随便创建)。设置pgsql的data文件夹路径为/var/lib/postgresql/10/main。
postgres=# \q
postgres@VM-20-13-ubuntu:/$ su root
root@VM-20-13-ubuntu: pg_rman init -B /home/backup_home/pgsql/pgrman_data -D /var/lib/postgresql/10/main
结果一般为:
这里是说ARCLOG_PATH没有设置,因为它没检测到archive_command,那我们就直接去设置pg_rman.ini。
root@VM-20-13-ubuntu:~# vim /home/backup_home/pgsql/pgrman_data/pg_rman.ini
添加(自己酌情设置):
ARCLOG_PATH='/mnt/server/archivedir'
BACKUP_PATH='/home/backup_home/pgsql/pgrman_data' # 设置backup—path以后使用pg_rman不用-B
PGDATA='/var/lib/postgresql/10/main' # 设置PGDATA以后使用pg_rman不用-D
compress_data=yes # 数据压缩
with-serverlog=yes
smooth-checkpoint=yes
keep-data-days=30 # 时间窗口,备份需要保证数据库可以恢复到时间窗口内的任意时间点
keep-arclog-days=30 # 保留几天内的归档文件
keep-srvlog-days=30 # 保留几天内的数据库日志文件
# keep-data-generations # 保留几代全备,如果设置为2,本次备份后不会删除上次备份
# keep-arclog-files # 保留多少个归档文件
# keep-srvlog-files # 保留几个数据库日志文件
d.开一下路径的权限:
root@VM-20-13-ubuntu: chown postgres:postgres -R /home/backup_home/pgsql
root@VM-20-13-ubuntu: su postgres -c "chmod 777 -R /home/backup_home/pgsql"
5.测试是否成功
登录一下postgres:
root@VM-20-13-ubuntu:~# su postgres
postgres@VM-20-13-ubuntu:/$ source /etc/profile
5.1全量备份测试:
postgres@VM-20-13-ubuntu:/$ pg_rman backup --backup-mode=full
成功结果:
它提示我们进行校验,那就进行校验:
postgres@VM-20-13-ubuntu:/$ pg_rman validate
成功结果:
5.2增量备份测试
增量备份之前必须有对应的全量备份。
pg_rman backup --backup-mode=incremental --progress
成功结果:
进行校验:
postgres@VM-20-13-ubuntu:/$ pg_rman validate
成功结果:
5.3查看备份的数据集
我们可以用pg_rman show查看备份的数据集:
postgres@VM-20-13-ubuntu:/$ pg_rman show
成功结果:
未校验备份集 Status 显示为 DONE,校验完成为OK,上图显示全部校验完成。