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
=====================================================================
注意: 创建增量备份之前必须先创建一个全量备份。
$ 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