如何在CentOS7上使用Barman备份、恢复和迁移PostgreSQL数据库

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

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

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

在本教程中,您将设置 Barman 备份服务器,从主数据库服务器进行备份,并恢复到备用服务器。

PostgreSQL备份方法简介

在开始您的 Barman 设置之前,让我们花点时间回顾一下可用于 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 文件中播放其上的事务。 这使数据库及时处于一致状态。

酒保备份如何工作

传统上,PostgreSQL DBA 会编写自己的备份脚本并安排 cron 作业来实现物理备份。 Barman 以标准化的方式执行此操作。

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

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

目标

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

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

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

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

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

先决条件

要遵循本教程,您将需要创建三个 DigitalOcean Droplet(或您自己的 Linux 服务器),每个都具有至少 2 GB 的 RAM 和 2 个 CPU 内核。 我们不会详细介绍创建 Droplet 的细节; 你可以在这里找到更多信息

所有三台服务器都应具有相同的操作系统(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

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

您还应该在每台服务器上设置一个 sudo 用户并将其用于一般访问。 大多数命令将作为两个不同的用户(postgresbarman)执行,但您还需要在每台服务器上都有一个 sudo 用户,以便您可以切换到这些帐户。 要了解 sudo 权限的工作原理,请参阅此 DigitalOcean 教程关于启用 sudo 访问

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


警告: 您不应在生产服务器上运行本教程中的任何命令、查询或配置. This tutorial will involve changing configurations and restarting PostgreSQL instances. Doing so in a live environment without proper planning and authorization would mean an outage for your application.


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

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

请完成 this LEPP stack tutorial 中的 PostgreSQL 安装步骤。 在本教程中,您将需要:

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

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

host  all     all     barman-backup-server-ip/32     trust

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

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

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


确保您在 main-db-serverstandby-db-server 上都安装了 PostgreSQL,并且您已允许从 barman 访问它们-备份服务器

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

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

在两台机器上安装和配置 PostgreSQL 后,我们将向 main-db-server 添加一些示例数据以模拟生产环境。

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

sudo su - postgres

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

psql

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

CREATE DATABASE mytestdb;
\connect mytestdb;

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

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

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:

sudo yum -y install epel-release

运行这些命令来安装 PostgreSQL 存储库:

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:

sudo yum -y install barman

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


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

第 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

我们不会详细介绍 SSH 的工作原理。 DigitalOcean 上有一篇 非常好的关于 SSH 要点的文章,您可以参考。

不过,您需要的所有命令都包含在此处。

我们将向您展示如何为用户 postgres 设置连接以从 main-db-server 连接到 barman-backup-server

如果不是当前用户,则从 main-db-server 切换到用户 postgres

sudo su - postgres

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

ssh-keygen -t rsa

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

ENTER 两次以创建不带任何密码的私钥。

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

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

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


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

cat ~/.ssh/id_rsa.pub

复制输出的内容。

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

sudo su - barman

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

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 并从那里测试连接:

ssh barman@barman-backup-server-ip

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

exit

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

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

确保以每种方式测试连接,以便您可以接受有关新连接的初始警告。

备用数据库服务器

ssh barman@barman-backup-server-ip

来自 酒保备份服务器

ssh postgres@main-db-server-ip

来自 酒保备份服务器

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 对其只有读取权限):

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 服务器 3 次
  • 取消注释 basebackup_retry_sleep 的行并保留 30 的默认值。 每次重试之间会有 30 秒的延迟
  • 取消注释 last_backup_maximum_age 的行并将其值设置为 1 DAYS

新设置应如下所示:

摘自 /etc/barman.conf

[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 将重试 3 次
  • PostgreSQL 服务器上一次完整备份的时间不应超过 1 天

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

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

在新块中添加这些参数:

摘自 /etc/barman.conf

[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 天的恢复窗口保留足够的备份。 这意味着我们可以将整个数据库服务器恢复到过去 7 天内的任何时间点。 对于生产系统,您可能应该将此值设置得更高,以便手头有较旧的备份。

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

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

摘自 /etc/barman.conf

[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

sudo su - barman

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

barman show-server main-db-server | grep incoming_wals_directory

这应该输出如下内容:

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 文件:

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 的值不同,请改用该值

摘自 postgresql.conf

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:

sudo systemctl restart postgresql-9.4.service

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


第 7 步 — 测试酒保

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

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

barman check main-db-server

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

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

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 实例、没有为 WAL 归档配置 Postgres、SSH 在服务器之间无法正常工作等。 无论是什么原因,都需要在备份发生之前修复它。 执行前面的步骤并确保所有连接都正常工作。

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

barman list-server

现在它应该只显示:

输出

main-db-server - Main DB Server

第 8 步 — 创建第一个备份

现在您已经准备好 Barman,让我们手动创建备份。

barman-backup-server 上以 barman 用户身份运行以下命令来进行第一次备份:

barman backup main-db-server

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

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

输出

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 目录的内容:

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 返回的内容:

barman list-backup main-db-server
Outputmain-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)执行此命令:

barman show-backup main-db-server backup-id

将显示一组详细信息:

OutputBackup 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)

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

barman list-files main-db-server backup-id

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

第 9 步 — 安排备份

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

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

crontab -e

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

cron

30 23 * * * /usr/bin/barman backup main-db-server
* * * * * /usr/bin/barman cron

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

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

第 10 步——模拟“灾难”

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

我们在这里丢了一张桌子。 不要在生产数据库上这样做!

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

启动 psql 实用程序:

psql

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

\connect mytestdb;

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

\dt

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

Output            List of relations
 Schema |     Name     | Type  |  Owner
--------+--------------+-------+----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres

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

drop table mytesttable2;

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

\dt

您将看到只剩下 mytesttable1

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

第 11 步 — 恢复或迁移到远程服务器

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

转到 备用数据库服务器

首先,以 sudo 用户身份停止 PostgreSQL 服务。 (如果您在服务运行时尝试运行恢复,则重新启动会阻塞。)

sudo systemctl stop postgresql-9.4.service

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

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

barman show-backup main-db-server latest

输出

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

从输出中,记下打印在第一行的备份 ID(上面的 20160114T173552)。 如果latest备份有你想要的数据,你可以使用latest作为备份ID。

还要检查备份的时间,从 Begin time 字段(上面的 2016-01-14 17:35:53.164222-05:00)。

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

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 的默认数据目录。 对于现实生活中的用例,选择合适的路径

对于成功的还原操作,您应该收到如下输出:

Barman Recovery 的输出

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 服务:

sudo systemctl start postgresql-9.4.service

应该是这样!

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

sudo su - postgres
psql

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

\connect mytestdb;
\dt

输出

            List of relations
 Schema |     Name     | Type  |  Owner   
--------+--------------+-------+----------
 public | mytesttable1 | table | postgres
 public | mytesttable2 | table | postgres
(2 rows)

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

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

要恢复到任何其他服务器,只需确保您已安装 PostgreSQL 并与 Barman 服务器建立了适当的连接,然后使用目标恢复服务器的 IP 地址按照本节操作。

结论

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

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

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

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

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

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