
# 通过增量备份文件恢复到自建PostgreSQL数据库
RDS for PostgreSQL数据库备份后，用户可以参考[下载实例级备份文件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0031.html)和[下载增量备份文件](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0138.html)在本地自建数据库进行恢复。
本章介绍如何通过下载的备份文件进行增量备份恢复到自建数据库的操作指导。
#### 前提条件
- 增量备份需要在全量备份的基础上进行恢复。
- 下载的增备文件需要包含全量备份文件后的所有增量备份文件。
- 下载增量备份文件[解压工具](https://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/pg_restore_file.zip)。
- 本地数据库版本需要与云数据库版本相同。
- 本地数据库安装与数据库同版本的插件。
- 工具解压相关：
  - 已安装tar解压工具。
  
  - 支持python2.7或python3。
  
  - 系统中已安装lz4、gzip和shutil。
   
 
#### 操作步骤
1. 将全备文件恢复到本地自建库。 
   具体可参考[通过全量备份文件恢复到自建PostgreSQL数据库](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_08_0049.html)。
   ![](https://support.huaweicloud.com/usermanual-rds-pg/public_sys-resources/notice_3.0-zh-cn.png)
   在做全备加增备恢复本地数据库时，将全备文件恢复到本地对应目录后，按照[2]将增备文件也恢复后，再进行数据库重启。
   
   
2. 将增备文件恢复到本地自建库。
   
   增备文件恢复可以看成是基于时间点恢复，需将下载的增量备份文件保存至与全量备份相同的目录下。
   以如下恢复目录为例：
   - $PGDATA/base：存放全量文件。
   
   - $PGDATA/pg_wal：增量文件目录。如果PostgreSQL版本为9.x，则为pg_xlog目录。
   
   - （可选）$PGDATA/tablespace_map：表空间目录。如果原备份存在表空间文件，则会产生N个以数字命名的表空间目录。
   
   
   1. 下载增量备份文件，并解压至临时目录。 使用提供的[脚本](https://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/pg_restore_incre.zip)，解压后执行如下命令，将增量备份文件（假设下载的增备文件存放在/download/backup）解压到一个临时目录（例如/tmp/wal）下。
      **python restore_wal.py /download/backup /tmp/wal**
      - /download/backup：PostgreSQL增量备份文件的目录。
      
      - /tmp/wal：临时存放pg_wal日志的目录。
       
   
   2. 修改"postgresql.conf"配置文件的相关参数。 依次执行如下操作，将"postgresql.conf"（PostgreSQL 11及以下版本为"recovery.done"或"recovery.conf"）修改为需要恢复到的时间点。
      1. 将其中的#recovery_target_time=''更改为recovery_target_time ='20YY-MM-DD HH:MM:SS'。 例如：recovery_target_time = '2020-12-22 20:00:00'。（如果要恢复到最新备份，只需将时间设置为现在时间即可）
         
      
      2. 将其中的restore_command行修改为restore_command = 'cp /tmp/wal/%f %p'，其中/tmp/wal为临时存放pg_wal日志的目录。
      
      3. 添加或修改其中的recovery_target_action行为recovery_target_action = 'promote'。
      
      4. 将其中的hot_standby行修改为hot_standby = off。
       
   
   3. 配置standby模式。 **touch standby.signal**
      - 对于PostgreSQL 11及以下版本，修改"postgresql.conf"中的standby_mode为standby_mode = on。
      
      - 对于PostgreSQL 12及以上版本，在本地数据库data目录创建一个名称为standby.signal的空文件。
       
   
   
   
   
3. 重新启动数据库，等待数据库恢复完成。 
   重启完成后，如果可以成功连接数据库，则说明恢复完成。
   恢复完成后需将**recovery_target_time** 和**recovery_target_action**注释掉，即在参数前加#即可。
   
   
 
