如何在CentOS 7上使用Barman备份,恢复和迁移PostgreSQL数据库

2018-09-21 09:58:36 浏览数 (1)

介绍

PostgreSQL是一个开源数据库平台,因其易于维护,成本效益以及与其他开源技术的简单集成而广受网络和移动应用程序开发人员的欢迎。

维护PostgreSQL环境的一个关键任务是定期备份其数据库。备份是任何组织的灾难恢复(DR)过程的一部分。这很重要,原因如下:

  • 防止由于存储或服务器本身等底层基础架构组件故障导致的数据丢失
  • 防止数据损坏和不必要或恶意的数据丢失
  • 将生产数据库迁移到开发或测试环境中

通常,数据库备份和恢复的责任落在DBA的肩上。但是,在较小的组织或初创公司中,系统管理员,DevOps工程师或程序员通常必须创建自己的数据库后端。因此,对于使用PostgreSQL的每个人来说,了解备份的工作方式以及如何从备份中恢复非常重要。

在本教程中,您将设置Barman备份服务器,从主数据库服务器进行备份,然后还原到备用服务器。

PostgreSQL备份方法简介

在启动Barman设置之前,让我们花一点时间来回顾一下PostgreSQL可用的备份类型及其用途。(自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL 数据库引擎,并针对数据库引擎的性能进行了优化。云关系型数据库是一种高度可用的托管服务,提供容灾、备份、恢复、监控、迁移等数据库运维全套解决方案,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专注于您的应用和业务。)

PostgreSQL提供两种类型的备份方法:

  • 逻辑备份
  • 物理备份

逻辑备份就像数据库的快照。这些是使用PostgreSQL附带的pg_dumppg_dumpall实用程序创建的。逻辑备份:

  • 备份单个数据库或所有数据库
  • 仅备份模式,仅备份数据,单个表或整个数据库(模式和数据)
  • 以专有二进制格式或纯SQL脚本创建备份文件
  • 可以使用PostgreSQL附带的pg_restore实用程序进行恢复
  • 不提供时间点恢复(PITR)

这意味着如果您在早上2:00进行数据库的逻辑备份,则从中恢复时,恢复的数据库将与凌晨2:00时一样。没有办法在特定时间点停止恢复,例如凌晨1:30。如果您在上午10:00恢复备份,则丢失了8小时的数据。

物理备份与逻辑备份不同,因为它们仅处理二进制格式并进行文件级备份。物理备份:

  • 提供时间点恢复
  • 备份PostgreSQL 数据目录WAL(Write Ahead Log)文件的内容
  • 占用更大的磁盘空间
  • 使用PostgreSQL pg_start_backuppg_stop_backup命令。但是,这些命令需要编写脚本,这使得物理备份成为一个更复杂的过程
  • 不要备份单个数据库,仅备份模式等。这是一种全有或全无的方法

WAL文件包含发生在数据库中的事务列表(INSERT,UPDATE或DELETE)。包含数据的实际数据库文件位于数据目录中。因此,当从物理备份恢复到某个时间点时,PostgreSQL首先恢复数据目录的内容,然后从WAL文件中播放它上面的事务。这使数据库及时处于一致状态。

Barman备份如何工作

传统上,PostgreSQL DBA会编写自己的备份脚本和预定cron作业来实现物理备份。巴曼以标准化的方式做到这一点。

BarmanBackup and Recovery Manager是来自2ndQuadrant的免费开源PostgreSQL备份工具,这是一家专业的Postgres解决方案公司。Barman是用Python编写的,为PostgreSQL实例提供了一种简单,直观的物理备份和恢复方法。使用Barman的一些好处是:

  • 这是完全免费的
  • 它是一个维护良好的应用程序,并提供供应商提供的专业支持
  • 让DBA / Sysadmin免于编写和测试复杂的脚本和cron作业
  • 可以将多个PostgreSQL实例备份到一个中心位置
  • 可以还原到同一个PostgreSQL实例或不同的实例
  • 提供压缩机制以最小化网络流量和磁盘空间

