物理备份和在线备份工具pg_rman使用详解(九)
更新:HHH   时间:2023-1-7


pg_rman工具是实现PostgreSQL数据库在线备份,物理备份和恢复的备份工具。可以实现全量备份,增量备份。
全量: full
增量: incremental
归档: archive

Usage:
  pg_rman OPTION init
  pg_rman OPTION backup
  pg_rman OPTION restore
  pg_rman OPTION show [DATE]
  pg_rman OPTION show detail [DATE]
  pg_rman OPTION validate [DATE]
  pg_rman OPTION delete DATE
  pg_rman OPTION purge
命令选项:
  -D, --pgdata=PATH             数据存储目录的路径
  -A, --arclog-path=PATH      归档wal (预写)日志的路径
  -S, --srvlog-path=PATH      数据库服务器存储日志的路径。
  -B, --backup-path=PATH    备份数据存储的路径。
  -c, --check                          检查
    -v, --verbose                       显示详细消息        
    -P, --progress                      显示已处理文件的进度

备份选项:
  -b, --backup-mode=MODE    全备,增备,归档
  -s, --with-serverlog                 备份服务器日志文件
  -Z, --compress-data               使用zlib压缩数据备份
  -C, --smooth-checkpoint        在备份前做平滑检查点
  -F, --full-backup-on-error       切换到完全备份模式,注意:此选项仅用于--backup-mode = incremental或archive

  --keep-data-generations=NUM   保留NUM代完整数据备份
  --keep-data-days=NUM           保持足够的数据备份以恢复到N天前
  --keep-arclog-files=NUM         保留NUM个归档的WAL日志
  --keep-arclog-days=DAY         保持存档的WAL在DAY天内修改
  --keep-srvlog-files=NUM         保留NUM个服务器日志
  --keep-srvlog-days=DAY         在DAY天内修改服务器日志
  --standby-host=HOSTNAME    从待机状态进行备份时备用主机
  --standby-port=PORT          从待机状态进行备份时的备用端口

还原选项:
  --recovery-target-time        恢复将继续进行的时间戳
  --recovery-target-xid          事务ID,恢复将继续进行
    --recovery-target-inclusive    我们是否在恢复目标之后停止
  --recovery-target-timeline     恢复到特定的时间
  --hard-copy                   复制archivelog而不是符号链接

目录选项:
  -a        显示已删除的备份

删除选项:
 -f       强制删除比规定日期更旧的备份

连接选项: 
  -d, --dbname=DBNAME     连接指定库
  -h, --host=HOSTNAME      数据库主机名/IP地址
  -p, --port=PORT                 数据库端口
  -U, --username=USERNAME   数据库用户名
  -w, --no-password           从不提示密码
  -W, --password             强制密码提示

