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

2023-11-05

介绍

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

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

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

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

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

PostgreSQL备份方法简介

在开始 Barman 设置之前,让我们花点时间回顾一下可用于 PostgreSQL 的备份类型及其用途。 (有关备份策略的更广泛概述,请阅读我们的文章:有效的备份.)

PostgreSQL 提供两种类型的备份方法:

  • 逻辑备份
  • 物理备份

逻辑备份就像数据库的快照。这些是使用创建的pg_dump or pg_dumpallPostgreSQL 附带的实用程序。逻辑备份:

  • 备份单个数据库或所有数据库
  • 仅备份架构、仅备份数据、单个表或整个数据库(架构和数据)
  • 以专有二进制格式或纯 SQL 脚本创建备份文件
  • 可以使用以下命令恢复pg_restorePostgreSQL 也附带了实用程序
  • 不提供时间点恢复 (PITR)

这意味着,如果您在凌晨 2:00 对数据库进行逻辑备份,那么当您从中恢复时,恢复的数据库将保持凌晨 2:00 时的状态。无法在特定时间点(例如凌晨 1:30)停止恢复。如果您在上午 10:00 恢复备份,您就会丢失八小时的数据。

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

  • 提供时间点恢复
  • 备份 PostgreSQL 的内容数据目录WAL(预写日志)文件
  • 占用大量磁盘空间
  • 使用 PostgreSQLpg_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 实例或不同实例
  • 提供压缩机制以最大限度地减少网络流量和磁盘空间

Goals

在本教程中,我们将创建三个 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 实例。在没有适当规划和授权的情况下在实时环境中这样做将意味着您的应用程序中断。

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

我们将首先通过在上安装 PostgreSQL 9.4 来设置数据库环境主数据库服务器备用数据库服务器.

请完成 PostgreSQL 安装步骤这个 LEPP 堆栈教程。从本教程中,您将需要:

  • 遵循该部分第一步 — 安装 PostgreSQL
  • 遵循该部分第二步 — 配置 PostgreSQL

In 第二步 — 配置 PostgreSQL,而不是进行更改pg_hba.conf文件以允许访问 Web 服务器的数据库,请添加此行,以便 Barman 服务器可以连接,使用酒保备份服务器IP 地址,后接/32:

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

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

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

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

确保您已在两台服务器上安装了 PostgreSQL主数据库服务器备用数据库服务器,并且您已允许从酒保备份服务器.

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

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

在两台机器上安装并配置 PostgreSQL 后,我们将向主数据库服务器模拟生产环境。

On the 主数据库服务器,切换到用户postgres:

  1. sudo su- postgres

开始psql访问数据库服务器的实用程序:

  1. psql

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

  1. 创建数据库 mytestdb;
  2. \连接 mytestdb;

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

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

  1. 创建表 mytesttable1(id 整数 NULL);
  2. 创建表 mytesttable2(id 整数 NULL);

这些被命名为mytesttable1 and mytesttable2.

通过键入退出客户端工具\q并按ENTER.

第 3 步 — 安装酒保

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

完成此步骤酒保备份服务器.

为此,您首先需要安装以下存储库:

  • Extra Packages for Enterprise Linux (EPEL) 存储库
  • PostgreSQL 全球开发集团 RPM 存储库

运行以下命令安装 EPEL:

  1. sudo yum -y installepel-释放

运行以下命令来安装 PostgreSQL 存储库:

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

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

  1. sudo yum -y install barman

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

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

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

在本节中,我们将建立 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如果还不是当前用户:

  1. sudo su- postgres

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

  1. ssh 密钥生成器-t rsa

通过按接受密钥文件的默认位置和名称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用户的公钥内容:

  1. cat〜/.ssh/id_rsa.pub

复制输出的内容。

切换到连接到的控制台酒保备份服务器服务器并切换到用户barman:

  1. sudo su- 酒保

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

  1. mkdir -p ~/.ssh
  2. chmod 700 ~/.ssh
  3. echo "public_key_string" >> ~/.ssh/authorized_keys
  4. 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.

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

现在,要测试连接,请切换回主数据库服务器并从那里测试连接:

  1. ssh barman@barman-backup-server-ip