目标

在本教程中,我们将创建三个腾讯云CVM,在其中两台机器上安装PostgreSQL 9.4,并在第三台机器上安装Barman。

其中一个PostgreSQL服务器将是我们的主数据库服务器:这是我们创建生产数据库的地方。第二个PostgreSQL实例将为空并被视为备用机器,我们可以从备份中恢复。

Barman服务器将与主数据库服务器通信并执行物理备份和WAL归档。

然后,我们将通过从我们的实时数据库中删除一个表来模拟“灾难”。

最后,我们将备份的PostgreSQL实例从Barman服务器恢复到备用服务器。

准备

要学习本教程,您需要创建三个腾讯CVM(或您自己的Linux服务器),每个CVM至少有2 GB RAM和2个CPU核心。(你可能需要三台已经设置好可以使用sudo命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)

所有三台服务器都应具有相同的操作系统(CentOS 7 x64位)。

我们将这些机器命名如下:

  • main-db-server(我们将其IP地址表示为main-db-server-ip)
  • standby-db-server(我们将其IP地址表示为standby-db-server-ip)
  • barman-backup-server(我们将其IP地址表示为barman-backup-server-ip)

可以从DigitalOcean控制面板找到机器的实际IP地址。

您还应该在每台服务器上设置一个sudo用户,并将其用于一般访问。大多数命令将作为两个不同的用户(postgresbarman)执行,但是每个服务器上也需要一个sudo用户,因此您可以切换到这些帐户。

注意:本教程将使用默认的Barman安装目录作为备份位置。在CentOS,这个位置是:/var/lib/barman/。2ndQuadrant建议最好保留默认路径。在实际使用情况中,根据数据库的大小和要备份的实例数,您应该检查托管此目录的文件系统中是否有足够的空间。

警告: 您不应在生产服务器上运行本教程中的任何命令,查询或配置。本教程将涉及更改配置和重新启动PostgreSQL实例。在没有适当规划和授权的实时环境中这样做将意味着您的应用程序中断。

第1步 - 安装PostgreSQL数据库服务器

我们将首先在main-db-serverstandby-db-server上安装PostgreSQL 9.4来建立我们的数据库环境。

请完成PostgreSQL安装步骤

您需要:

  • 第一步 - 安装PostgreSQL一
  • 第二步 - 配置PostgreSQL一节

第二步 - 配置PostgreSQL,而不是更改pg_hba.conf文件以允许访问Web服务器的数据库,添加此行,以便Barman服务器可以使用barman-backup-server IP地址连接,然后/32

代码语言:javascript复制
host    all     all     barman-backup-server-ip/32        trust

这将PostgreSQL配置为接受来自Barman服务器的任何连接。

可以按原样遵循该部分中的其余说明。

注意:安装PostgreSQL将在数据库服务器上创建一个名为postgres的操作系统用户。此帐户没有密码; 你将从你的sudo用户切换到它。

确保在main-db-serverstandby-db-server上都安装了PostgreSQL ,并且允许从barman-backup-server访问它们。

接下来,我们将一些示例数据添加到主数据库服务器。

第2步 - 创建PostgreSQL数据库和表

一旦在两台机器上安装并配置了PostgreSQL,我们就会将一些示例数据添加到main-db-server以模拟生产环境。

main-db-server上,切换到用户postgres

代码语言:javascript复制
sudo su - postgres

启动该psql实用程序以访问数据库服务器:

代码语言:javascript复制
psql

psql提示符处,运行以下命令以创建数据库并切换到该数据库:

代码语言:javascript复制
CREATE DATABASE mytestdb;
connect mytestdb;

输出消息将告诉您现在以mytestdb用户身份连接到数据库postgres

接下来,在数据库中添加两个表:

代码语言:javascript复制
CREATE TABLE mytesttable1 (id integer NULL);
CREATE TABLE mytesttable2 (id integer NULL);

这些是命名mytesttable1mytesttable2

通过键入q并按下退出客户端工具ENTER

第3步 - 安装Barman

