1.介绍


  PostgreSQL已经支持类似的Oracle的rman的备份工具的功能,支持全量,增量,归档三种备份模式,支持压缩,支持备份集的管理等。


  pg_rman使用的是pg_start_backup(),copy,pg_stop_backup()的备份模式,pg_rman跑的不是流复制协议,而是文件拷贝,所以pg_rman必须和数据库节点跑在一起。如果在待机节点跑pg_rman,pg_rman则需要通过网络连接到主节点执行pg_start_backup和pg_stop_backup.pg_rman的用法非常简单,支持以下几种运行模式。


pg_rman常用命令

 


  1.  

    pg_rman [ OPTIONS ] { init |
  2.  

                  backup |
  3.  

                 restore |
  4.  

       show [ DATE | detail ] |
  5.  

          validate [ DATE ] |
  6.  

              delete DATE |
  7.  

                  purge }
  8.  

    * init:初始化备份目录。
  9.  

    * backup:进行在线备份。
  10.  

        -b, --backup-mode=MODE full, incremental, or archive
  11.  

        -s, --with-serverlog also backup server log files
  12.  

        -Z, --compress-data compress data backup with zlib
  13.  

        -C, --smooth-checkpoint do smooth checkpoint before backup
  14.  

        -F, --full-backup-on-error switch to full backup mode if pg_rman cannot find validate full backup on current timeline NOTE: this option is only used in     --backup-mode=incremental or archive.
  15.  

    --keep-data-generations=NUM keep NUM generations of full data backup --keep-data-days=NUM keep enough data backup to recover to N days ago                 --keep-arclog-files=NUM keep NUM of archived WAL
  16.  

        --keep-arclog-days=DAY keep archived WAL modified in DAY days
  17.  

        --keep-srvlog-files=NUM keep NUM of serverlogs
  18.  

        --keep-srvlog-days=DAY keep serverlog modified in DAY days
  19.  

        --standby-host=HOSTNAME standby host when taking backup from standby
  20.  

        --standby-port=PORT standby port when taking backup from standby
  21.  

    * restore:恢复。
  22.  

    --recovery-target-time time stamp up to which recovery will proceed --recovery-target-xid transaction ID up to which recovery will proceed --recovery-target-inclusive whether we stop just after the recovery target --recovery-target-timeline recovering into a particular timeline --hard-copy copying archivelog not symbolic link
  23.  

    * show:显示备份历史记录 详细信息选项显示每个备份的附加信息。
  24.  

    * validate:验证备份文件。未经验证的备份不能用于还原和增量备份。
  25.  

    * delete:删除备份文件。
  26.  

    * purge:从备份目录中删除已删除的备份

2.使用


(1) 初始化备份目录




pg_rman init -B <a backup catalog path>


  建议在初始化备份目录之前进行设置log_directory,archive_mode并archive_command在postgresql.conf中进行设置。如果变量已初始化,则pg_rman可以将配置文件调整为该设置。在这种情况下,您必须为PostgreSQL指定数据库集群路径。请在PGDATA环境变量或-D/ --pgdata选项中指定。


 


(2) 备份模式

  1.  

    # 完全备份:备份整个数据库集群。
  2.  

    pg_rman backup -b full
  3.  

      
  4.  

    # 增量备份:仅备份使用相同时间轴在上次验证备份后修改的文件或页面。
  5.  

    pg_rman backup -b incremental
  6.  

      
  7.  

    # 存档WAL备份:仅备份存档WAL文件。
  8.  

    pg_rman backup -b archive
  9.  

      
  10.  

    # 备份集校验(建议在备份后尽快验证备份文件。未验证的备份不能用于还原或增量备份)
  11.  

    pg_rman validate


 


 


(3) 查看备份集




pg_rman show


 


PostgreSQL 全量 增量 归档 备份工具 pg_rman介绍与使用(转载)_时间戳




pg_rman show detail

(显示更多详细信息)


 


