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

​作者简介

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)

zhuan:http://www.postgres.cn/v2/news/viewone/1/669 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值