现在我们将在备份服务器上安装Barman,它将控制和存储我们的备份。

barman-backup-server上完成此步骤。

为此,您首先需要安装以下存储库:

  • Enterprise Linux(EPEL)存储库的额外包
  • PostgreSQL全球开发组RPM存储库

运行以下命令安装EPEL:

代码语言:javascript复制
sudo yum -y install epel-release

运行以下命令安装PostgreSQL仓库:

代码语言:javascript复制
sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

最后,运行此命令以安装Barman:

代码语言:javascript复制
sudo yum -y install barman

注意:安装Barman将创建一个名为barman的操作系统用户。此帐户没有密码; 您可以从sudo用户帐户切换到此用户。

Barmen已经安装好了!现在,让我们确保服务器可以安全地相互连接。

步骤4 - 配置服务器之间的SSH连接

在本节中,我们将为main-db-serverbarman-backup-server之间的安全无密码连接建立SSH密钥,反之亦然。

同样,我们将在standby-db-serverbarman-backup-server之间建立SSH密钥,反之亦然。

这是为了确保PostgreSQL(在两个数据库服务器上)和Barman可以在备份和恢复期间相互“交谈”。

在本教程中,您需要确保:

  • 用户postgres可以从main-db-server远程连接到barman-backup-server
  • 用户postgres可以从standby-db-server远程连接到barman-backup-server
  • 用户barman可以从barman-backup-server远程连接到main-db-server
  • 用户barman可以从barman-backup-server远程连接到standby-db-server

我们将向您展示如何设置连接以便用户postgresmain-db-server连接到barman-backup-server

main-db-server切换到用户postgres,如果它还不是当前用户:

代码语言:javascript复制
sudo su - postgres

运行以下命令以生成SSH密钥对:

代码语言:javascript复制
ssh-keygen -t rsa

按下接受密钥文件的默认位置和名称ENTER

ENTER两次以创建没有任何密码短语的私钥。

生成密钥后,将在postgres用户的主目录下创建一个.ssh目录,其中包含密钥。

您现在需要将SSH公钥复制到barman-backup-serverbarman用户的.ssh目录下的authorized_keys文件中。

注意:很遗憾,您无法在此处使用此ssh-copy-id barman@barman-backup-server-ip命令。那是因为这个命令会询问Barmen用户的密码,默认情况下没有设置。因此,您需要手动复制公钥内容。

运行以下命令输出postgres用户的公钥内容:

代码语言:javascript复制
cat ~/.ssh/id_rsa.pub

复制输出的内容。

切换到连接到barman-backup-server服务器的控制台并切换到用户barman

代码语言:javascript复制
sudo su - barman

运行以下命令以创建.ssh目录,设置其权限,将公钥内容复制到该authorized_keys文件,最后使该文件可读写:

代码语言:javascript复制
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "public_key_string" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

确保将长公钥字符串在引号之间从ssh-rsa开始,而不是public_key_string

您已将密钥复制到远程服务器。

现在,要测试连接,请切换回main-db-server并从那里测试连接:

代码语言:javascript复制
ssh barman@barman-backup-server-ip

在关于远程服务器的真实性未知并且您接受提示的初始警告之后,应该建立从主db-server服务器到barman-backup-server的连接。如果成功,请通过执行exit命令注销会话。

代码语言:javascript复制
exit

您需要再设置三次SSH密钥连接。您可以跳过制作.ssh目录(如果已经制作)(尽管这不是必需的)。

  • 再次运行相同的命令,这次是从standby-db-serverbarman-backup-server
  • 第三次运行它们,这次是来自barman-backup-server上的barman用户,然后转到main-db-server上的postgres用户
  • 最后,运行命令将密钥从barman-backup-server上的barman用户复制到standby-db-server上的postgres用户

确保以单向方式测试连接,以便接受有关新连接的初始警告。

standby-db-server

代码语言:javascript复制
ssh barman@barman-backup-server-ip

barman-backup-server

代码语言:javascript复制
ssh postgres@main-db-server-ip

