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();

完成恢复。

相关推荐
数据库急诊室_阿哲37 分钟前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋1 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子2 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T3 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting
杨凯凡3 小时前
MySQL 死锁怎么排查?InnoDB 锁等待与 Spring Boot 整事务重试实战
数据库·spring boot·mysql
Aloudata3 小时前
Claude 做数据分析的这两年:一份复盘与发展线索
大数据·数据库·人工智能·数据挖掘·数据分析·dataagent
Decay__4 小时前
01_SQLServer 体系架构全解 —— 实例进程、关系引擎、SQLOS 与事务日志深入
运维·数据库·sql·mysql·架构
zhanghaha13144 小时前
C# 系列教程_12 字符串 string 保姆级系统教程(面向新手,大量示例 + 原理讲解)
开发语言·数据库·c#
韩曙亮4 小时前
【错误记录】安卓 adb 调试 5037 端口占用排查 ( adb 的三层结构 | 找出本机占用 5037 的进程 )
android·数据库·adb·安卓·错误记录
瑞雪兆丰年兮4 小时前
JavaWeb-day07-MySQL(DQL&多表设计)
java·开发语言·数据库·sql·mysql·javaweb·web