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

使用pgbackrest进行远端备份和还原

2872

作者简介

 Granthana Biswas cybertec公司工程师。

译者简介

王志斌,从事数据库产品相关工作,主要致力于postgresql数据库高可用解决方案及云端产品化工作。

校对者简介

李鑫,任职于海能达通信股份有限公司,数据库开发高级工程师,致力于postgresql数据库在专网通信领域、公共安全领域的应用与推广。

在上一篇关于pgBackRest的文章中,我们了解了如何安装和设置pgBackRest,并且为PostgreSQL进行一次备份。这是一个非常基本的单服务器设置,只是为了掌握该工具的窍门。在生产环境中不推荐使用这种操作,因为不建议在运行数据库的同一服务器上执行备份(或者说不起作用)。
所以:让我们熟悉如何使用pgbackback设置远程备份服务器,以及如何从备份服务器执行完整备份和增量备份,以及如何在数据库服务器上进行恢复。
我们需要两台服务器。命令如下:
1. 备份服务器
2. 数据库服务器

安装pgbackrest:

我们需要安装pgBackRest到数据库服务器和备份服务器上。确定你安装了相同的版本。.
 对于数据库服务器,请按照我上一篇文章中的安装步骤进行操作。备份服务器的步骤略有不同,因为创建一个单独的用户来拥有存储库是更好的做法。