barman-backup-server

代码语言:javascript复制
ssh postgres@standby-db-server-ip

注意:确保所有三台服务器之间的SSH连接是备份工作的必要条件。

步骤5 - 配置Barman进行备份

您现在将配置Barman来备份主PostgreSQL服务器。

BARMAN的主要配置文件是/etc/barman.conf。该文件包含一个全局参数部分,以及要备份的每个服务器的单独部分。默认文件包含一个名为main的示例PostgreSQL服务器的部分,该部分已注释掉。您可以将其用作指南来设置要备份的其他服务器。

行开头的 分号(;)表示该行已注释掉。与大多数基于Linux的应用程序一样,Barman的注释掉配置参数意味着系统将使用默认值,除非您取消注释并输入不同的值。

有一个参数是这样的:configuration_files_directory,其默认值为/etc/barman.d。这意味着,当启用时,Barman将使用该.conf目录中的文件来处理不同的Postgres服务器的备份配置。如果您发现主文件过于冗长,请随意为要备份的每个服务器创建单独的文件。

为了简化本教程,我们将把所有内容都放在默认配置文件中。

在文本编辑器中以sudo用户身份打开/etc/barman.conf(用户barman只具有读取权限):

代码语言:javascript复制
sudo vi /etc/barman.conf

全局参数在该[barman]部分下定义。在此部分下,进行以下更改。完成的值显示在项目符号下方:

  • 取消compression行的注释并保留gzip.的默认值。这意味着PostgreSQL WAL文件 - 在备份目录下复制时 - 将以gzip压缩格式保存
  • 取消该reuse_backup行的注释并保持link的默认值。在创建PostgreSQL服务器的完整备份时,Barman将尝试通过创建文件级增量备份来节省备份目录中的空间。这使用rsync和硬链接。创建增量完整备份与任何重复数据删除方法具有相同的优点:节省时间和磁盘空间
  • 取消该immediate_checkpoint行的注释并将其值设置为true。此参数设置确保当Barman启动完整备份时,它将请求PostgreSQL执行CHECKPOINT。检查点确保PostgreSQL内存缓存中的任何修改数据都写入数据文件。从备份的角度来看,这可以增加一些价值,因为BARMAN可以备份最新的数据更改
  • 取消该basebackup_retry_times行的注释并设置值为3。创建完整备份时,如果由于某种原因复制操作失败,Barman将尝试连接到PostgreSQL服务器三次
  • 取消该basebackup_retry_sleep行的注释并保持默认值30。每次重试之间会有30秒的延迟
  • 取消该last_backup_maximum_age行的注释并将其值设置为1 DAYS

新设置应如下所示:

摘自/etc/barman.conf

代码语言:javascript复制
[barman]
barman_home = /var/lib/barman
​
. . .
​
barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link
​
. . .
​
immediate_checkpoint = true
​
. . .
​
basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS

我们在这里做的是:

  • 保留默认备份位置
  • 指定应保存备份空间。WAL日志将被压缩,基本备份将使用增量数据复制
  • 如果完全备份由于某种原因中途失败,Barman将重试三次
  • PostgreSQL服务器上次完全备份的时间不应超过1天

在文件末尾添加一个新部分。它的标题应该用方括号里的[main-db-server]来表示。(如果要使用Barman备份更多数据库服务器,可以为每个服务器创建一个这样的块,并为每个服务器使用唯一的头名称。)

本节包含数据库服务器的连接信息以及一些独特的备份设置。

在新块中添加这些参数:

代码语言:javascript复制
[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@main-db-server-ip
conninfo = host=main-db-server-ip user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

这些retention_policy设置意味着Barman将自动覆盖旧的完整备份文件和WAL日志,同时为7天的恢复窗口保留足够的备份。这意味着我们可以将整个数据库服务器恢复到过去七天内的任何时间点。对于生产系统,您应该将此值设置得更高,以便手头有更旧的备份。

您需要在ssh_commandconninfo的参数中使用main-db-server的IP地址。否则,您可以完全复制上述设置。

修改后的文件的最终版本应如下所示,减去所有注释和未修改的设置:

代码语言:javascript复制
[barman]
barman_home = /var/lib/barman
​
. . .
​
barman_user = barman
log_file = /var/log/barman/barman.log
compression = gzip
reuse_backup = link
​
. . .
​
immediate_checkpoint = true
​
. . .
​
basebackup_retry_times = 3
basebackup_retry_sleep = 30
last_backup_maximum_age = 1 DAYS
​
. . .
​
[main-db-server]
description = "Main DB Server"
ssh_command = ssh postgres@main-db-server-ip
conninfo = host=main-db-server-ip user=postgres
retention_policy_mode = auto
retention_policy = RECOVERY WINDOW OF 7 days
wal_retention_policy = main

保存并关闭文件。

接下来,我们将确保将main-db-server配置为“进行备份”的状态。

第6步 - 配置postgresql.conf文件

main-db-server上有最后一个配置,用于打开备份(或归档)模式。

首先,我们需要从barman-backup-server找到传入备份目录的值。在Barman服务器上,切换到用户barman

代码语言:javascript复制
sudo su - barman

运行此命令以找到传入的备份目录:

代码语言:javascript复制
barman show-server main-db-server | grep incoming_wals_directory

这应该输出这样的东西:

代码语言:javascript复制
barman show-server command outputincoming_wals_directory: /var/lib/barman/main-db-server/incoming

记下值incoming_wals_directory; 在这个例子中,它是/var/lib/barman/main-db-server/incoming

现在切换到main-db-server控制台。

如果用户已经不是当前用户,请切换到用户postgres

在文本编辑器中打开postgresql.conf文件:

代码语言:javascript复制
vi $PGDATA/postgresql.conf

对文件进行以下更改:

  • 取消wal_level参数的注释并将其值设置为archive而不是minimal
  • 取消archive_mode参数的注释并将其值设置为on而不是off
  • 取消archive_command参数的注释并将其值设置为'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f'而不是''。使用Barman服务器的IP地址。如果您有不同于incoming_wals_directory的值,请使用该值。
代码语言:javascript复制
wal_level = archive                     # minimal, archive, hot_standby, or logical
​
. . .
​
archive_mode = on               # allows archiving to be done
​
. . .
​
archive_command = 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f'                # command to use to archive a logfile segment

切换回你的sudo用户

重启PostgreSQL:

代码语言:javascript复制
sudo systemctl restart postgresql-9.4.service

注意:如果您正在配置现有的生产PostgreSQL实例,则很可能已经设置了这三个参数。然后,您必须仅添加/修改archive_command参数,以便PostgreSQL将其WAL文件发送到备份服务器。

第7步 - 测试Barman

现在是时候检查Barman是否正确设置了所有配置并且可以连接到main-db-server

barman-backup-server上,如果不是当前用户,请切换到用户barman。运行以下命令以测试与主数据库服务器的连接:

代码语言:javascript复制
barman check main-db-server

请注意,如果您在步骤5中的/etc/barman.conf文件中的服务器块的方括号之间输入了不同的名称,则应使用该名称。

如果一切正常,输出应如下所示:

代码语言:javascript复制
barman check command outputServer main-db-server:
        PostgreSQL: OK
        archive_mode: OK
        wal_level: OK
        archive_command: OK
        continuous archiving: OK
        directories: OK
        retention policy settings: OK
        backup maximum age: FAILED (interval provided: 1 day, latest backup age: No available backups)
        compression settings: OK
        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
        ssh: OK (PostgreSQL server)
        not in recovery: OK

不要担心备份最大年龄FAILED状态。发生这种情况是因为我们已经配置了Barman,因此最新备份不应超过1天。尚未进行备份,因此检查失败。

如果任何其他参数处于某个FAILED状态,则应进一步调查并在继续之前解决问题。

检查失败可能有多种原因:例如,Barman无法登录Postgres实例,Postgres未配置为WAL归档,SSH无法在服务器之间工作,等等。无论原因是什么,都需要在备份发生之前修复。运行前面的步骤并确保所有连接都正常工作。

要获取使用Barman配置的PostgreSQL服务器列表,请运行以下命令:

代码语言:javascript复制
barman list-server

现在它应该只显示:

代码语言:javascript复制
main-db-server - Main DB Server

第8步 - 创建第一个备份

现在你准备好了Barman,让我们手动创建一个备份。

barman-backup-server上的barman用户身份运行以下命令进行首次备份:

代码语言:javascript复制
barman backup main-db-server

同样,该main-db-server值是您在步骤5 中作为/etc/barman.conf文件中服务器块的顶部输入的值。

这将启动PostgreSQL数据目录的完整备份。由于我们的实例只有一个带有两个表的小型数据库,所以它应该很快完成。

代码语言:javascript复制
Starting backup for server main-db-server in /var/lib/barman/main-db-server/base/20151111T051954
Backup start at xlog location: 0/2000028 (000000010000000000000002, 00000028)
Copying files.
Copy done.
Asking PostgreSQL server to finalize the backup.
Backup size: 26.9 MiB. Actual size on disk: 26.9 MiB (-0.00% deduplication ratio).
Backup end at xlog location: 0/20000B8 (000000010000000000000002, 000000B8)
Backup completed
Processing xlog segments for main-db-server
        Older than first backup. Trashing file 000000010000000000000001 from server main-db-server
        000000010000000000000002
        000000010000000000000002.00000028.backup

备份文件位置

那么备份保存在哪里?要查找答案,请列出/var/lib/barman目录的内容:

代码语言:javascript复制
ls -l /var/lib/barman

那里会有一个目录:main-db-server。这是服务器Barman当前配置为备份,其备份存在于那里。(如果将Barman配置为备份其他服务器,则每个服务器将创建一个目录。)在该main-db-server目录下,将有三个子目录:

  • base:这是保存基本备份文件的位置
  • incoming:PostgreSQL将完成的WAL文件发送到此目录进行存档
  • wals:Barman将incoming目录的内容复制到wals目录中

在恢复期间,Barman会将目录中的内容恢复base到目标服务器的数据目录中。然后,它将使用目录中的wals文件来应用事务更改并使目标服务器处于一致状态。

列出备份

有一个特定的Barman命令可列出服务器的所有备份。那个命令是barman list-backup。运行以下命令以查看它返回我们的main-db-server

代码语言:javascript复制
barman list-backup main-db-server
代码语言:javascript复制
Output
main-db-server 20151111T051954 - Wed Nov 11 05:19:46 2015 - Size: 26.9 MiB - WAL Size: 0 B
  • 输出的第一部分是服务器的名称。在这种情况下是main-db-server
  • 第二部分 - 长字母数字值 - 是备份的备份ID。备份ID用于唯一标识Barman所做的任何备份。在这种情况下,它是20151111T051954您将需要备份ID以用于后续步骤
  • 第三条信息告诉您何时进行备份
  • 第四部分是基本备份的大小(本例中为26.9 MB)
  • 字符串的第五个也是最后一个部分给出了备份的WAL存档的大小

要查看有关备份的更多详细信息,请使用服务器名称和上一个命令中的备份ID(在我们的示例中是20151111T051954)执行此命令:

代码语言:javascript复制
barman show-backup main-db-server backup-id

将显示一组详细信息:

代码语言:javascript复制
Output
Backup 20151111T051954:
  Server Name            : main-db-server
  Status                 : DONE
  PostgreSQL Version     : 90405
  PGDATA directory       : /var/lib/pgsql/9.4/data

  Base backup information:
    Disk usage           : 26.9 MiB (26.9 MiB with WALs)
    Incremental size     : 26.9 MiB (-0.00%)
    Timeline             : 1
    Begin WAL            : 000000010000000000000002
    End WAL              : 000000010000000000000002
    WAL number           : 1
    WAL compression ratio: 99.84%
    Begin time           : 2015-11-11 05:19:44.438072-05:00
    End time             : 2015-11-11 05:19:46.839589-05:00
    Begin Offset         : 40
    End Offset           : 184
    Begin XLOG           : 0/2000028
    End XLOG             : 0/20000B8

  WAL information:
    No of files          : 0
    Disk usage           : 0 B
    Last available       : 000000010000000000000002

  Catalog information:
    Retention Policy     : VALID
    Previous Backup      : - (this is the oldest base backup)
    Next Backup          : - (this is the latest base backup)

要深入查看哪些文件进入备份,请运行以下命令:

代码语言:javascript复制
barman list-files main-db-server backup-id

这将给出从该特定备份还原所需的基本备份和WAL日志文件的列表。

第9步 - 计划备份

理想情况下,您的备份应按计划自动进行。

在此步骤中,我们将自动执行备份,并且我们将告诉Barman对备份执行维护,以便删除早于保留策略的文件。要启用计划,请在barman-backup-server上以barman用户身份运行此命令(如有必要,请切换到此用户):

代码语言:javascript复制
crontab -e

这将为crontab用户barmen打开一个文件。编辑文件,添加这些行,然后保存并退出:

代码语言:javascript复制
30 23 * * * /usr/bin/barman backup main-db-server
* * * * * /usr/bin/barman cron

第一个命令将在每晚11:30 PM 运行main-db-server的完整备份。(如果您在/etc/barman.conf文件中使用了不同的服务器名称,请改用该名称。)

第二个命令将每分钟运行一次,并对WAL文件和基本备份文件执行维护操作。

第10步 - 模拟“灾难”

您现在将看到如何从刚创建的备份中恢复。为了测试恢复,我们首先模拟一个丢失了一些数据的“灾难”场景。

我们在这里删除一张表。不要在生产数据库上执行此操作!

返回主db-server控制台并切换到用户postgres(如果它还不是当前用户)。

启动该psql实用程序:

代码语言:javascript复制
psql

psql提示符处,执行以下命令将数据库上下文切换为mytestdb

代码语言:javascript复制
connect mytestdb;

接下来,列出数据库中的表:

代码语言:javascript复制
dt

输出将显示您在本教程开头创建的表:

代码语言:javascript复制
Output
            List of relations
 Schema |     Name     | Type  |  Owner
-------- -------------- ------- ----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres

现在,运行此命令以删除其中一个表:

代码语言:javascript复制
drop table mytesttable2;

如果您现在dt再次执行该命令:

代码语言:javascript复制
dt

你会看到只mytesttable1留下来。

这是您希望从备份还原的数据丢失情况类型。在这种情况下,您将备份还原到单独的服务器:standby-db-server

步骤11 - 恢复或迁移到远程服务器

您可以按照此部分还原备份,或将最新的PostgreSQL备份迁移到新服务器。

转到standby-db-server

首先,利用有sudo权限得用户停止PostgreSQL服务。(如果在服务运行时尝试运行恢复,则重启将会阻塞。)

代码语言:javascript复制
sudo systemctl stop postgresql-9.4.service

服务停止后,转到barman-backup-server。切换到用户barman,如果它还不是当前用户。

让我们找到最新备份的详细信息:

代码语言:javascript复制
barman show-backup main-db-server latest
代码语言:javascript复制
Backup 20160114T173552:
  Server Name            : main-db-server
  Status                 : DONE
  PostgreSQL Version     : 90405
  PGDATA directory       : /var/lib/pgsql/9.4/data

  Base backup information:

. . .

    Begin time           : 2016-01-14 17:35:53.164222-05:00
    End time             : 2016-01-14 17:35:55.054673-05:00

从输出中,记下第一行(上图中的20160114T173552)上打印的备份ID 。如果latest备份包含您需要的数据,则可以将其latest用作备份ID。

还可以从Begin time字段(上图中的2016-01-14 17:35:53.164222-05:00)检查备份的时间。

接下来,运行此命令将指定的备份从barman-backup-server恢复到standby-db-server

代码语言:javascript复制
barman recover --target-time "Begin time"  --remote-ssh-command "ssh postgres@standby-db-server-ip"   main-db-server   backup-id   /var/lib/pgsql/9.4/data

这里有很多选项,参数和变量,所以我们来解释一下。

  • --target-time "Begin time":使用show-backup命令中的开始时间
  • --remote-ssh-command "ssh postgres@standby-db-server-ip":使用standby-db-server的IP地址
  • main-db-server:使用/etc/barman.conf文件中的数据库服务器的名称
  • backup-id:使用show-backup命令中的备份ID ,或者如果是您想要,可以使用latest
  • /var/lib/pgsql/9.4/data:要还原备份的路径。此路径将成为备用服务器上Postgres的新数据目录。在这里,我们选择了CentOS中Postgres的默认数据目录。对于真实用例,请选择适当的路径

要成功执行还原操作,您应该收到如下输出:

代码语言:javascript复制
Starting remote restore for server  main-db-server using backup backup-id
Destination directory: /var/lib/pgsql/9.4/data
Doing PITR. Recovery target time: Begin time
Copying the base backup.
Copying required WAL segments.
Generating recovery.conf
Identify dangerous settings in destination directory.

IMPORTANT
These settings have been modified to prevent data losses

postgresql.conf line 207: archive_command = false

Your PostgreSQL server has been successfully prepared for recovery!

现在再次切换到standby-db-server控制台。作为sudo用户,启动PostgreSQL服务:

代码语言:javascript复制
sudo systemctl start postgresql-9.4.service

那应该是它!

让我们验证我们的数据库已启动。切换到用户postgres并启动该psql实用程序:

代码语言:javascript复制
sudo su - postgres
psql

切换数据库上下文mytestdb并列出其中的表:

代码语言:javascript复制
connect mytestdb;
dt
代码语言:javascript复制
            List of relations
 Schema |     Name     | Type  |  Owner   
-------- -------------- ------- ----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres
(2 rows)

该列表应在数据库中显示两个表。换句话说,您刚刚恢复了丢弃的表。

根据您更大的恢复策略,您现在可能想要故障转移到standby-db-server,或者您可能想要检查已还原的数据库是否正常工作,然后再次运行此部分以还原到main-db-服务器

要还原到任何其他服务器,只需确保已安装PostgreSQL并与Barman服务器建立适当的连接,然后使用目标恢复服务器的IP地址执行此部分。

结论

在本教程中,我们已经了解了如何安装和配置Barman来备份PostgreSQL服务器。我们还学习了如何从这些备份中恢复或迁移。

经过仔细考虑,Barman可以成为所有PostgresSQL数据库的中央存储库。它提供了强大的备份机制和简单的命令集。但是,创建备份只是故事的一半。您应始终通过将备份还原到其他位置来验证备份。这项工作应该定期进行。

将Barman纳入备份策略的一些问题:

  • 将备份多少个PostgreSQL实例?
  • Barman服务器上是否有足够的磁盘空间用于托管指定保留期的所有备份?如何监控服务器的空间使用情况?
  • 不同服务器的所有备份是否应该同时启动,还是可以在非高峰时段交错?同时启动所有服务器的备份会给Barman服务器和网络带来不必要的压力
  • Barman服务器和Postgres服务器之间的网络速度是否可靠?

另一点需要注意的是,Barman无法备份和恢复单个数据库。它适用于文件系统级别,并使用全有或全无的方法。在备份期间,备份包含其所有数据文件的整个实例; 恢复时,将恢复所有这些文件。同样,您不能使用Barman进行仅架构或仅数据备份。

因此,我们建议您设计备份策略,以便使用Barman进行逻辑备份pg_dumppg_dumpall使用Barman进行物理备份。这样,如果需要快速还原单个数据库,则可以使用pg_dump备份。对于时间点恢复,请使用Barman备份。

更多CentOS教程请前往腾讯云 社区学习更多知识。

参考文献:《How To Back Up, Restore, and Migrate PostgreSQL Databases with Barman on CentOS 7》

0 人点赞