在出现有关远程服务器的真实性未知的初始警告并且您接受提示后,应从远程服务器建立连接主数据库服务器服务器到酒保备份服务器。如果成功,则通过执行以下命令注销会话exit命令。

  1. exit

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

  • 再次运行相同的命令,这次是从备用数据库服务器 to the 酒保备份服务器
  • 第三次运行它们,这次来自barman用户在酒保备份服务器,然后前往postgres用户在主数据库服务器
  • 最后,运行命令从复制密钥barman用户在酒保备份服务器 to the postgres用户在备用数据库服务器

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

From 备用数据库服务器:

  1. ssh barman@barman-backup-server-ip

From 酒保备份服务器:

  1. ssh postgres@main-db-server-ip

From 酒保备份服务器:

  1. ssh postgres@standby-db-server-ip

Note:确保所有三台服务器之间的 SSH 连接是备份正常工作的必要条件。

第 5 步 — 配置 Barman 进行备份

您现在将配置 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仅有读取权限):

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

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

保存并关闭文件。

接下来,我们将确保我们的主数据库服务器配置为进行备份。

第 6 步 — 配置 postgresql.conf 文件

还需要进行最后一项配置主数据库服务器,打开备份(或存档)模式。

首先,我们需要从以下位置找到传入备份目录的值酒保备份服务器。在 Barman 服务器上,切换到用户barman:

  1. sudo su- 酒保

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

  1. 酒保显示服务器主数据库服务器| 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在文本编辑器中创建文件:

  1. 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:

  1. sudosystemctl 重新启动 postgresql-9.4.service

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

第 7 步 — 测试调酒师

现在是时候检查 Barman 是否已正确设置所有配置并可以连接到主数据库服务器.

On the 酒保备份服务器,切换到用户barman如果不是当前用户。运行以下命令来测试与主数据库服务器的连接:

  1. 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 服务器列表,请运行以下命令:

  1. 酒保列表服务器

现在它应该只显示:

Output
main-db-server - Main DB Server

第 8 步 — 创建第一个备份

现在 Barman 已准备就绪,让我们手动创建备份。

运行以下命令barman用户在酒保备份服务器进行第一次备份:

  1. 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目录:

  1. ls -l/var/lib/酒保

那里将会有一个目录: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:

  1. 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)

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

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

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

第 9 步 — 安排备份

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

在此步骤中,我们将自动执行备份,并告诉 Barman 对备份执行维护,以便删除早于​​保留策略的文件。要启用调度,请运行此命令barman用户在酒保备份服务器(如有必要切换到该用户):

  1. crontab -e

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

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

第一个命令将运行完整备份主数据库服务器每晚 11:30。 (如果您在/etc/barman.conf文件,请改用该名称。)

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

第 10 步——模拟“灾难”

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

我们在这里放下一张桌子。不要在生产数据库上执行此操作!

返回到主数据库服务器控制台并切换到用户postgres如果还不是当前用户。

开始psql公用事业:

  1. psql

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

  1. \连接 mytestdb;

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

  1. \dt

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

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

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

  1. 删除表 mytesttable2;

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

  1. \dt

你会看到只有mytesttable1遗迹。

这是您希望从备份恢复的数据丢失情况类型。在这种情况下,您将把备份恢复到单独的服务器:备用数据库服务器.

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

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

前往备用数据库服务器.

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

  1. sudosystemctl 停止 postgresql-9.4.service

服务停止后,请转至酒保备份服务器。切换到用户barman如果还不是当前用户。

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

  1. 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 备用数据库服务器:

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

  1. sudosystemctl 启动 postgresql-9.4.service

应该是这样!

