暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL备份恢复(pg_rman)

tigerdog 2024-02-09
2672

一、概述简介

    pg_rman类似Oracle的rman备份工具,能实现全量、增量、归档层级的备份,可以很灵活的管理PostgreSQL数据库的备份,pg_rman是一款开源的PG备份恢复插件支持在线和基于PITR的备份恢复方式。

如下特点:

    使用简单,一个命令即可完成备份和恢复。

    支持在线全备备份、增量备份和归档备份。

    支持备份压缩,通过gzip工具实现页内压缩。

    自动备份维护,自动删除过期的WAL备份文件。

    支持备份验证。

    恢复期间无事务丢失,支持基于PITR的配置文件生成器。

注意事项:

    基于pg_start_backup(pg_stop_backup)。

    需要在本地安装,不能远程德份。

    需要下载对应的版本(有rpm和源码两种)

    每次备份完,必须要做一次校验,否则备份集不可用用来恢复,增量备份时也不会用它来做增量比较

    pg_rman恢复默认原地恢复(覆盖式),或者使用新的$PGDATA作为恢复目标。需注意如果在本机恢复pg_rman可能会覆盖原有的数据文件归档,pg_wal目录中的文件, 可以先将原数据文件做下备份。

    未校验备份集 Status 显示为 DONE,校验通过备份集Status显示为OK

    Standby节点全库备份:pg_rman backup -D /data/pgdata(备节点) -b full --host=Master_IP --standby-host=Standby_IP --standby-port=5432

    在基于时间点恢复之后,那么此时DB与之前的备份已经不在同一时间线上。恢复默认只沿着基础备份建立时时间线恢复而不会切换到新的时间线,所以建议在恢复之后,立即对数据库做一个全库的备份。


二、安装部署

    下载地址(根据数据库版本下载对应安装包文件):

    https://github.com/ossc-db/pg_rman/releases

解压安装文件

    tar -xvf pg_rman-1.3.16-pg15.tar.gz

    chown -R postgres.postgres pg_rman-1.3.16-pg15

进入源码目录进行编译安装

    su - postgres #使用postgres用户安装,自动部署到$PGHOME/bin目录下

    cd pg_rman-1.3.16-pg15

    make && make install

    

配置环境变量:

    vi ~/.bash_profile

    export PGRMAN=/usr/local/pgsql

    export BACKUP_PATH=/data/pgbackup

    export ARCLOG_PATH=/data/pgarchive

    export SRVLOG_PATH=/data/pgdata/log

    export PATH=$PGHOME/bin:$PGRMAN/bin:$PATH:.

    source ~/.bash_profile


三、备份示例

pg_rman支持以下命令:

    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 --从备份目录中删除已删除备份记录信息的备份文件


1、初始化备份目录

    首先需要初始化一个backup catalog,目录将用于存放备份的文件,目录也会存放一些元数据,例如备份的配置文件,数据库的系统ID,时间线文件历史等

    注意:在初始化的时候,要先确认环境变量是否设置正确。

    pg_rman init -B /data/pgbackup #如果没设置环境变量BACKUP_PATH,需要手动指明备份路径

    

#数据库配置文件设置归档

    archive_mode = on

    archive_command = 'cp %p /data/pgarchive/%f'

    archive_cleanup_command = 'pg_archivecleanup /data/pgdata/pg_wal %r'


2、全量备份恢复

    执行全量备份恢复步骤如下;

创建测试数据

    create database testdb1;

    \c testdb1;

    create table t1(id serial primary key, name varchar(30), create_time timestamp default now());

    insert into t1(name) select '用户-' || n from generate_series(1,10000) n;

    

执行全量备份

    pg_rman backup -b full --with-serverlog #--with-serverlog表示将数据库日志文件一起备份

    

查看备份集信息

    pg_rman show

    

    注:未校验备份集Status显示为DONE,校验通过的备份集Status显示为OK

执行全量恢复

    恢复前删除部分测试数据

    

    停止数据库,执行全量恢复

    pg_rman restore

    

    启动数据,验证恢复数据

    


3、增量备份恢复

    增量备份是基于文件系统的update time时间线.

    增量备份前提:

        --必须要有个对应的全库备份(在插入增量测试数据前先做下全备操作)。

        --当全库备份后需要验证备份集。

新增测试数据

    insert into t1 (name) select n || '增量备份' from generate_series(10001, 10010) n;

    select * from t1 where id >= 10001;

    select pg_switch_wal();

    

执行增量备份

    增量备份前删除部分记录

    

执行增量备份

    pg_rman backup -b incremental -P

    

执行恢复

    停止数据库,执行恢复操作

    pg_rman restore -P

    

验证恢复数据

    pg_ctl start

    \c testdb1

    select * from t1 where id >= 10001;

    


