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

PostgreSQL备份恢复(pgBackRest)

tigerdog 2024-02-07
2228

pgBackRest是一个可靠、高效、功能丰富的PostgreSQL备份和恢复工具,架构如下图所示:

IMG_256

支持如下功能:

    1、开源备份工具,使用此工具不涉及许可或额外费用。

    2、支持并行备份,可以将压缩文件流式传输到本地或远程存储库或云。

    3、支持增量和差异备份。

    4、将备份流式传输到云 - 支持 AWS、Azure 和 GCS 兼容对象存储。

    5、支持加密。存储库可以由 pgBackRest 加密以保护备份。

    6、不需要本地暂存区将备份流式传输到远程存储或云。可以直接将备份流式传输到云或远程存储库,而无需在本地写入任何文件。

    7、在 PostgreSQL 中支持数百万或数十亿的对象。

    8、用于还原和恢复的简单命令,包括时间点恢复。为 PITR 手动拉取某个 WAL 段时不需要手动干预。

    9、用作企业备份工具的目的,该工具可以作为统一解决方案,从单个备份服务器跨基础架构维护所有PostgreSQL 数据库的备份。

    10、支持从已使用流式复制配置的备用服务器(或只读副本)进行备份。

    11、能够利用多台备用服务器的计算能力进行备份。

    12、支持根据配置自动保留备份和存档。

    13、支持并行异步归档以提高归档速度。

    14、支持备份具有数千个表空间的 Postgres 数据库。


一、部署安装

    使用源码编译安装。

    源码下载地址:https://github.com/pgbackrest/pgbackrest

1、安装依赖软件包

    yum install tar make gcc libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel libyaml

    #如果是独立部署pgBackRest还需安装 postgresql-libs

2、编译安装

    tar -xvf pgbackrest-release-2.50.tar.gz

    cd pgbackrest-release-2.50

    ./configure

    make && make install #默认安装到/usr/local/bin目录下(或者configure时指定--prefix选项)

    

#查看安装版本

    pgbackrest version

    

#查看命令帮助

    pgbackrest help

    pgbackrest help backup

    

3、初始化配置

    使用pgbackrest进行备份恢复前需要进行相关的配置操作。

创建 pgbackrest 操作系统用户

    该操作系统用户必须有权对存储库目录执行读取和写入操作,也可直接使用postgres用户。

    groupadd pgbackrest

    useradd -r -g pgbackrest pgbackrest

    mkdir -p home/pgbackrest

    chown pgbackrest:pgbackrest home/pgbackrest

创建配置日志目录

    mkdir -p /var/log/pgbackrest

    chmod 770 /var/log/pgbackrest

    chown -R postgres.postgres /var/log/pgbackrest

创建仓库路径

    mkdir -p /var/lib/pgbackrest

    chmod 750 /var/lib/pgbackrest

    chown -R postgres.postgres /var/lib/pgbackrest

创建配置目录和文件

    mkdir -p /etc/pgbackrest/conf.d

    touch /etc/pgbackrest/pgbackrest.conf

    chmod 640 /etc/pgbackrest/pgbackrest.conf

    chown -R postgres:postgres /etc/pgbackrest

生成备份所需密码

    openssl rand -base64 48

    LB0yunqL+U2JevbEqSkLn5NU1Xe/OryaBpl5S1dQ8ts38zgSr8NwRL3SULmDGvGu

    

修改配置文件

    vi /etc/pgbackrest/pgbackrest.conf

        [global]

        repo1-path=/var/lib/pgbackrest

        repo1-retention-full=2

        #repo1-cipher-pass=LB0yunqL+U2JevbEqSkLn5NU1Xe/OryaBpl5S1dQ8ts38zgSr8NwRL3SULmDGvGu

        #repo1-cipher-type=aes-256-cbc

        #start-fast=y

        #process-max=3

        #backup-user=postgres

        #log-path=/var/log/pgbackrest

        [global:archive-push]

        compress-level=3

        [mypgdb]

        pg1-path=/data/pgdata

        pg1-port=5432

        pg1-socket-path=/tmp

