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常用命令
-
pg_rman [ OPTIONS ] { init |
-
backup |
-
restore |
-
show [ DATE | detail ] |
-
validate [ DATE ] |
-
delete DATE |
-
purge }
-
* init:初始化备份目录。
-
* backup:进行在线备份。
-
-b, --backup-mode=MODE full, incremental, or archive
-
-s, --with-serverlog also backup server log files
-
-Z, --compress-data compress data backup with zlib
-
-C, --smooth-checkpoint do smooth checkpoint before backup
-
-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.
-
--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
-
--keep-arclog-days=DAY keep archived WAL modified in DAY days
-
--keep-srvlog-files=NUM keep NUM of serverlogs
-
--keep-srvlog-days=DAY keep serverlog modified in DAY days
-
--standby-host=HOSTNAME standby host when taking backup from standby
-
--standby-port=PORT standby port when taking backup from standby
-
* restore:恢复。
-
--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
-
* show:显示备份历史记录 详细信息选项显示每个备份的附加信息。
-
* validate:验证备份文件。未经验证的备份不能用于还原和增量备份。
-
* delete:删除备份文件。
-
* 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) 备份模式
-
# 完全备份:备份整个数据库集群。
-
pg_rman backup -b full
-
-
# 增量备份:仅备份使用相同时间轴在上次验证备份后修改的文件或页面。
-
pg_rman backup -b incremental
-
-
# 存档WAL备份:仅备份存档WAL文件。
-
pg_rman backup -b archive
-
-
# 备份集校验(建议在备份后尽快验证备份文件。未验证的备份不能用于还原或增量备份)
-
pg_rman validate
(3) 查看备份集
pg_rman show
pg_rman show detail
(显示更多详细信息) 相关参数含义:
-
* StartTime:备份开始时的时间戳
-
* EndTime:备份结束时的时间戳
-
* Mode:备份模式。
-
* FULL:完全备份
-
* INCR:增量备份
-
* ARCH:归档WAL备份
-
* Data:读取数据文件的大小
-
* ArcLog:读取存档WAL文件的大小
-
* SrvLog:读取服务器日志文件的大小
-
* Total:备份大小(=书面大小)
-
* Compressed:备份是否已压缩
-
* TLI / CurTLI:PostgreSQL的时间轴ID
-
* ParentTLI:PostgreSQL的前时间轴ID
-
* Status:备份状态。可能的值是:
-
* OK:备份已成功完成并经过验证。
-
* DONE:备份成功完成。
-
* RUNNING:备份仍在运行。
-
* DELETING:正在删除备份。
-
* DELETED:备份已被删除。
-
* ERROR:备份期间发生一些错误。
-
* CORRUPT:备份不可用,因为它没有通过验证。
pg_rman show '2019-03-20 12:10:01'
指定日期可以查看备份的详细信息
(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全恢复
-
# 需要删除$PGDATA下的文件
-
pg_rman restore
-
-
# 必须要先停止postgresql 不然会报错 ERROR: PostgreSQL server is running
-
-
# 恢复到指定时间戳:
-
pg_rman restore --recovery-target-time "2019-02-15 13:56:45" --hard-copy
-
-
# 根据xid 来恢复:
-
pg_rman restore --recovery-target-xid 1821
恢复之后,重启数据库:会出现以下内容:
此时数据库进入只读状态。
需要执行以下命令才能继续
select pg_wal_replay_resume();
(7) pg_rman.ini
参数配置文件 设置留存期
-
COMPRESS_DATA = YES
-
KEEP_ARCLOG_FILES = 7
-
KEEP_ARCLOG_DAYS = 7
-
KEEP_DATA_GENERATIONS = 3
-
KEEP_DATA_DAYS = 7
-
KEEP_SRVLOG_FILES = 7
-
KEEP_SRVLOG_DAYS = 7