4、基于指定时间点恢复

    还原到指定时间点默认动作recovery_target_action='pause',暂停;此时可以用超户执行select pg_wal_replay_resume(); 或者在启动数据库实例前在postgresql.conf中添加recovery_target_action='promote'。

    --如果不指定hard-copy,则归档日志目录里的归档日志是使用的硬连接指向备份目录中的归档日志,加了这个参数的话,则是直接把备份目录中的归档日志拷贝到归档日志目录。

    恢复到指定时间点,通过参数 --recovery-target-time=time 指定恢复的具体时间点。

执行全量备份

    新增测试数据前,执行一次全量备份(当前数据库已经恢复一次,与之前的全量备份已不在当前时间线上)

    pg_rman backup -b full -P

    pg_rman validate

    pg_rman show

    

创建测试数据

    insert into t1 (name) select n || '恢复到指定时间点' from generate_series(1, 5) n;

    select * from t1 where id >= 10011;

    

记录当前时间(恢复时间点)

    select current_timestamp; #select now();

    

    2024-02-09 22:02:12.71396+08

再新增部分记录(这部分记录不被恢复)

    insert into t1 (name) select n || '恢复时间点之后记录' from generate_series(1, 5) n;

    select * from t1 where id > 10011;

    

执行增量备份

    pg_rman backup -b incremental -P

    pg_rman validate

    pg_rman show

    

关闭数据库,执行基于时间点的恢复

    pg_rman restore --recovery-target-time "2024-02-09 22:02:12" --hard-copy -P

    

    

验证恢复数据

    启动数据库,验证记录是否仅恢复到执行时间点

    select * from t1 where id >= 10011;

    

    注:仅恢复到指定时间点的记录,指定时间点之后的记录没有恢复(不完全恢复)。

恢复数据库为读写模式

    select pg_wal_replay_resume();

    


5、基于指定XID点恢复

    恢复到指定时间点,通过参数 --recovery-target-xid=xid 指定恢复的具体XID点。

执行全量备份

    新增测试数据前,执行一次全量备份(当前数据库已经恢复一次,与之前的全量备份已不在当前时间线上)

    pg_rman backup -b full -P

    pg_rman validate

    pg_rman show

    

创建测试数据

    insert into t1 (name) select n || '恢复到指定XID点' from generate_series(1, 5) n;

    select * from t1 where id >= 10011;

    

记录当前XID(恢复事务点)

    select txid_current();

    

    XID=778

再新增部分记录(这部分记录不被恢复)

    insert into t1 (name) select n || '恢复XID点之后记录' from generate_series(1, 5) n;

    select * from t1 where id > 10015;

执行增量备份

    pg_rman backup -b incremental -P

    pg_rman validate

    pg_rman show

    

关闭数据库,执行基于XID点的恢复

    pg_rman restore --recovery-target-xid 778 --hard-copy -P

    

    

验证恢复数据

    启动数据库,验证记录是否仅恢复到执行时间点

    select * from t1 where id > 10015;

    

    注:仅恢复到指定XID点的记录,指定XID点之后的记录没有恢复(不完全恢复)。

恢复数据库为读写模式

    select pg_wal_replay_resume();

    


6、归档备份

    归档备份就是静态文件的拷贝。

    pg_rman backup -b archive -P

    

7、备份策略

    备份初始化后,在BACKUP_PATH目录下创建 pg_rman.ini配置文件,根据业务需求进行相应的备份策略配置,在进行备份时自动执行检查。例如:

    ARCLOG_PATH='/data/pgarchive' --归档目录

    SRVLOG_PATH='/data/pgdata/log' --数据库错误日志目录

    COMPRESS_DATA = YES --压缩数据

    KEEP_ARCLOG_FILES = 10 --保存归档文件个数

    KEEP_ARCLOG_DAYS = 10 --保存归档的天数

    KEEP_DATA_GENERATIONS = 3 --备份冗余度(保留全量备份集份数)

    KEEP_DATA_DAYS = 10 --保存备份集天数

    KEEP_SRVLOG_FILES = 10 --保存日志文件个数

    KEEP_SRVLOG_DAYS = 10 --保存日志文件天数


四、参数说明

    使用 pg_rman --help 可以查看相关参数选项。

常用选项:

    -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

    -G, --pgconf-path=PATH location of the configuration storage area

    -c, --check show what would have been done

    -v, --verbose show what detail messages

    -P, --progress show progress of processed files

备份选项:

    -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

恢复选项:

    --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

    --recovery-target-action action the server should take once the recovery target is reached

    --hard-copy copying archivelog not symbolic link

目录选项:

    -a, --show-all show deleted backup too

删除选项:

    -f, --force forcibly delete backup older than given DATE

连接选项

    -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

常规选项:

    -q, --quiet don't show any INFO or DEBUG messages

    --debug show DEBUG messages

    --help show this help, then exit

    --version output version information, then exit

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论