为啥我会使用pgbackrest进行备份?因为postgresql没有自带的差异备份工具。。。而我们在生产环境上,一般都需要用到差异备份或者增量备份。我们的备份策略基本是,1天1次完整备份,1个小时1次差异备份。如果只需要完整备份,直接用pg_dump或者是pg_backbase加上linux的定时任务就可以了。
但是pgbackrest 也有不太好的地方,那就是pgbackrest 是针对整个数据库实例的备份,应对一个数据库实例多个数据库的不同备份策略时就一言难尽了。
1.安装pgbackrest
#添加pgBackRest的仓库:
curl -s https://raw.githubusercontent.com/pgbackrest/pgbackrest/master/src/bin/pgbackrest-repo-info | bash
#添加pgBackRest的APT仓库:
echo "deb [arch=$(dpkg --print-architecture)] http://apt.pgbackrest.org $(lsb_release -cs) $(lsb_release -cs)" | sudo tee /etc/apt/sources.list.d/pgbackrest.list
#导入仓库的GPG密钥:
wget -O - https://pgbackrest.org/pgbackrest.asc | sudo apt-key add -
#更新APT包索引:
sudo apt-get update
#安装pgBackRest:
sudo apt-get install pgbackrest
2.创建pgbackrest需要的文件目录
注意:命令中postgres:postgres,是为了授权给postgres用户权限,而且最好是用postgres用户,不然会遇到很多操作报无权限【因为postgresql在安装初始化的时候就自动创建了一个系统用户postgres,默认使用的也是postgres】
其实就2个文件夹,1个文件,其余的命令都是为了授权
sudo mkdir -p -m 770 /var/log/pgbackrest
sudo chown postgres:postgres /var/log/pgbackrest
sudo mkdir -p /etc/pgbackrest
sudo mkdir -p /etc/pgbackrest/conf.d
sudo touch /etc/pgbackrest/pgbackrest.conf
sudo chmod 640 /etc/pgbackrest/pgbackrest.conf
sudo chown postgres:postgres /etc/pgbackrest/pgbackrest.conf
3.修改postgresql.conf文件
需要开启wal日志归档
archive_mode = on
archive_command = 'pgbackrest --stanza=sportsdb archive-push %p'
4.编辑pgbackrest.conf文件
[sportsdb]是自定义的stanza实例名称,后面会用到
vim /etc/pgbackrest/pgbackrest.conf
[sportsdb]
pg1-path= /var/lib/postgresql/16/main
pg1-user=postgres
pg1-port=5432[global]
repo1-path=/var/lib/pgbackrest
5.创建pgbackrest存储库
--log-level-console=info 是为了在创建时在控制台打印日志,不写也行,就是不打印日志而已
pgbackrest --stanza=sportsdb --log-level-console=info create-stanza
6.检查存储库情况
pgbackrest --stanza=sportsdb --log-level-console=info check
7.备份
#全量备份
pgbackrest --stanza=sportsdb --log-level-console=info backup
#差异备份
pgbackrest --stanza=sportsdb --log-level-console=info --type=diff backup
#增量备份
pgbackrest --stanza=sportsdb --log-level-console=info --type=incr backup
8.查看备份情况
9.还原
还原之前要停止数据库服务,还原完毕后再重新启动服务
#这种还原备份需要先清理数据库集群目录,然后才能执行还原
pgbackrest --stanza=sportsdb --log-level-console=info restore
#加上 --delta ,pgBackRest 自动确定数据库集群目录中的哪些文件可以保留,哪些文件需要从备份中恢复 — 它还会删除备份清单中不存在的文件,以便处理不同的更改
pgbackrest --stanza=sportsdb --log-level-console=info --delta restore
#基于时间线恢复,恢复到2024-05-08 16:55:46.230286+08之前的数据
pgbackrest --stanza=sportsdb --delta --type=time "--target=2024-05-08 16:55:46.230286+08" --log-level-console=info restore
注意:基于时间线恢复之后数据库会变成只读模式,需要执行select pg_wal_replay_resume(),参考http://www.postgres.cn/docs/10/recovery-target-settings.html