让我们验证一下我们的数据库是否已启动。切换到用户postgres并启动psql公用事业:

  1. sudo su- postgres
  2. psql

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

  1. \连接 mytestdb;
  2. \dt
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 备份。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 CentOS 7 上使用 Barman 备份、恢复和迁移 PostgreSQL 数据库 的相关文章

  • 配置 PostgreSQL 仅适用于 LOCALHOST 或指定的 ip + 端口 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想将 PostgreSQL 配置为仅接受来自指定 IP 的连接 它不应接受来自任何其他 IP 的请求 以下示例 pg hba conf
  • sql直接获取表行数的方法

    stackoverflow 的朋友们大家好 我的例行程序中有一个我认为不必要的步骤 假设您想从图库中获取所有图像 并限制每页一定数量的图像 db PDO object start pagenum x images per page limi
  • 如何以全屏模式连接Linux CentOS 7虚拟机? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在从 Windows 8 1 从 Hyper V 连接到 CentOS 7 VM 全屏模式不起作用 我需要解决这个问题 其他虚拟机包括
  • 事务出错后回滚

    对于熟悉 Postgresql 的人来说 这应该很简单 我的应用程序发出一个begin work 进行一些操作 然后发出commit 操作和提交被包装在一个 try catch 块中 该块的 catch 语句执行rollback 假设 如果
  • DB2 vs PostgreSQL vs SQL Server [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人用过这三个数据库吗 你和他们有什么经历 PostgreSQL 对于一个项目来说看起来相当诱人 但我很想了解更多关于它的信息 我们是一家 NE
  • 执行 SELECT 或 INSERT

    我想写一些类似的东西CASE以我想要的方式在 PostgreSQL 中声明SELECT从表中 如果什么也没找到 我想INSERT改为放入表中 我的示例表allocated ideas看起来像这样 challenge id user id i
  • httplib.BadStatusLine: '' 在 Linux 上,但在 Mac 上则不然

    这个错误已经困扰我几个小时了 我决定编写一个单独的项目 只是为了看看我是否可以复制它 而且我可以 但只能在我的服务器上复制 这适用于我的 Mac Mac OSX El Capitan 10 11 6 服务器 CentOS 7 2 1511
  • 如何使用准备好的语句在 postgresql 中插入带有时区的时间戳?

    我正在尝试使用准备好的语句将一个字符串插入到数据库的带有时区字段的时间戳中 其中包括日期 时间和时区 问题是 Timestamp valueof 函数没有考虑字符串包含的时区 因此会导致错误 接受的格式是 yyyy m m d d hh m
  • 如何在 PostgreSQL 中生成月份列表?

    我有一张桌子A with startdate列是TIMESTAMP WITHOUT TIME ZONE我需要编写一个查询 函数来生成月份列表MIN列的值直到MAX列的值 例如 startdate 2014 12 08 2015 06 16
  • 错误:没有名为 psycopg2.extensions 的模块

    我正在尝试为我的 django 项目设置一个 PostgreSQL 数据库 由于对上一个问题的答复 我相信我现在已经完成了为 django 项目设置 postgreSQL 数据库时出现问题 https stackoverflow com q
  • 使用临时表替换 WHERE IN 子句

    我让用户输入我需要在表中查询的值列表 该列表可能非常大 并且长度在编译时未知 而不是使用WHERE IN 我认为使用临时表并对其执行联接会更有效 我在另一个SO问题中读到了这个建议 目前找不到它 但会在找到时进行编辑 要点是这样的 CREA
  • PostgreSQL:42883 运算符不存在:没有时区的时间戳 = 文本

    我正在使用 Npgsql 3 0 3 0 和 PetaPoco 最新版本 当我运行这个命令时 var dateCreated DateTime Now just an example var sql new Sql WHERE date c
  • Postgresql 和 jsonb - 将键/值插入多级数组

    非常类似于这个帖子 https stackoverflow com questions 58959678 postgresql add key to each objects of an jsonb array 但我很难适应他们的解决方案
  • PostgreSQL 锁定机制中的错误或对该机制的误解

    我们遇到了 PostgreSQL 9 0 12 锁定机制的问题 这是我们重现该问题的最小代码 Scenario Transaction 1 Transaction 2 BEGIN BEGIN select trees for update
  • 在java代码中创建postgresql表

    我有一个与 postgreSQL 数据库连接的 java 代码 现在 我希望当它连接到数据库时 我还将创建数据库表 但我的问题是 它不会创建数据库 我不知道问题是什么 这是我的代码 Statement st null ResultSet r
  • 列“users.id”必须出现在 GROUP BY 子句中或在聚合函数中使用

    关系 Item belongs to Product Product belongs to User 项目型号范围 scope search gt search term select products name users product
  • PostgreSQL & regexp_split_to_array + 取消嵌套

    我有这样的绳子 测试1 纽约 X 测试 2 芝加哥 Y 测试 3 宾夕法尼亚州哈里斯堡 Z 我需要的结果是 Column1 Column 2 Column3 Test 1 new york X Test 2 chicago Y Test 3
  • Python在postgresql表中查找带有单引号符号的字符串

    我需要从 psql 表中查找包含多个单引号的字符串 我当前的解决方案是将单引号替换为双单引号 如下所示 sql query f SELECT exists SELECT 1 FROM table name WHERE my column m
  • Postgresql存储过程中基于会话的全局变量?

    在 Oracle 的 PL SQL 中 我可以使用包定义创建基于会话的全局变量 对于 Postgresql 的 PLpg SQL 这似乎是不可能的 因为没有包 只有独立的过程和函数 以下是 PL SQL 将 g spool key 声明为全
  • 在 SELECT 中将列值拆分为两列?

    我在 varchar 列中有一个字符串值 它是一个由两部分组成的字符串 在它到达数据库之前分割它不是一个选择 该列的值如下所示 one column part1 part2 part1 part2 所以我想要的是一个如下所示的结果集 col

随机推荐

  • Spring框架

    Spring 框架是最流行的 Java EE 框架之一 在本文中 我们将了解以下内容 Spring框架架构 Spring的核心组件 spring 框架下的各种项目 我查看了 Spring Framework Servlet JSP 和 JS
  • 如何在 Ubuntu 16.04 上使用 uWSGI 和 Nginx 为 Django 应用程序提供服务

    介绍 Django 是一个功能强大的 Web 框架 可以帮助您启动 Python 应用程序或网站 Django 包含一个简化的开发服务器 用于在本地测试代码 但对于任何与生产稍微相关的事情 都需要更安全 更强大的 Web 服务器 在本指南中
  • ThreadPoolExecutor - Java 线程池示例

    Java线程池管理工作线程池 它包含一个队列 使任务等待执行 我们可以用ThreadPoolExecutor在Java中创建线程池 Java线程池管理Runnable线程的集合 工作线程执行队列中的可运行线程 java util concu
  • 使用 Docker Compose 将 Node.js 应用程序容器化以进行开发

    介绍 如果您正在积极开发应用程序 请使用Docker可以简化您的工作流程以及将应用程序部署到生产的过程 在开发中使用容器可以带来以下好处 环境是一致的 这意味着您可以为项目选择所需的语言和依赖项 而不必担心系统冲突 环境是隔离的 可以更轻松
  • 在 JavaScript 中使用位运算符

    介绍 虽然 Javascript 中的按位运算符几乎没有受到任何关注 但它们实际上非常强大并且用途广泛 它们被认为可以更快地进行数值计算和转换 我们可以利用它们来替代某些复杂的编码场景 并使我们的代码更具可读性 在本教程结束时 您将基本了解
  • 命令设计模式

    命令模式是行为设计 模式之一 命令设计模式用于实现松耦合在请求 响应模型中 命令模式 In command pattern the request is send to the invoker and invoker pass it to
  • 如何在 CentOS 6 上设置 Apache 虚拟主机

    Status 已弃用 本文介绍不再受支持的 CentOS 版本 如果您当前运行的服务器运行 CentOS 6 我们强烈建议您升级或迁移到受支持的 CentOS 版本 Reason CentOS 6 于 2020 年 11 月 30 日达到生
  • 如何在 Ubuntu 18.04 上安装 Anaconda [快速入门]

    介绍 Anaconda 专为数据科学和机器学习工作流程而设计 是一款开源包管理器 环境管理器以及 Python 和 R 编程语言的分发版 本教程将指导您在 Ubuntu 18 04 服务器上安装 Anaconda 有关本教程的更详细版本以及
  • 如何在 Ubuntu 14.04 上安装和配置 OSSEC 安全通知

    介绍 您如何跟踪服务器上的授权和未经授权的活动 OSSEC 是一种可以安装在服务器上以跟踪其活动的工具 OSSEC 是一种开源 基于主机的入侵检测系统 HIDS 它执行日志分析 完整性检查 Windows 注册表监控 rootkit 检测
  • 如何在 Ubuntu 22.04 上安装和保护 Grafana

    介绍 Grafana是一种开源数据可视化和监控工具 可与来自以下来源的复杂数据集成普罗米修斯 InfluxDB Graphite and 弹性搜索 Grafana 允许您为数据创建警报 通知和临时过滤器 同时还可以通过内置共享功能更轻松地与
  • 如何在 Ubuntu 12.10 上使用 Nginx 设置 HTTP 身份验证

    什么是Red Means 用户需要输入或自定义的行将位于red在本教程中 其余的大部分应该是可复制和粘贴的 关于 Nginx Nginx 发音为 engine x 是一个 HTTP 和反向代理服务器 以及邮件代理服务器 由 Igor Sys
  • 如何在零停机的情况下将 WordPress 从共享主机迁移到云服务器

    Status 已弃用 本文介绍不再受支持的 Ubuntu 版本 如果您当前运行的服务器运行 Ubuntu 12 04 我们强烈建议您升级或迁移到受支持的 Ubuntu 版本 升级到Ubuntu 14 04 从 Ubuntu 14 04 升级
  • 如何在 Ubuntu 22.04 上使用 apt 安装 Java

    介绍 许多软件都需要 Java 和 JVM Java 虚拟机 包括Tomcat Jetty 玻璃鱼 卡桑德拉 and Jenkins 在本指南中 您将使用以下命令安装各种版本的 Java 运行时环境 JRE 和 Java 开发人员工具包 J
  • 如何在 Ubuntu 16.04 上使用 GitLab CI 设置持续集成管道

    介绍 GitLab 社区版是一个自托管的 Git 存储库提供商 具有帮助项目管理和软件开发的附加功能 GitLab 提供的最有价值的功能之一是内置的持续集成和交付工具 称为亚搏体育appGitLab持续集成 在本指南中 我们将演示如何设置
  • Linux 中的导出命令

    在本指南中 我们将了解 Linux 中的导出命令 Export 是 Bash shell 的内置命令 它用于标记要传递给子进程的变量和函数 基本上 变量将包含在子进程环境中 而不会影响其他环境 为了更清楚地了解我们正在讨论的内容 让我们深入
  • 如何在 Ubuntu 20.04 上安装 Node.js

    介绍 Node js是用于服务器端编程的 JavaScript 运行时 它允许开发人员使用 JavaScript 创建可扩展的后端功能 这是许多人在基于浏览器的 Web 开发中已经熟悉的语言 在本指南中 我们将向您展示在 Ubuntu 20
  • 如何在 Ubuntu 13.10 上安装 Hadoop

    先决条件 本教程的唯一先决条件是 VPS乌班图 13 10 x64安装 您需要从命令行执行命令 可以通过以下两种方式之一执行 使用 SSH 访问 Droplet 使用 Digital Ocean Droplet 管理面板中的 控制台访问 什
  • 如何在 CentOS 7 上将 MySQL 数据目录更改到新位置

    介绍 数据库随着时间的推移而增长 有时会超出文件系统上的空间 当它们与操作系统的其余部分位于同一分区时 您也可能会遇到 I O 争用 RAID 网络块存储和其他设备可以提供冗余和其他所需的功能 无论您是要添加更多空间 评估优化性能的方法 还
  • 如何设置 MySQL 主主复制

    Status 已弃用 本教程已被弃用并且不再维护 Reason 本教程介绍了构建多主拓扑的过时方法 在本文最初发表时 MySQL 中尚未实现组复制 请参阅 您可以阅读最新的如何在 Ubuntu 16 04 上配置 MySQL 组复制设置多主
  • 如何在 CentOS 7 上使用 Barman 备份、恢复和迁移 PostgreSQL 数据库

    介绍 PostgreSQL是一个开源数据库平台 因其易于维护 成本效益以及与其他开源技术的简单集成而深受 Web 和移动应用程序开发人员的欢迎 维护 PostgreSQL 环境的一项关键任务是定期备份其数据库 备份是任何组织灾难恢复 DR