如何在CentOS7上使用Barman备份、恢复和迁移PostgreSQL数据库
介绍
PostgreSQL 是一个开源数据库平台,因其易于维护、成本效益以及与其他开源技术的简单集成而深受 Web 和移动应用程序开发人员的欢迎。
维护 PostgreSQL 环境的一项关键任务是定期备份其数据库。 备份是任何组织的灾难恢复 (DR) 流程的一部分。 这很重要,原因如下:
- 防止由于底层基础设施组件(如存储或服务器本身)故障而导致数据丢失
- 防止数据损坏和不必要或恶意的数据丢失
- 将生产数据库迁移到开发或测试环境
通常数据库备份和恢复的责任落在 DBA 的肩上。 然而,在较小的组织或初创公司中,系统管理员、DevOps 工程师或程序员通常必须创建自己的数据库后端。 因此,对于每个使用 PostgreSQL 的人来说,了解备份的工作原理以及如何从备份中恢复非常重要。
在本教程中,您将设置 Barman 备份服务器,从主数据库服务器进行备份,并恢复到备用服务器。
PostgreSQL备份方法简介
在开始您的 Barman 设置之前,让我们花点时间回顾一下可用于 PostgreSQL 的备份类型及其用途。 (有关备份策略的更广泛概述,请阅读我们关于 有效备份 的文章。)
PostgreSQL 提供两种类型的备份方法:
- 逻辑备份
- 物理备份
逻辑备份就像数据库的快照。 这些是使用 PostgreSQL 附带的 pg_dump
或 pg_dumpall
实用程序创建的。 逻辑备份:
- 备份单个数据库或所有数据库
- 仅备份模式、数据、单个表或整个数据库(模式和数据)
- 以专有二进制格式或纯 SQL 脚本创建备份文件
- 可以使用 PostgreSQL 附带的
pg_restore
实用程序来恢复 - 不提供 时间点恢复 (PITR)
这意味着如果您在凌晨 2:00 对数据库进行逻辑备份,当您从中恢复时,恢复的数据库将与凌晨 2:00 时一样。 无法在特定时间点(例如凌晨 1:30)停止恢复。 如果您在上午 10:00 恢复备份,则会丢失 8 小时的数据。
物理备份与逻辑备份不同,因为它们仅处理二进制格式并进行文件级备份。 物理备份:
- 提供时间点恢复
- 备份 PostgreSQL 数据目录 和 WAL (Write Ahead Log) 文件的内容
- 占用大量磁盘空间
- 使用 PostgreSQL
pg_start_backup
和pg_stop_backup
命令。 但是,这些命令需要编写脚本,这使得物理备份成为一个更复杂的过程 - 不要仅备份单个数据库、模式等。 这是一种全有或全无的方法
WAL 文件包含发生在数据库中的 事务 (INSERT、UPDATE 或 DELETE)列表。 包含数据的实际数据库文件位于数据目录中。 因此,当从物理备份恢复到某个时间点时,PostgreSQL 首先恢复数据目录的内容,然后从 WAL 文件中播放其上的事务。 这使数据库及时处于一致状态。
酒保备份如何工作
传统上,PostgreSQL DBA 会编写自己的备份脚本并安排 cron
作业来实现物理备份。 Barman 以标准化的方式执行此操作。
Barman 或 Backup 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 用户并将其用于一般访问。 大多数命令将作为两个不同的用户(postgres 和 barman)执行,但您还需要在每台服务器上都有一个 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-server 和 standby-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-server 和 standby-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);
这些被命名为 mytesttable1
和 mytesttable2
。
通过键入 \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-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 的工作原理。 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-server 上 barman 用户的 .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-server 到 barman-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_command
和 conninfo
参数中使用 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_dump
或 pg_dumpall
的逻辑备份和 Barman 的物理备份。 这样,如果您需要快速恢复单个数据库,您可以使用 pg_dump
备份。 对于时间点恢复,请使用 Barman 备份。