PostgreSQL 防误删,最佳的备份、恢复方案,实现高可用
误删是一个无法回避的数据库风险。没有不犯错的人,当数据被误删或被错误数据覆盖,都将造成数据损失。如何实现,既能找回100%丢失的数据,又不大费周章?
方案博采&筛选
见常的备份方案有:
- 热备份 - 这个备份对找回数据没有作用
- 定时备份 - 这个方案既耗费资源又无法实现100%找回数据,总有部分数据丢失。数据库越庞大,备份消耗时间越长,要么阻碍线上主库,要么备份失败。
- 文件系统快照 - 这个性能高,但同样无法恢复100%的数据
- 基准备份+WAL归档+流复制+恢复目标限制 - 能实现想恢复到哪个时刻就恢复到哪个时刻,但只能按时间正向恢复;这个可以通过多次尝试的方式弥补。
基准备份+WAL归档+流复制+恢复目标限制 的方案是最佳方案。那么如何构建它呢?
数据流程图
我们来画个设计图:
graph LR subgraph 主服务器 main[(主数据库)] mwal[WAL归档文件夹] end subgraph 后备服务器 bk[(后备数据库)] rsyncd([rsyncd]) bwal[WAL连续归档文件夹] end main-->|wal传送|bk mwal-->|在线增量备份|rsyncd rsyncd-->bwal
方案说明
上图中有了两套传送方案:
wal传送
流复制用来跟上线上主库最新的数据。在线增量备份
复制归档用来复制旧的WAL归档文件。
这样远和近的所有WAL文件都能在后备服务器上拿到了。关键知识
后备数据库在postgresql.auto.conf
中配置:primary_conninfo
用于流中恢复restore_command
用于从归档中恢复
另外,关键:还要添加恢复目标!如果不添加就启动实例,默认会一路追到主数据库的当前时间点。
PostgreSQL的恢复目标的设置支持很丰富,这里不逐个介绍。我使用恢复到指定时间戳,配置参数为:recovery_target_time
。
recovery_target_time
的精确的停止点还受recovery_target_inclusive
的影响。影响不大,取默认值即可。
它只是定义是否包含边界。
rsync
知识
本着简单的事简单办的原则,选中了这个古老的工具。
它的使用比较简单:
安装:
1 | apt install rsync |
/etc/rsyncd.conf
配置:
1 | hosts allow = x.x.x.x |
重点解说:
hosts allow
允许访问服务的远程IP,可以多个。有了这个就免去了用户认证了。hosts deny
必须配合hosts allow
指定为*
,不然孤掌难鸣。read only
默认为true
必须明确指定list
、comment
可以不设置
服务器端指令
rsync
的指定很丰富,详细的解释,中文参考阮一峰的教程,英文参考man rsync
输出的文档。
rsync
默认就是做的增量同步。
加一个说明,不要使用推荐的 rsync -a
参数,推荐使用rsync -r
参数。由于两台服务器用户的uid
对应的用户,是不一样的。-a
会把源服务器的文件的所有者属性同步到后备服务器时用户错乱。
rsync
执行一次,只能做一次同步,它并没有监视文件夹变化的功能。所以这个命令要么配合inotify-tool
,要么并入PostgreSQL的备份指令中。
我们选择并入PostgreSQL的备份指令中,做法是:修改postgresql.conf
文件:
1 | archive_command = 'test ! -f /path/to/archive/%f && cp %p /path/to/archive/%f && /usr/bin/rsync -r /path/to/archive/ rsync://x.x.x.x/core' |
- 本文标题:PostgreSQL 防误删,最佳的备份、恢复方案,实现高可用
- 本文作者:jf wang
- 创建时间:2021-11-16 09:31:03
- 本文链接:https://www.wangjunfeng.com.cn/2021/11/16/postgresql-best-backup-and-restore/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!