如何在 CentOS 7 上使用 Barman 备份、还原和迁移 PostgreSQL 数据库

介绍

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

维护PostgreSQL环境的一个关键任务是定期备份其数据库。备份是任何组织的灾难恢复(DR)过程的一部分。

• 防止因存储或服务器本身等基础设施组件故障而损失数据 * 防止数据损坏和不必要或恶意损失数据 * 将生产数据库迁移到开发或测试环境

在较小的组织或初创企业中,系统管理员、DevOps工程师或程序员往往必须创建自己的数据库备份,因此,每个人使用PostgreSQL都必须了解备份是如何工作的,以及如何从备份中恢复。

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

简要介绍 PostgreSQL 备份方法

在启动您的 Barman 设置之前,让我们花一点时间来审查 PostgreSQL 可用的备份类型及其用途。 (对于更广泛的备份策略,请阅读关于 [有效的备份]的文章(https://andsky.com/tech/tutorials/how-to-choose-an-effective-backup-strategy-for-your-vps)。

PostgreSQL提供两种备份方法:

  • 逻辑备份 * 物理备份

逻辑备份类似于数据库的快照,这些都是使用pg_dumppg_dumpall工具创建的,这些工具与 PostgreSQL 搭配。

  • 备份单个数据库或所有数据库 * 仅备份方案,仅备份数据,单个表或整个数据库(方案和数据) * 创建备份文件以专有的二进制格式或简单的SQL脚本 * 可使用)

这意味着,如果您在早上 2 点对数据库(数据库)进行逻辑备份,当您从其中恢复时,恢复的数据库将像在 2 点那样。

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

  • 提供按时恢复 * 备份 PostgreSQL data directoryWAL (Write Ahead Log) 文件的内容 * 占用更大的磁盘空间 * 使用 PostgreSQL pg_start_backuppg_stop_backup 命令. 然而,这些命令需要编写脚本,这使得物理备份更为复杂的过程 * 不要只备份单个数据库,方案等。

WAL 文件包含数据库发生的 transactions 列表(INSERT、UPDATE 或 DELETE)。包含数据的实际数据库文件位于数据目录中,因此,当从物理备份恢复到一个时间点时,PostgreSQL 首先恢复数据目录的内容,然后从 WAL 文件中播放数据目录的交易。

如何做酒吧备份工作

传统上,PostgreSQL DBA 会编写自己的备份脚本和计划的cron任务来实现物理备份。

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

  • 它是完全免费的 * 它是一个维护良好的应用程序,并有从供应商提供的专业支持 * 释放DBA / Sysadmin从写和测试复杂的脚本和cron任务 * 可以备份多个PostgreSQL实例到一个中心位置 * 可以恢复到相同的PostgreSQL实例或不同的实例 * 提供压缩机制,以最大限度地减少网络流量和磁盘空间

目标

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

其中一个PostgreSQL服务器将是我们的主要数据库服务器:这是我们将创建我们的生产数据库的地方。

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

然后,我们将通过从我们的现场数据库中放下一张表来模拟灾难

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

前提条件

要遵循本教程,你需要创建三个DigitalOceanDropplets(或你自己的Linux服务器),每一个至少有2GB的RAM**和2个CPU核心。我们不会进入创建Dropplets的细节;你可以找到更多信息(https://andsky.com/tech/tutorials/how-to-create-your-first-digitalocean-droplet-virtual-server)。

所有三个服务器都应该具有相同的操作系统(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 用户,并将其用于一般访问。大多数命令将作为两个不同的用户执行(postgres 和** barman** ),但您还需要在每个服务器上设置一个 sudo 用户,以便您可以切换到这些帐户。 要了解 sudo 特权是如何工作的,请参阅此 DigitalOcean 关于允许 sudo 访问的教程

<$>[注] 注: 本教程将使用默认的Barman安装目录作为备份位置。在CentOS中,这个位置是: /var/lib/barman/. 2ndQuadrant建议最好保持默认路径。

<$>[警告] 警告: ** 您不应该在生产服务器上运行本教程中的任何命令、查询或配置** .本教程将涉及更改配置和重新启动PostgreSQL实例。

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

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

请完成 PostgreSQL 安装步骤从 这个 LEPP 堆栈教程

  • 遵循部分 ** 第一步 - 安装 PostgreSQL 遵循部分 ** 第二步 - 配置 PostgreSQL**

Step Two — Configuring PostgreSQL 中,而不是对 pg_hba.conf 文件进行更改以允许 Web 服务器访问数据库,请添加此行,以便 Barman 服务器可以连接,使用** barman-backup-server** IP 地址,然后是 /32:

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

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

该部分的其他指示可以按照它们。

注意:安装 PostgreSQL 将在数据库服务器上创建一个名为 postgres 的操作系统用户。

请确保您已在 main-db-server 和** standby-db-server** 上安装了 PostgreSQL,并允许从** barman-backup-server** 访问这两个服务器。

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

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

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

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

1sudo su - postgres

启动psql工具来访问数据库服务器:

1psql

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

1CREATE DATABASE mytestdb;
2\connect mytestdb;

输出消息会告诉您,您现在已作为用户postgres连接到数据库mytestdb

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

1CREATE TABLE mytesttable1 (id integer NULL);
2CREATE TABLE mytesttable2 (id integer NULL);

这些被称为mytesttable1mytesttable2

退出客户端工具,键入\q并按ENTER

第3步:安装酒吧

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

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

要做到这一点,您首先需要安装以下存储库:

  • 用于企业 Linux (EPEL) 存储库的额外包 * PostgreSQL 全球开发组 RPM 存储库

运行以下命令来安装 EPEL:

1sudo yum -y install epel-release

运行以下命令来安装 PostgreSQL repo:

1sudo wget http://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
2sudo rpm -ivh pgdg-centos94-9.4-1.noarch.rpm

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

1sudo yum -y install barman

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

现在,让我们确保服务器可以安全地连接到彼此。

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

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

同样,我们将在 standby-db-server 和** barman-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如何工作的细节。 有一篇关于SSH的文章(https://andsky.com/tech/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys)你可以参考。

您需要的所有命令都包含在这里。

我们将向您展示如何这样做一次,为用户设置连接 postgres 从** main-db-server** 连接到** barman-backup-server** 。

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

1sudo su - postgres

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

1ssh-keygen -t rsa

通过按ENTER来接受关键文件的默认位置和名称。

ENTER两次创建私钥,没有任何密码。

一旦键被生成,将有一个.ssh目录创建在用户的postgres**主目录下,其中有键。

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

<$>[注] 注: 不幸的是,您不能在这里使用 ssh-copy-id barman@barman-backup-server-ip 命令. 这是因为此命令将要求用户的** barman** 密码,这不是默认设置。

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

1cat ~/.ssh/id_rsa.pub

复制输出的内容。

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

1sudo su - barman

运行以下命令来创建.ssh 目录,设置其权限,将公共密钥的内容复制到 'autorized_keys' 文件,并最终使该文件可读和可写:

1mkdir -p ~/.ssh
2chmod 700 ~/.ssh
3echo "public_key_string" >> ~/.ssh/authorized_keys
4chmod 600 ~/.ssh/authorized_keys

请确保在引文标记之间放置从ssh-rsa开始的长公钥字符串,而不是public_key_string

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

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

1ssh barman@barman-backup-server-ip

在对远程服务器的真实性未知的初步警告之后,您接受了提示,应该从 main-db-server 服务器建立连接到** barman-backup-server** 。

1exit

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

  • 再次執行相同的命令,這次從 ** standby-db-server 到** barman-backup-server** * ** 執行他們的第三次,這次從** barman** 的使用者起源於** barman-backup-server** ,然後到** main-db-server上的 ** postgres** 的使用者 * ** 最後,執行命令來複製鍵從** barman** 的使用者在** barman-backup-server** 到** postgres** 的使用者在** standby-db-server**

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

来自 standby-db 服务器 :

1ssh barman@barman-backup-server-ip

barman 备份服务器 :

1ssh postgres@main-db-server-ip

barman 备份服务器 :

1ssh postgres@standby-db-server-ip

注意:确保三台服务器之间的SSH连接是备份工作的一项要求。

步骤5 - 配置备份的酒吧

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

BARMAN 的主要配置文件是 /etc/barman.conf. 该文件包含全球参数的部分,以及您想要备份的每个服务器的单独部分. 默认文件包含一个名为 main 的样本 PostgreSQL 服务器的部分,该部分被评论。

正如大多数基于 Linux 的应用程序一样,对 Barman 的评论配置参数意味着系统将使用默认值,除非您放弃评论并输入不同的值。

其中一个参数是 configuration_files_directory,其默认值为 /etc/barman.d. 这意味着,当启用时,Barman 将使用该目录中的 .conf` 文件用于不同 Postgres 服务器的备份配置。

为了简化本教程,我们将把一切放在默认配置文件中.<$>

在文本编辑器中打开 `/etc/barman.conf 作为您的 sudo 用户 (用户** barman** 只可阅读):

1sudo vi /etc/barman.conf

全球参数在[barman]部分中定义。在本节中,进行以下更改。

  • 联合国 解析"压缩"的行并保留"gzip"的默认值. 这意味着 PostgreSQL WAL 文件 - 当复制到备份目录下时 - 将以 gzip 压缩形式保存
  • 联合国 解析"再用-备份"的行并保留"链接"的默认值. 在创建PostgreSQL服务器的完整备份时,巴曼会尝试通过创建文件级增量备份来保存备份目录中的空间. 这使用rsync和硬链接. 创建递增式完整备份具有任何数据去重复方法的同样好处:节省时间和磁盘空间
  • 联合国 解析 " 立即检查点 " 的行并设定其值为 " 真 " 。 这种参数设置确保了Barman启动完整备份时,它会要求PostgreSQL执行"CHECKPOINT". 检查点确保PostgreSQL内存缓存中的任何被修改的数据被写入数据文件. 从备份角度来说,这可以增加一些值,因为BARMAN能够备份最新的数据变化
  • 联合国 解析basebackup_retry_times的行并设定3的值。 创建完整备份时, Barman 将尝试三次连接到 PostgreSQL 服务器, 如果复制操作因某种原因失败
  • 联合国 解析basebackup_retry_sleep的行并保留30的默认值。 每次重试都会延迟30秒
  • 联合国 解析 last_ backup_maxim_age 的行并设定其值为1 DAYS

新的设置应该是这样的:

 1[label Excerpts from /etc/barman.conf]
 2[barman]
 3barman_home = /var/lib/barman
 4
 5. . .
 6
 7barman_user = barman
 8log_file = /var/log/barman/barman.log
 9compression = gzip
10reuse_backup = link
11
12. . .
13
14immediate_checkpoint = true
15
16. . .
17
18basebackup_retry_times = 3
19basebackup_retry_sleep = 30
20last_backup_maximum_age = 1 DAYS

我们在这里做的是这个:

  • 保留默认备份位置 * 指定应保存备份空间. WAL 日志将被压缩,基础备份将使用增量数据复制 * Barman 将重复三次,如果完全备份因某种原因而失败 * PostgreSQL 服务器的最后完整备份年龄不应超过 1 天

在文件的末尾,添加一个新的部分,它的标题应该说[main-db-server]在方块中。 (如果您想用 Barman 备份更多的数据库服务器,您可以为每个服务器创建一个类似的块,并为每个服务器使用一个独特的标题名称。

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

在新区块中添加这些参数:

1[label Excerpt from /etc/barman.conf]
2[main-db-server]
3description = "Main DB Server"
4ssh_command = ssh postgres@main-db-server-ip
5conninfo = host=main-db-server-ip user=postgres
6retention_policy_mode = auto
7retention_policy = RECOVERY WINDOW OF 7 days
8wal_retention_policy = main

retention_policy 设置意味着 Barman 会自动重写旧的完整备份文件和 WAL 日志,同时保持足够的备份,以便在 7 天的恢复窗口中使用。

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

修改文件的最终版本应该是这样的,减去所有评论和未修改的设置:

 1[label Excerpts from /etc/barman.conf]
 2[barman]
 3barman_home = /var/lib/barman
 4
 5. . .
 6
 7barman_user = barman
 8log_file = /var/log/barman/barman.log
 9compression = gzip
10reuse_backup = link
11
12. . .
13
14immediate_checkpoint = true
15
16. . .
17
18basebackup_retry_times = 3
19basebackup_retry_sleep = 30
20last_backup_maximum_age = 1 DAYS
21
22. . .
23
24[main-db-server]
25description = "Main DB Server"
26ssh_command = ssh postgres@main-db-server-ip
27conninfo = host=main-db-server-ip user=postgres
28retention_policy_mode = auto
29retention_policy = RECOVERY WINDOW OF 7 days
30wal_retention_policy = main

保存并关闭文件。

接下来,我们将确保我们的 main-db-server 配置为备份。

步骤 6 — 配置 postgresql.conf 文件

main-db-server 上进行最后一个配置,以切换备份(或存档)模式。

首先,我们需要从 barman-backup-server 中找到输入备份目录的值。

1sudo su - barman

运行此命令来查找接入的备份目录:

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

这应该产生这样的东西:

1[secondary_label barman show-server command output]
2incoming_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文件:

1vi $PGDATA/postgresql.conf

对文件进行以下更改:

  • 解除wal_level参数并将其值设置为archive而不是minimal * 解除archive_mode参数并将其值设置为on而不是off * 解除archive_command参数并将其值设置为rsync -a %p barman@barman-backup-server-ip:/var/lib/lib/main-db-server/incoming/%f而不是`''。
 1[label Excerpts from postgresql.conf]
 2wal_level = archive                     # minimal, archive, hot_standby, or logical
 3
 4. . .
 5
 6archive_mode = on               # allows archiving to be done
 7
 8. . .
 9
10archive_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:

1sudo systemctl restart postgresql-9.4.service

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

第7步:测试酒吧人

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

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

1barman check main-db-server

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

如果一切顺利,结果应该是这样的:

 1[secondary_label barman check command output]
 2Server main-db-server:
 3        PostgreSQL: OK
 4        archive_mode: OK
 5        wal_level: OK
 6        archive_command: OK
 7        continuous archiving: OK
 8        directories: OK
 9        retention policy settings: OK
10        backup maximum age: FAILED (interval provided: 1 day, latest backup age: No available backups)
11        compression settings: OK
12        minimum redundancy requirements: OK (have 0 backups, expected at least 0)
13        ssh: OK (PostgreSQL server)
14        not in recovery: OK

不要担心备份的最大年龄错误状态. 这是因为我们已经配置了 Barman,以便最新的备份不应该超过1天。

如果其他任何参数都处于失败状态,您应该进一步调查并在继续之前解决问题。

检查失败的原因可能有很多:例如, Barman 无法登录 Postgres 实例, Postgres 未配置用于 WAL 存档, SSH 无法在服务器之间工作,等等 不管原因是什么,它需要在备份发生之前得到修复。

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

1barman list-server

此时此刻,它只应该显示:

1[label Output]
2main-db-server - Main DB Server

步骤8 - 创建第一个备份

现在你已经准备好了酒吧,让我们手动创建备份。

运行以下命令作为 barman 用户在** barman-backup-server** 上创建您的第一个备份:

1barman backup main-db-server

再次,‘main-db-server’ 值是您在步骤 5 中输入的 `/etc/barman.conf’ 文件中的服务器块头。

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

 1[label Output]
 2Starting backup for server main-db-server in /var/lib/barman/main-db-server/base/20151111T051954
 3Backup start at xlog location: 0/2000028 (000000010000000000000002, 00000028)
 4Copying files.
 5Copy done.
 6Asking PostgreSQL server to finalize the backup.
 7Backup size: 26.9 MiB. Actual size on disk: 26.9 MiB (-0.00% deduplication ratio).
 8Backup end at xlog location: 0/20000B8 (000000010000000000000002, 000000B8)
 9Backup completed
10Processing xlog segments for main-db-server
11        Older than first backup. Trashing file 000000010000000000000001 from server main-db-server
12        000000010000000000000002
13        000000010000000000000002.00000028.backup

备份文件位置

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

1ls -l /var/lib/barman

这里将有一个目录:‘main-db-server’. 那就是 Barman 目前配置的服务器以备份,其备份将居住在那里。 (如果你配置 Barman 以备份其他服务器,每个服务器将创建一个目录)。

  • base:这里保存了基础备份文件 * incoming: PostgreSQL 将其完成的 WAL 文件发送到此目录中进行档案 * wals: Barman 将 incoming 目录的内容复制到 wals 目录中

在恢复过程中,Barman 将从基础目录中恢复到目标服务器的数据目录,然后使用来自Wals目录的文件来应用交易更改,并将目标服务器带来一致的状态。

备份列表

有一个特定的Barman命令列出一个服务器的所有备份。该命令是barman list-backup。运行以下命令,看看它对我们的main-db-server返回了什么:

1barman list-backup main-db-server
1[secondary_label Output]
2main-db-server 20151111T051954 - Wed Nov 11 05:19:46 2015 - Size: 26.9 MiB - WAL Size: 0 B
  • 联合国 输出的第一部分是服务器的名称. 在这种情况下,`main-db-server '
  • 联合国 第二部分 - 一个长的字母数字值 - 是备份的备份ID. 备份ID用于唯一识别任何备份的巴曼制作. 本案为"20151111T051954". ** 下一步需要备用身份证 联合国
  • 联合国 第三个信息告诉你 备份是什么时候做的
  • 联合国 第四部分是基础备份的大小( 在这种情况下为26.9 MB)
  • 联合国 字符串的第五个也是最后一个部分给出了WAL存档备份的大小

若要查看备份的更多细节,请使用服务器名称和上一个命令的备份 ID(‘20151111T051954’)执行此命令:

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

将显示一组详细的信息:

 1[secondary_label Output]
 2Backup 20151111T051954:
 3  Server Name            : main-db-server
 4  Status                 : DONE
 5  PostgreSQL Version     : 90405
 6  PGDATA directory       : /var/lib/pgsql/9.4/data
 7
 8  Base backup information:
 9    Disk usage           : 26.9 MiB (26.9 MiB with WALs)
10    Incremental size     : 26.9 MiB (-0.00%)
11    Timeline             : 1
12    Begin WAL            : 000000010000000000000002
13    End WAL              : 000000010000000000000002
14    WAL number           : 1
15    WAL compression ratio: 99.84%
16    Begin time           : 2015-11-11 05:19:44.438072-05:00
17    End time             : 2015-11-11 05:19:46.839589-05:00
18    Begin Offset         : 40
19    End Offset           : 184
20    Begin XLOG           : 0/2000028
21    End XLOG             : 0/20000B8
22
23  WAL information:
24    No of files          : 0
25    Disk usage           : 0 B
26    Last available       : 000000010000000000000002
27
28  Catalog information:
29    Retention Policy     : VALID
30    Previous Backup      : - (this is the oldest base backup)
31    Next Backup          : - (this is the latest base backup)

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

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

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

步骤9:备份计划

理想情况下,您的备份应自动按照时间表进行。

在此步驟中,我們將自動化我們的備份,並告訴 Barman 執行備份的維護,以便刪除超過保留策略的檔案。

1crontab -e

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

1[label cron]
230 23 * * * /usr/bin/barman backup main-db-server
3* * * * * /usr/bin/barman cron

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

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

第10步:模拟灾难

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

我们在这里放下一张表!不要在生产数据库中这样做!

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

启动psql实用程序:

1psql

psql提示,执行以下命令将数据库背景切换为mytestdb:

1\connect mytestdb;

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

1\dt

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

1[secondary_label Output]
2            List of relations
3 Schema |     Name     | Type  |  Owner
4--------+--------------+-------+----------
5 public | mytesttable1 | table | postgres
6 public | mytesttable2 | table | postgres

现在,运行此命令,放下其中一个表:

1drop table mytesttable2;

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

1\dt

你会看到,只剩下mytesttable1

在这种情况下,你会将备份恢复到一个单独的服务器: standby-db-server

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

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

请转到 **standby-db 服务器。

首先,停止 PostgreSQL 服务作为 sudo 用户(如果在服务运行时尝试运行恢复,则重新启动会窒息)。

1sudo systemctl stop postgresql-9.4.service

一旦服务停止,请转到 barman-backup-server . 如果不是当前用户,请切换到用户** barman** 。

让我们找到最新的备份的细节:

1barman show-backup main-db-server latest
 1[label Output]
 2Backup 20160114T173552:
 3  Server Name            : main-db-server
 4  Status                 : DONE
 5  PostgreSQL Version     : 90405
 6  PGDATA directory       : /var/lib/pgsql/9.4/data
 7
 8  Base backup information:
 9
10. . .
11
12    Begin time           : 2016-01-14 17:35:53.164222-05:00
13    End time             : 2016-01-14 17:35:55.054673-05:00

从输出中,记下打印在第一行上的备份ID(‘20160114T173552’)。

此外,请从)检查备份时刻。

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

1barman 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

这里有相当多的选项、论点和变量,所以让我们解释一下。

  • -目标时间' "开始时间": 使用 显示备份` 命令的起始时间
  • **`-远程-sh-command " ssh postgres@standby-db-server-ip"': 使用 ** standby-db- server * 的 IP 地址 * 联合国
  • 主db服务器: 从您的 `/etc/barman.conf' 使用数据库服务器的名称 文件
  • " 备份编号 " : 使用 显示备份 命令的备份 ID , 或者使用latest 如果这是你想要的
  • `/var/lib/pgsql/9.4/data': 您想要恢复备份的路径 。 此路径将成为备用服务器上Postgres的新数据目录. 在此, 我们已经为 CentOS 选择了 Postgres 的默认数据目录 。 对于实际使用的案例,选择适当的路径

为了成功恢复操作,您应该收到这样的输出:

 1[label Output from Barman Recovery]
 2Starting remote restore for server main-db-server using backup backup-id
 3Destination directory: /var/lib/pgsql/9.4/data
 4Doing PITR. Recovery target time: Begin time
 5Copying the base backup.
 6Copying required WAL segments.
 7Generating recovery.conf
 8Identify dangerous settings in destination directory.
 9
10IMPORTANT
11These settings have been modified to prevent data losses
12
13postgresql.conf line 207: archive_command = false
14
15Your PostgreSQL server has been successfully prepared for recovery!

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

1sudo systemctl start postgresql-9.4.service

这应该是!

转到用户 postgres 并启动psql实用程序:

1sudo su - postgres
2psql

将数据库背景切换为mytestdb,并列出其中的表:

1\connect mytestdb;
2\dt
1[label Output]
2            List of relations
3 Schema |     Name     | Type  |  Owner   
4--------+--------------+-------+----------
5 public | mytesttable1 | table | postgres
6 public | mytesttable2 | table | postgres
7(2 rows)

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

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

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

结论

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

经过仔细考虑,Barman 可以成为您所有 PostgresSQL 数据库的中央存储库。它提供了强大的备份机制和简单的命令集。然而,创建备份只是故事的一半。

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

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

另外要注意的是,Barman 无法备份和恢复单个数据库。它在文件系统级别上运行,并使用了一种所有或没有的方法。在备份过程中,整个实例和所有数据文件都被备份;在恢复时,所有这些文件都被恢复。

因此,我們建議您設計您的備份策略,以便使用「pg_dump」或「pg_dumpall」的邏輯備份,以及使用 Barman 的物理備份。

Published At
Categories with 技术
comments powered by Disqus