Granthana Biswas cybertec公司工程师。
王志斌,从事数据库产品相关工作,主要致力于postgresql数据库高可用解决方案及云端产品化工作。
李鑫,任职于海能达通信股份有限公司,数据库开发高级工程师,致力于postgresql数据库在专网通信领域、公共安全领域的应用与推广。
在上一篇关于pgBackRest的文章中,我们了解了如何安装和设置pgBackRest,并且为PostgreSQL进行一次备份。这是一个非常基本的单服务器设置,只是为了掌握该工具的窍门。在生产环境中不推荐使用这种操作,因为不建议在运行数据库的同一服务器上执行备份(或者说不起作用)。
所以:让我们熟悉如何使用pgbackback设置远程备份服务器,以及如何从备份服务器执行完整备份和增量备份,以及如何在数据库服务器上进行恢复。
我们需要两台服务器。命令如下:
1. 备份服务器
2. 数据库服务器
我们需要安装pgBackRest到数据库服务器和备份服务器上。确定你安装了相同的版本。.
对于数据库服务器,请按照我上一篇文章中的安装步骤进行操作。备份服务器的步骤略有不同,因为创建一个单独的用户来拥有存储库是更好的做法。
sudo adduser --disabled-password --gecos "" 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
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)