在备份服务器上创建pgbackrest用户

    sudo adduser --disabled-password --gecos "" pgbackrest

    从包中安装需要的Perl包和pgBackRest或者安装以下方式手工安装: 

      sudo apt-get install libdbd-pg-perl
      sudo scp BUILD_HOST:/root/pgbackrest-release-2.14/src/pgbackrest usr/bin/
      sudo chmod 755 usr/bin/pgbackrest

      在备份服务器上创建pgBackRest配置文件, 目录和仓库

        sudo mkdir -p -m 770 var/log/pgbackrest
        sudo chown pgbackrest:pgbackrest var/log/pgbackrest
        sudo mkdir -p etc/pgbackrest
        sudo mkdir -p etc/pgbackrest/conf.d
        sudo touch etc/pgbackrest/pgbackrest.conf
        sudo chmod 640 etc/pgbackrest/pgbackrest.conf
        sudo chown pgbackrest:pgbackrest etc/pgbackrest/pgbackrest.conf
        sudo mkdir -p var/lib/pgbackrest
        sudo chmod 750 /var/lib/pgbackrest
        sudo chown pgbackrest:pgbackrest /var/lib/pgbackrest
        现在我们可以开始启用数据库服务器和备份服务器之间的通信了。pgBackRest需要一个无密码的SSH连接。
        我们可以通过使用命令生成SSH身份验证密钥文件来实现这一点
          ssh-keygen

          在备份服务器上使用pgbackrest用户:

            sudo -u pgbackrest mkdir -m 750 /home/pgbackrest/.ssh
            sudo -u pgbackrest ssh-keygen -f /home/pgbackrest/.ssh/id_rsa -t rsa -b 4096 -N ""

            在数据库服务器上使用 postgres用户:

                sudo -u postgres mkdir -m 750 -p /var/lib/postgresql/.ssh
              sudo -u postgres ssh-keygen -f /var/lib/postgresql/.ssh/id_rsa -t rsa -b 4096 -N ""


              在两个服务器之间交换公钥

              在备份服务器上:

                cat ~/.ssh/id_rsa.pub | ssh postgres@db1 "cat >> ~/.ssh/authorized_keys"

                在数据库服务器上:

                  cat ~/.ssh/id_rsa.pub | ssh pgbackrest@pgbackup "cat >> ~/.ssh/authorized_keys"

                  测试无密码连接,命令如下:

                    root@pgbackup:~$ sudo -u pgbackrest ssh postgres@db1
                    root@db1:~$ sudo -u postgres ssh pgbackrest@repository


                    配置

                    在备份服务器上,在pgBackRest配置文件中配置数据库主机和路径以及存储备份的存储库路径。我们已将数据库主机添加为“pg1-host”,以后可以将更多数据库主机添加为“pg2-host”依此类推。pg1-path也是如此。

                      cat /etc/pgbackrest/pgbackrest.conf
                      [demo]
                      pg1-host=db1
                      pg1-path=/var/lib/postgresql/10/main
                      [global]
                      repo1-path=/var/lib/pgbackrest
                      repo1-retention-full=2
                      start-fast=y
                      Start Fast选项(--start-fast) 强制在快速备份的时候使用检查点。否则,备份将在下一个常规检查点之后启动。
                      在数据库服务器上,在pgBackRest配置文件中配置数据库路径和备份主机,如下所示:.
                        cat /etc/pgbackrest/pgbackrest.conf
                        [demo]
                        pg1-path=/var/lib/postgresql/10/main
                         [global]
                        log-level-file=detail
                        repo1-host=pgbackup

                        在数据库服务器上,更新postgresql.conf 文件,进行如下更改:

                          archive_command = 'pgbackrest --stanza=demo archive-push %p'
                          archive_mode = on
                          listen_addresses = '*'
                          log_line_prefix = ''
                          max_wal_senders = 3
                          wal_level = replica

                          现在重新启动PostgreSQL使配置文件更改生效。

                          在备份服务器上创建一节并检查它是否工作。没有结果意味着节已成功创建。

                            sudo -u pgbackrest pgbackrest --stanza=demo stanza-create
                            sudo -u pgbackrest pgbackrest --stanza=demo check

                            检查数据库服务器上检查节配置是否正确:

                                sudo -u postgres pgbackrest --stanza=demo check


                              备份

                              安装就绪后,让我们从备份服务器上进行第一次远程备份。默认备份是增量备份,但第一次备份始终是完全备份。
                                sudo -u pgbackrest pgbackrest --stanza=demo backup
                                sudo -u pgbackrest pgbackrest --stanza=demo info
                                stanza: demo
                                    status: ok
                                    cipher: none
                                db (current)
                                    wal archive min/max (10-1): 000000010000000000000007/000000010000000000000008
                                    full backup: 20190726-133657F
                                        timestamp start/stop: 2019-07-26 13:36:57 / 2019-07-26 13:37:07
                                        wal start/stop: 000000010000000000000007 / 000000010000000000000007
                                        database size: 22.5MB, backup size: 22.5MB
                                        repository size: 2.6MB, repository backup size: 2.6MB
                                您可以在备份路径下找到创建的路径和文件。


                                还原

                                很容易执行一个全量备份。让我们看一些增量备份和恢复的示例:
                                在数据库服务器上创建一个测试数据库:
                                  postgres=# create database test;
                                  CREATE DATABASE
                                  postgres=# \l
                                  List of databases
                                   Name   |  Owner   | Encoding |   Collate   |    Ctype    | Access privileges
                                  -----------+----------+----------+-------------+-------------+-----------------------
                                   postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
                                   template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres postgres=CTc/postgres
                                   template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres  postgres=CTc/postgres
                                   test      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
                                  (4 rows)

                                  再备份一次。因为这是第二次备份,我们没有指定类型,默认情况下,这将是增量备份:

                                      sudo -u pgbackrest pgbackrest --stanza=demo backup

                                    为了在数据库服务器上运行pgbackrest进行还原,请停止PostgreSQL:

                                      sudo service postgresql stop
                                      sudo -u postgres pgbackrest --stanza=demo --delta restore
                                      sudo service postgresql start

                                      如果现在检查数据库,将找不到测试数据库。这是因为备份是从第一次完全备份还原的。.

                                        postgres=# \l
                                        List of databases
                                           Name    |  Owner   | Encoding | Collate     | Ctype       | Access privileges
                                        -----------+----------+----------+-------------+-------------+-----------------------
                                         postgres  | postgres  | UTF8    | en_US.UTF-8 | en_US.UTF-8 |
                                         template0 | postgres  | UTF8    | en_US.UTF-8 | en_US.UTF-8 | =c/postgres postgres=CTc/postgres
                                         template1 | postgres  | UTF8    | en_US.UTF-8 | en_US.UTF-8 | =c/postgres postgres=CTc/postgres
                                        (3 rows)

                                         从增量备份中还原数据,在--recovery-option中使用recovery_target来运行还原命令: 

                                          sudo service postgresql stop
                                          sudo -u postgres pgbackrest --stanza=demo --delta restore \
                                          --recovery-option=recovery_target=immediate
                                          sudo service postgresql start

                                          让我们现在检查一下数据库:

                                            postgres=# \l
                                                                       List of databases
                                               Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges  
                                            -----------+----------+----------+-------------+-------------+-----------------------
                                             postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
                                             template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                                                       |          |          |             |             | postgres=CTc/postgres
                                             template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
                                                       |          |          |             |             | postgres=CTc/postgres
                                             test      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
                                            (4 rows)

                                            我希望这个练习能帮助你开始使用pgBackRest!要了解更多命令,请访问这里的官方网站。



                                            请点击文章底部“阅读原文”查看原文内容!






                                            PostgreSQL中文社区欢迎广大技术人员投稿
                                            投稿邮箱:press@postgres.cn


                                            文章转载自PostgreSQL中文社区,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                            评论