通用选项:
   -q, --quiet       不显示任何INFO或者DEBUG信息。
     --debug         查看debug信息。
  • 开始使用pg_rman工具:

    • 创建备份目录

       # mkdir /database-backup/postgresql-backup/{fullbackup,walbackup,pg_srvlog} -p
       # chown -R postgres.postgres  /database-backup/postgresql-backup/
    • 设置环境变量:
          $ vim .profile
              export BACKUP_PATH=/database-backup/postgresql-backup/fullbackup
              export ARCLOG_PATH=/database-backup/postgresql-backup/walbackup
              export SRVLOG_PATH=/database-backup/postgresql-backup/pg_srvlog
              $ source .profile     #立即生效
    • 修改postgresql.conf配置文件:
        $ vim data/postgresql.conf
          archive_mode = on
          archive_command = 'DATE=`date +%Y%m%d`; DIR="/database-backup/postgresql-backup/walbackup/"; (test -d $DIR ||  mkdir -p $DIR)  && cp %p $DIR/%f'
          保存并退出。
    • pg_rman init 初始化
          $ pg_rman init
          INFO: ARCLOG_PATH is set to '/database-backup/postgresql-backup/walbackup'
          INFO: SRVLOG_PATH is set to '/database-backup/postgresql-backup/pg_srvlog'
    • pg_rman全量备份
      $ pg_rman backup --backup-mode=full --with-serverlog --progress
      INFO: copying database files
      Processed 1298 of 1298 files, skipped 0
      INFO: copying archived WAL files
      Processed 3 of 3 files, skipped 0
      INFO: copying server log files
      INFO: backup complete
      INFO: Please execute 'pg_rman validate' to verify the files are correctly copied.
    • pg_rman 校验备份集
      pg_rman 的备份必须都是经过验证过的,否则不能进行恢复和增量备份。
      $ pg_rman validate
      INFO: validate: "2018-10-14 14:55:34" backup, archive log files and server log files by CRC
      INFO: backup "2018-10-14 14:55:34" is valid
  • pg_rman 列出备份集

    $ pg_rman show

        $ ls -l /database-backup/postgresql-backup/fullbackup/
        total 20
        drwx------ 3 postgres postgres 4096 Oct 14 14:55 20181014
        drwx------ 4 postgres postgres 4096 Oct 14 14:53 backup
        -rw-rw-r-- 1 postgres postgres  119 Oct 14 14:53 pg_rman.ini
        -rw-rw-r-- 1 postgres postgres   40 Oct 14 14:53 system_identifier
        drwx------ 2 postgres postgres 4096 Oct 14 14:53 timeline_history
  • pg_rman增量备份:
      增量备份是基于文件系统的update time时间线.
      增量备份必须有个对应的全库备份.
      $ pg_rman backup --backup-mode incremental --progress --compress-data

        $ pg_rman validate
        INFO: validate: "2018-10-14 15:59:57" backup and archive log files by CRC
        INFO: backup "2018-10-14 15:59:57" is valid

        $ pg_rman show

  • pg_rman删除备份集

        $ pg_rman delete   -f   '2018-10-14 15:59:57'
        INFO: delete the backup with start time: "2018-10-14 15:59:57"
        INFO: delete the backup with start time: "2018-10-14 14:55:34"
    
        删除增量备份的同时,也已经把全量备份给删除了。
    
            $ pg_rman show
       =====================================================================
       StartTime           EndTime              Mode    Size   TLI  Status 
       =====================================================================

    注意: 创建增量备份之前必须先创建一个全量备份。

  • pg_rman restore 还原
      模拟数据库误删除:
            $ /etc/init.d/postgresql  stop
            $ ps  -ef  | grep  -i  postmaster | grep -v grep
            $cd  data
            $ ls   -l

            $ mv data   data-bak        # 将之间的目录作为备份。
            $ mkdir   data                 # 创建数据目录。
            $ chmod 700 ./data
  • 使用pg_rman restore还原:

        $ pg_rman restore

        $ cd $PGDATA
    $ ls    -l

     $ cat recovery.conf
     # recovery.conf generated by pg_rman 1.3.7
     restore_command = 'cp /database-backup/postgresql-backup/walbackup/%f %p'
     recovery_target_timeline = '1'

     启动PostgreSQL数据库服务:
     $ /etc/init.d/postgresql start
 $ ps -ef |grep -i postgres

  • 还原时,注意事项:

      restore后启动会遇到下列错误:
         invalid primary checkpoint record
         invalid secondary checkpoint record
         could not locate a valid checkpoint record
    
        此时只能重置wal,并取消恢复模式
        $  pg_resetwal  --f  $PGDATA
        $ mv $PGDATA/recovery.conf $PGDATA/recovery.done
    
        使用pg_rman备份时对wal的归档是通过软链接来实现。建议添加 --hard-copy。

    增量备份和全量备份, 备份还原已经完成。
    需要注意的是:
    物理备份时的全量和增量备份时可以在线备份(不停机备份).
    但是还原时,需要停机进行还原。

    postgres用户的环境变量配置文件内容:
            PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/services/install/postgresql10/bin/
            export  LD_LIBRARY_PATH=/services/install/postgresql10/lib:$LD_LIBRARY_PATH
            export LD_LIBRARY_PATH=/services/install/python3.6/lib:$LD_LIBRARY_PATH
            export PGDATA PATH
            export BACKUP_PATH=/database-backup/postgresql-backup/fullbackup
            export ARCLOG_PATH=/database-backup/postgresql-backup/walbackup
            export SRVLOG_PATH=/database-backup/postgresql-backup/pg_srvlog

参考:
https://github.com/ossc-db/pg_rman/tree/master
http://ossc-db.github.io/pg_rman/index.html

返回数据库教程...