PostgreSQL basebackup备份和恢复

一、概述

备份和恢复分为逻辑和物理,这里指物理备份和恢复。

PG的物理备份依赖basebackup,这差不多就是数据目录的拷贝,还依赖归档日志。

恢复分为完全恢复和PITR恢复,它们都需要归档日志,它们关键的差别是,PITR需要设置postgresql.conf中的参数recovery_target_time,还有PITR时,PG服务器恢复完后是只读状态,需要手动执行select pg_wal_replay_resume(),这样,其实是让管理员确认,恢复是否满足期望。

二、备份

PG的物理备份使用命令pg_basebackup,具体命令用法我就不写了,最终结果和对数据目录进行文件系统拷贝差不多,当然,还是有不同的,pg_basebackup时,PG服务器不需要停止服务,备份过程数据库可能会有增删改,不过没关系,这些修改都在WAL中,且开启了full_page_write。pg_basebackup出来的目录中会有backup_label这个文件,表示这是个备份。

备份:

pg_basebackup -D my_basebackup -U<username> -h<host> -p<port>

三、恢复

恢复分完全恢复和按时间点恢复(PITR),注意,这里有个前提,就是运行、备份、恢复时是开启归档日志的,且都放在一个目录下。

1)完全恢复

简单的讲,完全恢复需要basebackup + 归档日志,这里有个小细节,就是停库时,可能最新的WAL文件还没有存到归档目录,所以最好能把原数据目录下pg_wal的内容复制到basebackup目录下pg_wal,basebackup目录下pg_wal的内容其实可以删掉。

当然这个basebackup要做一些处理,里面要创建一个recovery.signal文件,告诉PG服务器,启动后要做恢复,还要设置restore_command,告诉PG服务器从哪里取归档日志。

对于完全恢复,不可以设置recovery_target_time等表示恢复终止点的参数,PG服务器会一直取归档日志并恢复,直到找不到文件为止。

停库

pg_ctl -D _data stop

复制数据目录(restore)

mv _data _data_bkp

cp -r my_basebackup _data

这里有一点,就是,如果是完全恢复到最新状态的话,

restore后目录的pg_wal目录清空,

原来数据目录_data下的pg_wal里的WAL文件要拷贝到restore后目录的pg_wal下,

这样做是考虑到有可能最新的WAL文件还没有存到归档目录。

设置恢复参数

touch recovery.signal

vim _data/postgresql.conf

restore_command = 'cp /mnt/server/archivedir/%f %p'

启动

pg_ctl -D _data start

2)按时间点恢复

和完全恢复差不多,也是需要basebackup + 归档日志,创建recovery.signal,但与完全恢复不同的是:还要设置recovery_target_time,可能还有recovery_target_timeline,PG服务器恢复完后,并不是立即进入可用状态,而是需要管理员手动执行select pg_wal_replay_resume(),这样可以给管理员机会调整恢复的时间,而不需要完全重新做一次恢复。

停库

pg_ctl -D _data stop

复制数据目录(restore)

mv _data _data_bkp

cp -r my_basebackup _data

设置恢复参数

touch _data/recovery.signal

vim _data/postgresql.conf

recovery_target_time = '2021-02-05 14:00:37+08'

restore_command = 'cp /mnt/server/archivedir/%f %p'

启动

pg_ctl -D _data start

select pg_wal_replay_resume();

psql登录查看一下数据库状态,是否是想要的状态,

如果是,就执行pg_wal_replay_resume();

如果不是,就停库,再修改recovery_target_time (时间上只能往后修改)

再启动,最后确定数据库达到想要的状态,就执行select pg_wal_replay_resume();

完成恢复。

相关推荐
rainFFrain2 小时前
(MySQL)库的操作
数据库·mysql
八股文领域大手子3 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
noravinsc4 小时前
django admin 中更新表数据 之后再将数据返回管理界面
数据库·django·sqlite
Bruce-li__5 小时前
DRF凭什么更高效?Django原生API与DRF框架开发对比解析
数据库·django·sqlite
郭不耐6 小时前
PostgreSQL与MySQL哪个适合做时空数据分析?
mysql·postgresql·数据分析
noravinsc6 小时前
connection.cursor() 与 models.objects.filter
数据库·django·原生查询·orm查询
laimaxgg8 小时前
MySQL复合查询
数据库·mysql
编程在手天下我有8 小时前
Redis 常见问题深度剖析与全方位解决方案指南
数据库·redis·缓存·性能优化·数据持久化·分布式系统
辰哥单片机设计9 小时前
JQ6500语音模块详解(STM32)
数据库·mongodb
阿桨9 小时前
【保姆级教程-Centos7环境下部署mongodb并设置开机自启】
数据库·mongodb·centos