IP HOSTNAME PG VERSION DIR BACKUPSETS PATH OS
192.168.100.147 pg 9.3.4 /opt/pgsql /backup CentOS6.4_x64
[root@barman ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@barman ~]# uname -a Linux barman 2.6.32-431.11.2.el6.x86_64 #1 SMP Tue Mar 25 19:59:55 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
pg_rman is an online backup and restore tool for PostgreSQL.
The goal of the pg_rman project is providing a method for online backup and PITR as easy as pg_dump. Also, it maintains a backup catalog per database cluster. Users can maintain old backups including archive logs with one command.
pg_rman is a utility program to backup and restore PostgreSQL database. It takes a physical online backup of whole database cluster, archive WALs, and server logs.
pg_rman supports getting backup from standby-site with PostgreSQL 9.0 later.
And pg_rman supports storage snapshot backup.
pg_rman的开发语言为C。
pg_rman的版本更新情况:
平台需求:
Linux (and some of UNIXes)
PostgreSQL 9.3, 9.2, 9.1, 9.0, 8.4 - 8.2
目前已通过测试的平台:
不支持的平台:
Windows
PostgreSQL 8.1 or prior versions.
下载安装postgresql93-libs
http://yum.postgresql.org/9.3/redhat/rhel-6.4-x86_64/
[root@pg ~]# rpm -ivh postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64.rpm warning: postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY Preparing... ########################################### [100%] 1:postgresql93-libs ########################################### [100%]
下载地址:http://sourceforge.net/projects/pg-rman/files/
[root@pg ~]# rpm -ivh pg_rman-1.2.8-1.pg93.rhel6.x86_64.rpm Preparing... ########################################### [100%] 1:pg_rman ########################################### [100%]
将被安装在/usr/pgsql-9.3/bin/pg_rman
源码编译安装
安装类似pg扩展模块的安装
$ make USE_PGXS=1 $ make USE_PGXS=1 install
安装过程略
在pg上创建postgres用户并设置密码:
[root@pg ~]# useradd postgres [root@pg ~]# passwd postgres
配置postgres用户环境变量:
export PATH=/usr/pgsql-9.3/bin:/opt/pgsql/bin:$PATH:$HOME/bin export PGDATA=/opt/pgsql/data export PGUSER=postgres export PGPORT=5432 export LD_LIBRARY_PATH=/opt/pgsql/lib:$LD_LIBRARY_PATH export BACKUP_PATH=/backup
创建归档目录:
[root@pg ~]# mkdir /arclog [root@pg ~]# chown postgres:postgres /arclog [postgres@pg data]$ vim postgresql.conf listen_addresses = '*' port = 5432 wal_level = archive 若为HOT STANDBY环境则此处设置为hot_standby archive_mode = on archive_command = 'test ! -f /arclog/%f && cp %p /arclog/%f'
[postgres@pg ~]$ pg_rman --help pg_rman manage backup/recovery of PostgreSQL database. Usage: pg_rman OPTION init pg_rman OPTION backup pg_rman OPTION restore pg_rman OPTION show [DATE] pg_rman OPTION show timeline [DATE] pg_rman OPTION validate [DATE] pg_rman OPTION delete DATE Common Options: -D, --pgdata=PATH location of the database storage area -A, --arclog-path=PATH location of archive WAL storage area -S, --srvlog-path=PATH location of server log storage area -B, --backup-path=PATH location of the backup storage area -c, --check show what would have been done Backup options: -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 --keep-data-generations=N keep GENERATION of full data backup --keep-data-days=DAY keep enough data backup to recover to DAY days age --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 options: --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 Catalog options: -a, --show-all show deleted backup too Connection options: -d, --dbname=DBNAME database to connect -h, --host=HOSTNAME database server host or socket directory -p, --port=PORT database server port -U, --username=USERNAME user name to connect as -w, --no-password never prompt for password -W, --password force password prompt Generic options: -q, --quiet don't write any messages --debug debug mode --help show this help, then exit --version output version information, then exit Read the website for details. <http://sourceforge.net/projects/pg-rman/> Report bugs to <http://sourceforge.net/p/pg-rman/tickets/>.
[root@pg ~]# mkdir /backup [root@pg ~]# chown postgres:postgres /backup/ [postgres@pg ~]$ pg_rman init -B /backup INFO: ARCLOG_PATH is set to '/arclog' INFO: SRVLOG_PATH is set to '/opt/pgsql/data/pg_log' [postgres@pg ~]$ ll /backup/ total 12 drwx------ 4 postgres postgres 4096 Apr 11 07:17 backup -rw-rw-r-- 1 postgres postgres 60 Apr 11 07:17 pg_rman.ini drwx------ 2 postgres postgres 4096 Apr 11 07:17 timeline_history [postgres@pg ~]$ cat /backup/pg_rman.ini ARCLOG_PATH='/arclog' SRVLOG_PATH='/opt/pgsql/data/pg_log'
Backup options: -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 --keep-data-generations=N keep GENERATION of full data backup --keep-data-days=DAY keep enough data backup to recover to DAY days age --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
各项详细解释参见http://sourceforge.net/p/pg-rman/wiki/User%27s_Manual/中“Backup options”部分。
[postgres@pg ~]$ cat /backup/pg_rman.ini ARCLOG_PATH='/arclog' SRVLOG_PATH='/opt/pgsql/data/pg_log' COMPRESS_DATA = YES KEEP_ARCLOG_FILES = 10 KEEP_ARCLOG_DAYS = 10 KEEP_DATA_GENERATIONS = 3 KEEP_DATA_DAYS = 120 KEEP_SRVLOG_FILES = 10 KEEP_SRVLOG_DAYS = 10
执行全库备份:
[postgres@pg ~]$ pg_rman backup --backup-mode=full INFO: database backup start NOTICE: pg_stop_backup complete, all required WAL segments have been archived
查看备份集:
[postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:14:31 0m 20MB ---- 83MB ---- 4426kB DONE
验证:
[postgres@pg ~]$ pg_rman validate INFO: validate: 2014-04-11 08:14:31 backup and archive log files by CRC
再次查看备份集:
[postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:14:31 0m 20MB ---- 83MB ---- 4426kB OK
各列含义解释:
Start : start time of backup
Time : total time of backup
Total : size of whole database cluster
Data : size of read data files
WAL : size of read WAL archive files
Log : size of read serverlog files
Backup: size of backup (= written size)
Status: status of backup. Possible values are:
OK : backup is done and validated.
DONE : backup is done, but not validated yet.
RUNNING : backup is running now.
DELETING : backup is being deleted now.
DELETED : backup has been deleted.
ERROR : backup is unavailable because some errors occur during backup.
CORRUPT : backup is unavailable because it is broken.
执行备份:
[postgres@pg ~]$ pg_rman backup --backup-mode=incremental --with-serverlog INFO: database backup start NOTICE: pg_stop_backup complete, all required WAL segments have been archived
验证:
[postgres@pg ~]$ pg_rman validate INFO: validate: 2014-04-11 08:17:06 backup and archive log files by CRC
查看备份集信息:
[postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:17:06 0m ---- 16kB 33MB 0B 79kB OK 2014-04-11 08:14:31 0m 20MB ---- 83MB ---- 4426kB OK [postgres@pg ~]$ pg_rman show timeline ============================================================ Start Mode Current TLI Parent TLI Status ============================================================ 2014-04-11 08:17:06 INCR 1 0 OK 2014-04-11 08:14:31 FULL 1 0 OK
[postgres@pg ~]$ pg_rman backup --backup-mode=archive --with-serverlog [postgres@pg ~]$ pg_rman validate INFO: validate: 2014-04-11 08:21:59 archive log files by CRC [postgres@pg ~]$ pg_rman show timeline ============================================================ Start Mode Current TLI Parent TLI Status ============================================================ 2014-04-11 08:21:59 ARCH 1 0 OK 2014-04-11 08:17:06 INCR 1 0 OK 2014-04-11 08:14:31 FULL 1 0 OK [postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:21:59 0m ---- ---- 16MB 0B 2000kB OK 2014-04-11 08:17:06 0m ---- 16kB 33MB 0B 79kB OK 2014-04-11 08:14:31 0m 20MB ---- 83MB ---- 4426kB OK
上面已经设计,除此之外,也可直接指定某个备份集来查看详细信息:
[postgres@pg ~]$ pg_rman show 2014-04-11 08:14:31 # configuration BACKUP_MODE=FULL WITH_SERVERLOG=false COMPRESS_DATA=true # result TIMELINEID=1 START_LSN=0/25000028 STOP_LSN=0/250000b8 START_TIME='2014-04-11 08:14:31' END_TIME='2014-04-11 08:14:35' RECOVERY_XID=1836 RECOVERY_TIME='2014-04-11 08:14:34' TOTAL_DATA_BYTES=20495299 READ_DATA_BYTES=20495299 READ_ARCLOG_BYTES=83887037 WRITE_BYTES=4426584 BLOCK_SIZE=8192 XLOG_BLOCK_SIZE=8192 STATUS=OK
注意RECOVERY_XID与RECOVERY_TIME,在恢复时分别对应参数--recovery-target-xid与--recovery-target-time。
[postgres@pg ~]$ pg_rman show -a ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:43:18 0m ---- 16kB 67MB 0B 2096kB OK 2014-04-11 08:43:09 0m 20MB ---- 33MB 0B 2402kB OK 2014-04-11 08:41:29 0m ---- 16kB 67MB 0B 102kB DELETED 2014-04-11 08:40:54 0m 20MB ---- 33MB 0B 2377kB DELETED 2014-04-11 08:21:59 0m ---- ---- 16MB 0B 2000kB DELETED 2014-04-11 08:17:06 0m ---- 16kB 33MB 0B 79kB DELETED 2014-04-11 08:14:31 0m 20MB ---- 83MB ---- 4426kB DELETED
(删除指定时间之前恢复时不再需要的备份,将保留指定时间点所在时间段及之后的全库备份及其它备份)
[postgres@pg ~]$ pg_rman show timeline ============================================================ Start Mode Current TLI Parent TLI Status ============================================================ 2014-04-11 08:43:18 INCR 1 0 OK 2014-04-11 08:43:09 FULL 1 0 OK 2014-04-11 08:41:29 INCR 1 0 OK 2014-04-11 08:40:54 FULL 1 0 OK [postgres@pg ~]$ pg_rman delete 2014-04-11 08:43:18 INFO: delete: 2014-04-11 08:41:29 INFO: delete: 2014-04-11 08:40:54 [postgres@pg ~]$ pg_rman show timeline ============================================================ Start Mode Current TLI Parent TLI Status ============================================================ 2014-04-11 08:43:18 INCR 1 0 OK 2014-04-11 08:43:09 FULL 1 0 OK
与一般主库备份使用方法相同,不同之处在于以下参数的使用:
--standby-host=HOSTNAME standby host when taking backup from standby --standby-port=PORT standby port when taking backup from standby
Restore options: --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
各项详细解释参见http://sourceforge.net/p/pg-rman/wiki/User%27s_Manual/中“Restore options”部分。
注意--hard-copy参数:
The archive WAL are copied to archive WAL storage area. If not specified, pg_rman makes symlink to archive WAL where are in the backup catalog directory.
{不指定时不会真实拷贝归档,只做一个符号链接。但经测试该参数无效,结果均为实际拷贝}
例:
postgres=# \d List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | t1 | table | postgres public | t2 | table | postgres public | t3 | table | postgres public | t4 | table | postgres public | t5 | table | postgres public | t6 | table | postgres (6 rows) [postgres@pg ~]$ pg_rman backup --backup-mode=full INFO: database backup start NOTICE: pg_stop_backup complete, all required WAL segments have been archived [postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 08:58:54 0m 20MB ---- 33MB ---- 2392kB DONE 2014-04-11 08:43:18 0m ---- 16kB 67MB 0B 2096kB OK 2014-04-11 08:43:09 0m 20MB ---- 33MB 0B 2402kB OK postgres=# drop table t1; DROP TABLE postgres=# drop table t2; DROP TABLE postgres=# drop table t3; DROP TABLE postgres=# select now(); now ------------------------------- 2014-04-11 09:01:11.396377+08 (1 row) postgres=# create table t7(id int); CREATE TABLE postgres=# select now(); now ------------------------------- 2014-04-11 09:01:41.613243+08 (1 row) [postgres@pg ~]$ pg_rman backup --backup-mode=incremental INFO: database backup start NOTICE: pg_stop_backup complete, all required WAL segments have been archived [postgres@pg ~]$ pg_rman show ============================================================================ Start Time Total Data WAL Log Backup Status ============================================================================ 2014-04-11 09:03:08 0m ---- 1671kB 67MB ---- 275kB DONE 2014-04-11 08:58:54 0m 20MB ---- 33MB ---- 2392kB DONE 2014-04-11 08:43:18 0m ---- 16kB 67MB 0B 2096kB OK 2014-04-11 08:43:09 0m 20MB ---- 33MB 0B 2402kB OK
模拟崩溃:
[postgres@pg ~]$ killall -9 postgres [postgres@pg ~]$ rm -rf /opt/pgsql/data/*
恢复:
[postgres@pg ~]$ pg_rman restore --recovery-target-time "2014-04-11 09:01:11" WARNING: can't open pg_controldata file "/opt/pgsql/data/global/pg_control": No such file or directory INFO: validate: 2014-04-11 08:58:54 backup and archive log files by SIZE INFO: restore complete. Recovery starts automatically when the PostgreSQL server is started. [postgres@pg ~]$ cat /opt/pgsql/data/recovery.conf # recovery.conf generated by pg_rman 1.2.8 restore_command = 'cp /arclog/%f %p' recovery_target_time = '2014-04-11 09:01:11' recovery_target_timeline = '1'
启动数据库并验证:
postgres=# \d List of relations Schema | Name | Type | Owner --------+------+-------+---------- public | t4 | table | postgres public | t5 | table | postgres public | t6 | table | postgres (3 rows)
官方网站给出的特性:
Ease of use. Backup and restore can be done with just one command.
Online full backup, incremental backup, and archive backup. Incremental backup can reduce backup size extreamly.
Backup compression. Unused area in pages are removed and only actual data are compressed with gzip.
Automatic backup maintenance. Backup and archive WAL files older than specified days are deleted automatically.
Backup validation. Backup can be validated with CRC checks.
No transaction lost in restore. Configuration file generator for point-in-time recovery is supported.
官方首页:https://code.google.com/p/pg-rman/
代码:http://sourceforge.net/projects/pg-rman/?source=navbar
使用说明文档:http://sourceforge.net/p/pg-rman/wiki/User%27s_Manual/
New BSD License