数据库配置项修改

    su - postgres

    vi postgresql.conf

        listen_addresses = '*'

        wal_level = replica

        max_wal_senders = 3

        archive_mode = on

        archive_command = 'pgbackrest --stanza=mypgdb archive-push %p'

        logging_collector = on

        log_rotation_size = 50MB

        log_rotation_age = 1d

        log_truncate_on_rotation = on

#创建.pgpass文件,

    su - postgres

    vi .pgpass

    localhost:5432:postgres:postgres:postgres #或者(指定端口所有数据库) localhost:5432:*:postgres:postgres

    127.0.0.1:5432:postgres:postgres:postgres #或者(指定端口所有数据库) 127.0.0.1:5432:*:postgres:postgres

    chmod 0600 .pgpass

设置环境变量

    vi .bashrc

        export PGPASSFILE=~/.pgpass

#配置生效

    source ./.bashrc

#配置pg动态库链接

    ln -s /usr/local/pgsql/lib/libpq.so.5 /usr/lib64/libpq.so.5

重启数据库实例

    pg_ctl -D $PGDATA restart


二、示例参考

    PGDATA=/data/pgdata

前提条件

1、创建归档和备份目录

    mkdir /data/pgarchive /data/pgbackup

    chown -R postgres.postgres /data/pgarchive /data/pgbackup

2、开启归档模式

    vi postgresql.conf

        wal_level = 'replica'

        archive_mode = 'on'

3、创建复制权限用户

    创建replication权限的角色, 或者超级用户的角色。

    create role repuser nosuperuser replication login connection limit 5 encrypted password 'repuser';

4、创建节(初始化stanza)

    pgbackrest --stanza=mypgdb --log-level-console=info stanza-create

    

    执行初始化后,在仓库目录下创建如下目录:

    tree -L 2 /var/lib/pgbackrest

    

5、检查配置(测试archive 命令)

    pgbackrest --stanza=mypgdb --log-level-console=info check

    #这将强制PostgreSQL服务器切换WAL段并使用archive_command归档该WAL段。

    


示例-1、全量备份恢复

    --type=full 全量备份。

    --type=incr 增量备份仅备份自上次备份(全量、增量、差异)以来的更改。

    --type=diff 差异备份备份自上次全量备份以来的所有更改。

    --exclude 排除某个目录或文件,例如排除log日志目录 --exclude=log/

    https://pgbackrest.org/user-guide-rhel.html#backup

    https://pgbackrest.org/user-guide-rhel.html#restore

全量备份恢复步骤如下:

创建测试数据

    create database testdb;

    \c testdb;

    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;

执行全量备份

    pgbackrest --stanza=mypgdb --log-level-console=info backup --type=full --start-fast --compress --process-max=4

    # --start-fast :触发快速检查点,而不是等到下一个定时检查点。

    # --compress :启用压缩备份。默认情况下压缩是打开的。

    # --process-max :可以启动备份以加快备份速度的并发进程数。

    

查看备份信息

    pgbackrest info --stanza=mypgdb

    

