通过增量备份文件恢复到自建数据库(PostgreSQL)
RDS for PostgreSQL 数据库备份后,用户可以参考下载全量备份文件和下载增量备份文件在本地自建数据库进行恢复。本章以unix系统为例,介绍了如何通过下载的备份文件进行增量备份恢复到自建数据库的操作指导。
前提条件
- 增量备份需要在全量备份的基础上进行恢复。
- 单击此处,下载增量备份文件解压工具。
- 本地数据库版本需要与云数据库版本相同。
- 本地数据库安装与数据库同版本的插件。
- 工具解压相关:
- 已安装tar解压工具。
- 支持python2.7或python3。
- 系统中已安装lz4、gzip和shutil。
操作步骤
- 在本地系统中准备一个存放表空间的目录。
可以是已存在的目录,也可以通过mkdir指令创建一个新的目录。
- 停止本地数据库服务器。
具体停止PostgreSQL数据库方法请参考官网文档。
- 保存本地目标数据库data目录下的三个配置文件(“postgresql.conf”、“pg_hba.conf”和“recovery.done”)。
PostgreSQL 12及以上版本不存在“recovery.done”文件。
- 清空本地数据库的data目录。
rm -rf data目录
- 执行如下命令,将备份解压到1中准备的目录。
tar -zxf src_file -C target_dir
参数说明如下:
“src_file”: PostgreSQL全量备份文件的目录。
“target_dir”:需要恢复到的目录,即1中准备的表空间目录。注意:该目录必须是空目录,如果不存在该目录,则系统会创建该目录。
解压后会在当前目录下产生以下目录:
- base目录,存放全量文件。
- pg_wal目录(如果PostgreSQL版本为9.x,则为pg_xlog目录),增量文件目录。
- 如果原备份存在表空间文件,则会产生N个以数字命名的表空间目录。
- 将5中的文件拷贝到本地数据库指定目录下。
- 将解压出来的base目录下的文件,全部拷贝到本地数据库data目录,然后用3中保存的配置文件,覆盖本地数据库data目录下的三个文件。
- 将解压出来的pg_wal目录下的文件,拷贝到本地数据库data下的pg_wal目录。
如果PostgreSQL的版本为9.x,则解压后的目录为pg_xlog目录。
- 如果原备份存在表空间文件,修改“data/tablespace_map”中对应的表空间软链接信息,如图所示:
- 基于时间点恢复。
- 基于时间点恢复,需将下载的增量备份文件保存至与全量备份相同的目录下。
- 使用提供的脚本,执行如下命令,将增量备份文件解压到一个临时目录(例如/tmp/wal)下。
python restore_wal.py src_file_dir target_dir
参数说明如下:
- src_file_dir:PostgreSQL增量备份文件的目录。
- target_dir:临时存放pg_wal日志的目录。
- 依次执行如下操作,将3中保存的postgresql.conf(PostgreSQL 11及以下版本为recovery.done或recovery.conf)修改为需要恢复到的时间点。
- 将其中的“#recovery_target_time=''” 更改为“recovery_target_time = '20YY-MM-DD HH:MM:SS' ”。例如:recovery_target_time = '2020-12-22 20:00:00'。(若要恢复到最新备份,只需将时间设置为现在时间即可)
- 将其中的“restore_command”行修改为“restore_command = 'cp /tmp/wal/%f %p'”,其中/tmp/wal为临时存放pg_wal日志的目录。
- 添加或修改其中的"recovery_target_action"行为"recovery_target_action = 'promote'"
- 将其中的“hot_standby”行修改为"hot_standby = off"
- 配置standby模式
- 对于PostgreSQL 11及以下版本,修改postgresql.conf中的“standby_mode”为“standby_mode = on”。
- 对于PostgreSQL 12及以上版本,在本地数据库data目录创建一个standby.signal文件。
- 重新启动数据库,等待数据库恢复完成。
重启完成后,如果可以成功连接数据库,则说明恢复完成。
恢复完成后需将recovery_target_time和recovery_target_action注释掉,即在参数前加#即可。
