PostgreSQL是一个开源数据库平台,因其易于维护、成本效益以及与其他开源技术的简单集成而深受 Web 和移动应用程序开发人员的欢迎。
维护 PostgreSQL 环境的一项关键任务是定期备份其数据库。备份是任何组织灾难恢复 (DR) 流程的一部分。这很重要,原因如下:
- 防止由于存储或服务器本身等底层基础设施组件故障而导致数据丢失
- 防止数据损坏以及不必要或恶意的数据丢失
- 将生产数据库迁移到开发或测试环境
通常数据库备份和恢复的职责落在DBA的肩上。然而,在较小的组织或初创公司中,系统管理员、DevOps 工程师或程序员通常必须创建自己的数据库后端。因此,对于每个使用 PostgreSQL 的人来说,了解备份的工作原理以及如何从备份进行恢复非常重要。
在本教程中,您将设置 Barman 备份服务器,从主数据库服务器进行备份,然后恢复到备用服务器。
在开始 Barman 设置之前,让我们花点时间回顾一下可用于 PostgreSQL 的备份类型及其用途。 (有关备份策略的更广泛概述,请阅读我们的文章:有效的备份.)
PostgreSQL 提供两种类型的备份方法:
逻辑备份就像数据库的快照。这些是使用创建的pg_dump
or pg_dumpall
PostgreSQL 附带的实用程序。逻辑备份:
- 备份单个数据库或所有数据库
- 仅备份架构、仅备份数据、单个表或整个数据库(架构和数据)
- 以专有二进制格式或纯 SQL 脚本创建备份文件
- 可以使用以下命令恢复
pg_restore
PostgreSQL 也附带了实用程序
- 不提供时间点恢复 (PITR)
这意味着,如果您在凌晨 2:00 对数据库进行逻辑备份,那么当您从中恢复时,恢复的数据库将保持凌晨 2:00 时的状态。无法在特定时间点(例如凌晨 1:30)停止恢复。如果您在上午 10:00 恢复备份,您就会丢失八小时的数据。
物理备份与逻辑备份不同,因为它们仅处理二进制格式并进行文件级备份。物理备份:
- 提供时间点恢复
- 备份 PostgreSQL 的内容数据目录和WAL(预写日志)文件
- 占用大量磁盘空间
- 使用 PostgreSQL
pg_start_backup
and pg_stop_backup
命令。然而,这些命令需要编写脚本,这使得物理备份成为一个更加复杂的过程
- 不要只备份单个数据库、模式等。这是一种全有或全无的方法
WAL 文件包含以下列表交易(INSERT、UPDATE 或 DELETE)发生在数据库上。包含数据的实际数据库文件位于数据目录中。因此,当需要从物理备份恢复到某个时间点时,PostgreSQL 首先恢复数据目录的内容,然后从 WAL 文件中播放其上的事务。这使数据库及时达到一致的状态。
酒保备份的工作原理
传统上,PostgreSQL DBA 会编写自己的备份脚本并安排cron
实施物理备份的作业。酒保以标准化的方式做到这一点。
Barman or 备份与恢复管理器是一个免费的开源 PostgreSQL 备份工具第二象限- 一家专业的Postgres解决方案公司。 Barman 使用 Python 编写,为 PostgreSQL 实例提供了一种简单、直观的物理备份和恢复方法。使用 Barman 的一些好处是:
- 完全免费
- 这是一个维护良好的应用程序,并且拥有供应商提供的专业支持
- 将 DBA/系统管理员从编写和测试复杂的脚本中解放出来
cron
jobs
- 可以将多个 PostgreSQL 实例备份到一个中央位置
- 可以恢复到同一 PostgreSQL 实例或不同实例
- 提供压缩机制以最大限度地减少网络流量和磁盘空间
在本教程中,我们将创建三个 DigitalOcean Droplet,在其中两台机器上安装 PostgreSQL 9.4,并在第三台机器上安装 Barman。
其中一台 PostgreSQL 服务器将成为我们的主数据库服务器:这是我们创建生产数据库的地方。第二个 PostgreSQL 实例将是空的并被视为备用计算机,我们可以从备份中进行恢复。
Barman服务器将与主数据库服务器通信并执行物理备份和WAL归档。
然后,我们将通过从实时数据库中删除一个表来模拟“灾难”。
最后,我们将备份的PostgreSQL实例从Barman服务器恢复到备用服务器。
要学习本教程,您需要创建三个 DigitalOcean Droplet(或您自己的 Linux 服务器),每个至少具有2 GB 内存和 2 个 CPU 核心。我们不会详细介绍创建 Droplet 的细节;你可以找到更多信息here.
所有三台服务器应具有相同的操作系统(CentOS 7x64 位)。
我们将机器命名如下:
-
main-db-server (we will denote its IP address as main-db-server-ip)
-
standby-db-server (we will denote its IP address as standby-db-server-ip)
-
barman-backup-server (we will denote its IP address as barman-backup-server-ip)
机器的实际IP地址可以从DigitalOcean控制面板找到。
您还应该在每台服务器上设置一个 sudo 用户并将其用于一般访问。大多数命令将以两个不同的用户身份执行(postgres and barman),但您还需要在每台服务器上有一个 sudo 用户,以便您可以切换到这些帐户。要了解 sudo 权限如何工作,请参阅此关于启用 sudo 访问的 DigitalOcean 教程.
Note:本教程将使用默认的 Barman 安装目录作为备份位置。在 CentOS 中,该位置是:/var/lib/barman/
。 2ndQuadrant 建议最好保留默认路径。在实际使用案例中,根据数据库的大小和正在备份的实例数量,您应该检查托管此目录的文件系统中是否有足够的空间。
Warning: 您不应在生产服务器上运行本教程中的任何命令、查询或配置。本教程将涉及更改配置和重新启动 PostgreSQL 实例。在没有适当规划和授权的情况下在实时环境中这样做将意味着您的应用程序中断。
我们将首先通过在上安装 PostgreSQL 9.4 来设置数据库环境主数据库服务器和备用数据库服务器.
请完成 PostgreSQL 安装步骤这个 LEPP 堆栈教程。从本教程中,您将需要:
- 遵循该部分第一步 — 安装 PostgreSQL
- 遵循该部分第二步 — 配置 PostgreSQL
In 第二步 — 配置 PostgreSQL,而不是进行更改pg_hba.conf
文件以允许访问 Web 服务器的数据库,请添加此行,以便 Barman 服务器可以连接,使用酒保备份服务器IP 地址,后接/32
:
-
host all all barman-backup-server-ip/32 trust
这将 PostgreSQL 配置为接受来自 Barman 服务器的任何连接。
该部分中的其余说明可以按原样遵循。
Note:安装 PostgreSQL 将创建一个名为的操作系统用户postgres在数据库服务器上。该账户没有密码;您将从 sudo 用户切换到它。
确保您已在两台服务器上安装了 PostgreSQL主数据库服务器和备用数据库服务器,并且您已允许从酒保备份服务器.
接下来我们将向主数据库服务器添加一些示例数据。
在两台机器上安装并配置 PostgreSQL 后,我们将向主数据库服务器模拟生产环境。
On the 主数据库服务器,切换到用户postgres:
开始psql
访问数据库服务器的实用程序:
来自psql
提示符下,运行以下命令创建数据库并切换到该数据库:
- 创建数据库 mytestdb;
-
\连接 mytestdb;
输出消息将告诉您现在已连接到数据库mytestdb
作为用户postgres
.
接下来,在数据库中添加两个表:
- 创建表 mytesttable1(id 整数 NULL);
- 创建表 mytesttable2(id 整数 NULL);
这些被命名为mytesttable1
and mytesttable2
.
通过键入退出客户端工具\q
并按ENTER
.
现在我们将在备份服务器上安装 Barman,它将控制和存储我们的备份。
完成此步骤酒保备份服务器.
为此,您首先需要安装以下存储库:
- Extra Packages for Enterprise Linux (EPEL) 存储库
- PostgreSQL 全球开发集团 RPM 存储库
运行以下命令安装 EPEL:
-
sudo yum -y installepel-释放
运行以下命令来安装 PostgreSQL 存储库:
-
sudo wgethttp://yum.postgresql.org/9.4/redhat/rhel-7Server-x86_64/pgdg-centos94-9.4-1.noarch.rpm
-
sudo rpm -ivhpgdg-centos94-9.4-1.noarch.rpm
最后,运行以下命令来安装 Barman:
-
sudo yum -y install barman
Note:安装 Barman 将创建一个名为的操作系统用户barman。该账户没有密码;您可以从 sudo 用户帐户切换到该用户。
酒保已安装!现在,让我们确保服务器可以安全地相互连接。
在本节中,我们将建立 SSH 密钥,以便在主数据库服务器和酒保备份服务器,反之亦然。
同样,我们将在备用数据库服务器和酒保备份服务器,反之亦然。
这是为了确保 PostgreSQL(在两个数据库服务器上)和 Barman 可以在备份和恢复期间相互“对话”。
对于本教程,您需要确保:
- User postgres可以从远程连接主数据库服务器 to the 酒保备份服务器
- User postgres可以从远程连接备用数据库服务器 to the 酒保备份服务器
- User barman可以从远程连接酒保备份服务器 to the 主数据库服务器
- User barman可以从远程连接酒保备份服务器 to the 备用数据库服务器
我们不会详细讨论 SSH 的工作原理。有一个关于 DigitalOcean 的非常好的文章关于SSH要点大家可以参考一下。
不过,您需要的所有命令都包含在这里。
我们将向您展示如何执行此操作来为用户设置连接postgres连接从主数据库服务器 to the 酒保备份服务器.
来自主数据库服务器,切换到用户postgres如果还不是当前用户:
运行以下命令生成SSH密钥对:
通过按接受密钥文件的默认位置和名称ENTER
.
Press ENTER
两次创建没有任何密码的私钥。
生成密钥后,会出现一个.ssh
下创建的目录postgres用户的主目录,其中包含密钥。
您现在需要将 SSH 公钥复制到authorized_keys
文件下的barman user’s .ssh
目录上的酒保备份服务器.
Note: Unfortunately you can’t use the ssh-copy-id barman@barman-backup-server-ip
command here. That’s because this command will ask for the barman user’s password, which is not set by default. You will therefore need to copy the public key contents manually.
运行以下命令,输出postgres用户的公钥内容:
复制输出的内容。
切换到连接到的控制台酒保备份服务器服务器并切换到用户barman:
运行以下命令来创建.ssh
目录,设置其权限,将公钥内容复制到authorized_keys
文件,最后使该文件可读可写:
-
mkdir -p ~/.ssh
-
chmod 700 ~/.ssh
-
echo "public_key_string" >> ~/.ssh/authorized_keys
-
chmod 600〜/.ssh/authorized_keys
Make sure you put the long public key string starting with ssh-rsa
between the quotation marks, instead of public_key_string
.
您已将密钥复制到远程服务器。
现在,要测试连接,请切换回主数据库服务器并从那里测试连接:
-
ssh barman@barman-backup-server-ip
在出现有关远程服务器的真实性未知的初始警告并且您接受提示后,应从远程服务器建立连接主数据库服务器服务器到酒保备份服务器。如果成功,则通过执行以下命令注销会话exit
命令。
您需要再设置 SSH 密钥连接 3 次。您可以跳过制作.ssh
目录(如果已经创建)(尽管这不是必需的)。
- 再次运行相同的命令,这次是从备用数据库服务器 to the 酒保备份服务器
- 第三次运行它们,这次来自barman用户在酒保备份服务器,然后前往postgres用户在主数据库服务器
- 最后,运行命令从复制密钥barman用户在酒保备份服务器 to the postgres用户在备用数据库服务器
确保以各种方式测试连接,以便您可以接受有关新连接的初始警告。
From 备用数据库服务器:
-
ssh barman@barman-backup-server-ip
From 酒保备份服务器:
-
ssh postgres@main-db-server-ip
From 酒保备份服务器:
-
ssh postgres@standby-db-server-ip
Note:确保所有三台服务器之间的 SSH 连接是备份正常工作的必要条件。
您现在将配置 Barman 来备份您的主 PostgreSQL 服务器。
BARMAN 的主要配置文件是/etc/barman.conf
。该文件包含全局参数部分以及要备份的每个服务器的单独部分。默认文件包含一个名为 PostgreSQL 服务器示例的部分main,已被注释掉。您可以将其用作设置要备份的其他服务器的指南。
A semicolon (;
) at the beginning of a line means that line is commented out. Just like with most Linux-based applications, a commented-out configuration parameter for Barman means the system will use the default value unless you uncomment it and enter a different value.
其中一个参数是configuration_files_directory
,其默认值为/etc/barman.d
。这意味着,启用后,酒保将使用.conf
该目录中的文件用于不同 Postgres 服务器的备份配置。如果您发现主文件变得太长,请随意为要备份的每个服务器制作单独的文件。
为了在本教程中简单起见,我们将把所有内容都放在默认配置文件中。
Open /etc/barman.conf
在文本编辑器中作为您的须藤用户 (user barman仅有读取权限):
全局参数定义在[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
The retention_policy
设置意味着 Barman 将自动覆盖旧的完整备份文件和 WAL 日志,同时保留足够的备份用于 7 天的恢复窗口。这意味着我们可以将整个数据库服务器恢复到最近 7 天内的任何时间点。对于生产系统,您可能应该将此值设置得更高,以便手头有较旧的备份。
您需要使用的 IP 地址主数据库服务器 in the ssh_command
and conninfo
参数。否则,您可以完全复制上述设置。
修改后的文件的最终版本应如下所示,减去所有注释和未修改的设置:
摘自 /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
保存并关闭文件。
接下来,我们将确保我们的主数据库服务器配置为进行备份。
还需要进行最后一项配置主数据库服务器,打开备份(或存档)模式。
首先,我们需要从以下位置找到传入备份目录的值酒保备份服务器。在 Barman 服务器上,切换到用户barman:
运行此命令以找到传入的备份目录:
- 酒保显示服务器主数据库服务器| grep传入_wals_目录
这应该输出类似这样的内容:
酒保 show-server 命令输出
incoming_wals_directory: /var/lib/barman/main-db-server/incoming
记下值incoming_wals_directory
;在这个例子中,它是/var/lib/barman/main-db-server/incoming
.
现在切换到主数据库服务器安慰。
切换到用户postgres如果还不是当前用户。
打开postgresql.conf
在文本编辑器中创建文件:
-
vi $PGDATA/postgresql.conf
对文件进行以下更改:
- 取消注释
wal_level
参数并将其值设置为archive
代替minimal
- 取消注释
archive_mode
参数并将其值设置为on
代替off
- Uncomment the
archive_command
parameter and set its value to 'rsync -a %p barman@barman-backup-server-ip:/var/lib/barman/main-db-server/incoming/%f'
instead of ''
. Use the IP address of the Barman server. If you got a different value for incoming_wals_directory
, use that one instead
摘自 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
切换回您的须藤用户.
重新启动 PostgreSQL:
-
sudosystemctl 重新启动 postgresql-9.4.service
Note:如果您正在配置现有的生产 PostgreSQL 实例,则很可能已经设置了这三个参数。然后您只需添加/修改archive_command
参数,以便 PostgreSQL 将其 WAL 文件发送到备份服务器。
现在是时候检查 Barman 是否已正确设置所有配置并可以连接到主数据库服务器.
On the 酒保备份服务器,切换到用户barman如果不是当前用户。运行以下命令来测试与主数据库服务器的连接:
- barman check main-db-server
请注意,如果您在服务器块的方括号之间输入了不同的名称/etc/barman.conf
如果您在步骤 5 中找到了该文件,则应使用该名称。
如果一切正常,输出应该如下所示:
酒保检查命令输出
Server 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 服务器列表,请运行以下命令:
现在它应该只显示:
Output
main-db-server - Main DB Server
现在 Barman 已准备就绪,让我们手动创建备份。
运行以下命令barman用户在酒保备份服务器进行第一次备份:
- barman backup main-db-server
Again, the main-db-server
value is what you entered as the head of the server block in the /etc/barman.conf
file in Step 5.
这将启动 PostgreSQL 数据目录的完整备份。由于我们的实例只有一个带有两个表的小型数据库,因此它应该很快就能完成。
Output
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
目录:
那里将会有一个目录:main-db-server
。这是 Barman 当前配置要备份的服务器,其备份就在那里。 (如果您配置 Barman 备份其他服务器,则每台服务器都会创建一个目录。)main-db-server
目录下,会有三个子目录:
-
base
:这是保存基本备份文件的位置
-
incoming
:PostgreSQL将其完成的WAL文件发送到该目录进行归档
-
wals
:酒保复制了内容incoming
目录到wals
目录
在恢复过程中,Barman 将从中恢复内容base
目录进入目标服务器的数据目录。然后它将使用来自wals
目录来应用事务更改并使目标服务器达到一致状态。
There is a specific Barman command to list all the backups for a server. That command is barman list-backup
. Run the following command to see what it returns for our main-db-server
:
barman list-backup main-db-server
Output
main-db-server 20151111T051954 - Wed Nov 11 05:19:46 2015 - Size: 26.9 MiB - WAL Size: 0 B
- 输出的第一部分是服务器的名称。在这种情况下,
main-db-server
- The second part - a long alphanumeric value - is the backup ID for the backup. A backup ID is used to uniquely identify any backup Barman makes. In this case, it’s
20151111T051954
. You will need the backup ID for the next steps
- 第三条信息告诉您备份何时进行
- 第四部分是基本备份的大小(本例中为 26.9 MB)
- 字符串的第五部分也是最后一部分给出了备份的 WAL 存档的大小
To see more details about the backup, execute this command using the name of the server, and the backup ID (20151111T051954
in our example) from the previous command:
- barman show-backup main-db-server backup-id
将显示一组详细信息:
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)
要深入了解哪些文件进入了备份,请运行以下命令:
- barman list-files main-db-server backup-id
这将给出从该特定备份恢复所需的基本备份和 WAL 日志文件的列表。
理想情况下,您的备份应该按计划自动进行。
在此步骤中,我们将自动执行备份,并告诉 Barman 对备份执行维护,以便删除早于保留策略的文件。要启用调度,请运行此命令barman用户在酒保备份服务器(如有必要切换到该用户):
这将打开一个crontab
用户的文件barman。编辑文件,添加以下行,然后保存并退出:
cron
30 23 * * * /usr/bin/barman backup main-db-server
* * * * * /usr/bin/barman cron
第一个命令将运行完整备份主数据库服务器每晚 11:30。 (如果您在/etc/barman.conf
文件,请改用该名称。)
第二个命令将每分钟运行一次,并对 WAL 文件和基础备份文件执行维护操作。
您现在将看到如何从刚刚创建的备份进行恢复。为了测试恢复,我们首先模拟丢失一些数据的“灾难”场景。
我们在这里放下一张桌子。不要在生产数据库上执行此操作!
返回到主数据库服务器控制台并切换到用户postgres如果还不是当前用户。
开始psql
公用事业:
来自psql
提示符下,执行以下命令将数据库上下文切换到mytestdb
:
接下来,列出数据库中的表:
输出将显示您在本教程开始时创建的表:
Output
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres
现在,运行以下命令来删除其中一个表:
如果您现在执行\dt
再次命令:
你会看到只有mytesttable1
遗迹。
这是您希望从备份恢复的数据丢失情况类型。在这种情况下,您将把备份恢复到单独的服务器:备用数据库服务器.
您可以按照本节恢复备份,或将最新的 PostgreSQL 备份迁移到新服务器。
前往备用数据库服务器.
首先,以 sudo 用户身份停止 PostgreSQL 服务。 (如果您尝试在服务运行时运行恢复,则重新启动将会停止。)
-
sudosystemctl 停止 postgresql-9.4.service
服务停止后,请转至酒保备份服务器。切换到用户barman如果还不是当前用户。
让我们找到最新备份的详细信息:
- barman show-backup main-db-server latest
Output
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
From the output, note down the backup ID printed on the first line (20160114T173552
above). If the latest
backup has the data you want, you can use latest
as the backup ID.
Also check when the backup was made, from the Begin time
field (2016-01-14 17:35:53.164222-05:00
above).
接下来,运行此命令从指定的备份中恢复酒保备份服务器 to the 备用数据库服务器:
- 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"
: Use the begin time from the show-backup
command
-
--remote-ssh-command "ssh postgres@standby-db-server-ip"
: Use the IP address of the standby-db-server
-
main-db-server
: Use the name of the database server from your /etc/barman.conf
file
-
backup-id
: Use the backup ID from the show-backup
command, or use latest
if that’s the one you want
-
/var/lib/pgsql/9.4/data
:您要恢复备份的路径。该路径将成为备用服务器上 Postgres 的新数据目录。这里,我们选择 CentOS 中 Postgres 的默认数据目录。对于现实生活中的用例,选择适当的路径
对于成功的恢复操作,您应该收到如下输出:
调酒师恢复的输出
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!
现在切换到备用数据库服务器再次控制台。作为须藤用户,启动PostgreSQL服务:
-
sudosystemctl 启动 postgresql-9.4.service
应该是这样!
让我们验证一下我们的数据库是否已启动。切换到用户postgres并启动psql
公用事业:
将数据库上下文切换到mytestdb
并列出其中的表:
Output
List of relations
Schema | Name | Type | Owner
--------+--------------+-------+----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres
(2 rows)
该列表应显示数据库中的两个表。换句话说,您刚刚恢复了删除的表。
根据您更大的恢复策略,您现在可能希望故障转移到备用数据库服务器,或者您可能想要检查恢复的数据库是否正常工作,然后再次运行此部分以恢复到主数据库服务器.
要恢复到任何其他服务器,只需确保您已安装 PostgreSQL 并与 Barman 服务器建立适当的连接,然后使用目标恢复服务器的 IP 地址按照本节进行操作。
在本教程中,我们了解了如何安装和配置 Barman 来备份 PostgreSQL 服务器。我们还学习了如何从这些备份中恢复或迁移。
经过仔细考虑,Barman 可以成为所有 PostgresSQL 数据库的中央存储库。它提供了强大的备份机制和简单的命令集。然而,创建备份只是故事的一半。您应该始终通过将备份恢复到不同位置来验证它们。这项练习应该定期进行。
将 Barman 融入您的备份策略的一些问题:
- 将备份多少个 PostgreSQL 实例?
- Barman 服务器上是否有足够的磁盘空间来托管指定保留期内的所有备份?如何监控服务器的空间使用情况?
- 不同服务器的所有备份应该同时启动还是可以在非高峰时段错开?同时启动所有服务器的备份可能会给酒保服务器和网络带来不必要的压力
- Barman服务器和Postgres服务器之间的网络速度可靠吗?
另一点需要注意的是 Barman 无法备份和恢复单个数据库。它在文件系统级别上工作,并使用全有或全无的方法。备份期间,会备份整个实例及其所有数据文件;恢复时,所有这些文件都会被恢复。同样,您无法使用 Barman 进行纯架构或纯数据备份。
因此,我们建议您设计备份策略,以便它同时使用逻辑备份和pg_dump
or pg_dumpall
以及酒保的物理备份。这样,如果您需要快速恢复单个数据库,您可以使用pg_dump
备份。对于时间点恢复,请使用 Barman 备份。