PostgreSQL 全量 增量 归档 备份工具 pg_rman介绍与使用(转载)_时间戳_02


     相关参数含义:

  1.  

         * StartTime:备份开始时的时间戳
  2.  

         * EndTime:备份结束时的时间戳
  3.  

         * Mode:备份模式。
  4.  

         * FULL:完全备份
  5.  

         * INCR:增量备份
  6.  

         * ARCH:归档WAL备份
  7.  

         * Data:读取数据文件的大小
  8.  

         * ArcLog:读取存档WAL文件的大小
  9.  

         * SrvLog:读取服务器日志文件的大小
  10.  

         * Total:备份大小(=书面大小)
  11.  

         * Compressed:备份是否已压缩
  12.  

         * TLI / CurTLI:PostgreSQL的时间轴ID
  13.  

         * ParentTLI:PostgreSQL的前时间轴ID
  14.  

         * Status:备份状态。可能的值是:
  15.  

         * OK:备份已成功完成并经过验证。
  16.  

         * DONE:备份成功完成。
  17.  

         * RUNNING:备份仍在运行。
  18.  

         * DELETING:正在删除备份。
  19.  

         * DELETED:备份已被删除。
  20.  

         * ERROR:备份期间发生一些错误。
  21.  

         * CORRUPT:备份不可用,因为它没有通过验证。
pg_rman show '2019-03-20 12:10:01'


 指定日期可以查看备份的详细信息


   PostgreSQL 全量 增量 归档 备份工具 pg_rman介绍与使用(转载)_hive_03


  


(4) 删除备份集


 按指定时间从catalog删除备份集


  例如我只需要我的备份集能恢复到2017-08-30 17:27:49,在这个时间点以前,不需要用来恢复到这个时间点的备份全删掉。但是会保留一次全备份。加上-f会强制删除

 

pg_rman delete "2017-08-30 17:27:49"


根据备份策略来删除备份集


  修改配置文件--- pg_rman.ini


  KEEP_DATA_GENERATIONS = 3   -- 备份集冗余度是3


  KEEP_DATA_DAYS = 10        -- 备份集保留日期是10d


 


(5) 清除备份集(删除已删除的备份)


  虽然delete命令从文件系统中删除了实际数据,但是仍然有一些已删除备份的目录信息,需要执行purge命令来删除。




pg_rman purge


 


(6) 备份恢复


  pg_rman将备份数据还原到目标数据库集群路径。


应该在恢复之前停止pg。此外,不要删除原始数据库集群,因为pg_rman必须从中检查时间轴ID或数据校验和状态。Restore命令将保存未归档的事务日志并删除所有数据库文件。您可以重试恢复,直到进行新备份。恢复文件后,pg_rman在中创建$PGDATA/recovery.conf。conf文件包含要恢复的参数,可以根据需要修改该文件。


  建议在恢复成功后尽快进行完整备份。


  如果--recovery-target-timeline未指定,则控制文件($PGDATA/global/pg_control)中的最后一个检查点的TimeLineID 将是还原目标。如果pg_control不存在,则还原使用的完整备份中的TimeLineID将是还原目标。


  指定时--recovery-target-time,请确保指定大于(或等于)要用作基础的完整备份的EndTime的时间戳。


 


  恢复时,需要注意,你可以选择原地恢复(覆盖式),或者使用新的$PGDATA作为恢复目标。


  但是请注意,不管是哪种恢复方式,如果在本机恢复的话,pg_rman可能会覆盖原有的数据文件,arch, pg_xlog目录中的文件,所以,如果你要保留原数据,建议先将原数据目录重命名。


  注:进行备份恢复之后,不能进行全量备份,需要进行增量备份


  • 原地恢复
  • 使用新的$PGDATA全恢复



  1.  

    # 需要删除$PGDATA下的文件
  2.  

    pg_rman restore
  3.  
     
  4.  

    # 必须要先停止postgresql 不然会报错 ERROR: PostgreSQL server is running
  5.  
     
  6.  

    # 恢复到指定时间戳:
  7.  

    pg_rman restore  --recovery-target-time "2019-02-15 13:56:45" --hard-copy
  8.  
     
  9.  

    # 根据xid 来恢复:
  10.  

    pg_rman restore  --recovery-target-xid 1821


 


  恢复之后,重启数据库:会出现以下内容:


PostgreSQL 全量 增量 归档 备份工具 pg_rman介绍与使用(转载)_hive_04


此时数据库进入只读状态。


需要执行以下命令才能继续




select pg_wal_replay_resume();


 


(7) pg_rman.ini


参数配置文件 设置留存期

  1.  

    COMPRESS_DATA = YES
  2.  

    KEEP_ARCLOG_FILES = 7
  3.  

    KEEP_ARCLOG_DAYS = 7
  4.  

    KEEP_DATA_GENERATIONS = 3
  5.  

    KEEP_DATA_DAYS = 7
  6.  

    KEEP_SRVLOG_FILES = 7
  7.  

    KEEP_SRVLOG_DAYS = 7
  8.