执行全量恢复

    停止数据库、删除数据目录文件

    pg_ctl stop

    rm -rf $PGDATA/*

    pgbackrest --stanza=mypgdb --log-level-console=info restore --type=default

    

验证恢复数据

    select pg_wal_replay_resume();

    


示例-2、增量备份恢复

    执行增量备份恢复步骤如下:

新增测试数据

    insert into t1(name) select '增量备份恢复-' || n from generate_series(1,5) n;

    select * from t1 where id > 10000;

    

    insert into t1(name) select '增量备份-' || n from generate_series(1,5) n;

    select * from t1 where id > 10000;

    

执行增量备份

    pgbackrest --stanza=mypgdb --log-level-console=info backup --type=incr

    

    pgbackrest --stanza=mypgdb --log-level-console=info backup --type=incr

    

查看备份信息

    pgbackrest info

    

    pgbackrest info

    

执行增量恢复

    恢复到第一个增量备份集 20240207-143144F_20240207-145858I

    停止数据库、删除数据目录文件

    pg_ctl stop

    rm -rf $PGDATA/*

    pgbackrest --stanza=mypgdb --set=20240207-143144F_20240207-145858I --type=immediate --delta restore --log-level-console=info

    

验证恢复数据

    #select pg_is_in_recovery();

    #select pg_wal_replay_resume();

    \c testdb

    select * from t1 where id > 10000;

    

    注:在备份集 20240207-143144F_20240207-145858I 之后的记录没有回复。


示例-3、恢复指定数据库

    备份实例包括多个数据库时,也可在恢复的时候仅恢复指定的数据。

新建备份仓库

    pgbackrest --stanza=mypgdb stop --log-level-console=info

    pgbackrest --stanza=mypgdb --repo=1 stanza-delete --log-level-console=info

    pgbackrest --stanza=mypgdb stanza-create --log-level-console=info

创建测试数据(testdb1,testdb2)

    create database testdb1;

    create database testdb2;

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

    \c testdb2;

    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;

    

执行全量备份

    pgbackrest --stanza=mypgdb --log-level-console=info backup --type=full --start-fast

    

查看备份集信息

    pgbackrest info

    

删除数据库

    drop database testdb1;

    drop database testdb2;

停止数据库服务

    pg_ctl stop

恢复指定数据库(testdb1)

    pgbackrest --stanza=mypgdb --delta --db-include=testdb1 --type=immediate --target-action=promote restore --log-level-console=info

    

验证恢复数据

    

    注:如上图所示testdb2数据库没有恢复,仅恢复了数据库testdb1


示例-4、恢复到指定时间点

    恢复到指定时间点验证如下:

#创建测试数据

    \c testdb1

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

    select * from t1 where id > 10000;

    

记录恢复时间点

    #select current_timestamp;

    select now(); #2024-02-07 17:33:51.991182+08

    

再插入5条测试记录

    insert into t1(name) select '指定时间点后记录-' || n from generate_series(1,5) n;

    select * from t1 where id > 10000;

    select pg_switch_wal();

    checkpoint;

    

执行增量备份

    pgbackrest --stanza=mypgdb backup --type=incr --log-level-console=info

    

查看备份集信息

    pgbackrest --stanza=mypgdb info --log-level-console=info

    

恢复到指定时间点

    pg_ctl stop -D /data/pgdata

    pgbackrest --stanza=mypgdb --delta --type=time --target="2024-02-07 17:33:51.991182+08" --target-action=promote restore --log-level-console=info

    

验证恢复数据

    \c testdb1;

    select * from t1 where t1 where id > 10000;

    

    注:如上图所示,数据仅恢复到了指定时间点记录,之后新增记录没有回复。


 示例-5、恢复到指定LSN点

    恢复到指定LSN点验证如下:

#创建测试数据

    \c testdb2

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

    select * from t1 where id > 10000;

    

记录恢复LSN点

    select pg_current_wal_lsn(); #0/1E009540

    

再插入5条测试记录

    insert into t1(name) select '指定LSN点后记录-' || n from generate_series(1,5) n;

    select * from t1 where id > 10000;

    select pg_switch_wal();

    checkpoint;

    

执行增量备份

    pgbackrest --stanza=mypgdb backup --type=incr --log-level-console=info

    

查看备份集信息

    pgbackrest --stanza=mypgdb info --log-level-console=info

    

恢复到指定LSN点

    pg_ctl stop -D /data/pgdata

    pgbackrest --stanza=mypgdb --delta --type=lsn --target="0/1E009540" --target-action=promote restore --log-level-console=info

    

验证恢复数据

    \c testdb2;

    select * from t1 where t1 where id > 10000;

    

    注:如上图所示,数据仅恢复到了指定LSN点记录,之后新增记录没有回复。

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

评论