介绍
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_dump
或pg_dumpall
工具创建的,这些工具与 PostgreSQL 搭配。
- 备份单个数据库或所有数据库 * 仅备份方案,仅备份数据,单个表或整个数据库(方案和数据) * 创建备份文件以专有的二进制格式或简单的SQL脚本 * 可使用)
这意味着,如果您在早上 2 点对数据库(数据库)进行逻辑备份,当您从其中恢复时,恢复的数据库将像在 2 点那样。
物理备份与逻辑备份不同,因为它们只处理二进制格式,并进行文件级备份。
- 提供按时恢复 * 备份 PostgreSQL data directory 和 WAL (Write Ahead Log) 文件的内容 * 占用更大的磁盘空间 * 使用 PostgreSQL
pg_start_backup
和pg_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);
这些被称为mytesttable1
和mytesttable2
。
退出客户端工具,键入\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_command
和conninfo
参数中使用 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 的物理備份。