介绍
PostgreSQL是一个开源数据库平台,因其易于维护,成本效益以及与其他开源技术的简单集成而广受网络和移动应用程序开发人员的欢迎。
维护PostgreSQL环境的一个关键任务是定期备份其数据库。备份是任何组织的灾难恢复(DR)过程的一部分。这很重要,原因如下:
- 防止由于存储或服务器本身等底层基础架构组件故障导致的数据丢失
- 防止数据损坏和不必要或恶意的数据丢失
- 将生产数据库迁移到开发或测试环境中
通常,数据库备份和恢复的责任落在DBA的肩上。但是,在较小的组织或初创公司中,系统管理员,DevOps工程师或程序员通常必须创建自己的数据库后端。因此,对于使用PostgreSQL的每个人来说,了解备份的工作方式以及如何从备份中恢复非常重要。
在本教程中,您将设置Barman备份服务器,从主数据库服务器进行备份,然后还原到备用服务器。
PostgreSQL备份方法简介
在启动Barman设置之前,让我们花一点时间来回顾一下PostgreSQL可用的备份类型及其用途。(自建服务器难免会遇到这样的问题,配置SSL很麻烦,虽然对一部分人来说这也是一种乐趣,但是如果您在生产环境使用,我还是建议您直接使用云关系型数据库,云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、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文件中播放它上面的事务。这使数据库及时处于一致状态。
Barman备份如何工作
传统上,PostgreSQL DBA会编写自己的备份脚本和预定cron
作业来实现物理备份。巴曼以标准化的方式做到这一点。
Barman或Backup and Recovery Manager是来自2ndQuadrant的免费开源PostgreSQL备份工具,这是一家专业的Postgres解决方案公司。Barman是用Python编写的,为PostgreSQL实例提供了一种简单,直观的物理备份和恢复方法。使用Barman的一些好处是:
- 这是完全免费的
- 它是一个维护良好的应用程序,并提供供应商提供的专业支持
- 让DBA / Sysadmin免于编写和测试复杂的脚本和
cron
作业 - 可以将多个PostgreSQL实例备份到一个中心位置
- 可以还原到同一个PostgreSQL实例或不同的实例
- 提供压缩机制以最小化网络流量和磁盘空间
目标
在本教程中,我们将创建三个腾讯云CVM,在其中两台机器上安装PostgreSQL 9.4,并在第三台机器上安装Barman。
其中一个PostgreSQL服务器将是我们的主数据库服务器:这是我们创建生产数据库的地方。第二个PostgreSQL实例将为空并被视为备用机器,我们可以从备份中恢复。
Barman服务器将与主数据库服务器通信并执行物理备份和WAL归档。
然后,我们将通过从我们的实时数据库中删除一个表来模拟“灾难”。
最后,我们将备份的PostgreSQL实例从Barman服务器恢复到备用服务器。
准备
要学习本教程,您需要创建三个腾讯CVM(或您自己的Linux服务器),每个CVM至少有2 GB RAM和2个CPU核心。(你可能需要三台已经设置好可以使用sudo
命令的非root账号的CentOS服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)
所有三台服务器都应具有相同的操作系统(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)
可以从DigitalOcean控制面板找到机器的实际IP地址。
您还应该在每台服务器上设置一个sudo用户,并将其用于一般访问。大多数命令将作为两个不同的用户(postgres和barman)执行,但是每个服务器上也需要一个sudo用户,因此您可以切换到这些帐户。
注意:本教程将使用默认的Barman安装目录作为备份位置。在CentOS,这个位置是:/var/lib/barman/
。2ndQuadrant建议最好保留默认路径。在实际使用情况中,根据数据库的大小和要备份的实例数,您应该检查托管此目录的文件系统中是否有足够的空间。
警告: 您不应在生产服务器上运行本教程中的任何命令,查询或配置。本教程将涉及更改配置和重新启动PostgreSQL实例。在没有适当规划和授权的实时环境中这样做将意味着您的应用程序中断。
第1步 - 安装PostgreSQL数据库服务器
我们将首先在main-db-server和standby-db-server上安装PostgreSQL 9.4来建立我们的数据库环境。
请完成PostgreSQL安装步骤
您需要:
- 第一步 - 安装PostgreSQL一节
- 第二步 - 配置PostgreSQL一节
在第二步 - 配置PostgreSQL,而不是更改pg_hba.conf
文件以允许访问Web服务器的数据库,添加此行,以便Barman服务器可以使用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-backup-server访问它们。
接下来,我们将一些示例数据添加到主数据库服务器。
第2步 - 创建PostgreSQL数据库和表
一旦在两台机器上安装并配置了PostgreSQL,我们就会将一些示例数据添加到main-db-server以模拟生产环境。
在main-db-server上,切换到用户postgres:
代码语言:javascript复制sudo su - postgres
启动该psql
实用程序以访问数据库服务器:
psql
从psql
提示符处,运行以下命令以创建数据库并切换到该数据库:
CREATE DATABASE mytestdb;
connect mytestdb;
输出消息将告诉您现在以mytestdb
用户身份连接到数据库postgres
。
接下来,在数据库中添加两个表:
代码语言:javascript复制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:
代码语言:javascript复制sudo yum -y install epel-release
运行以下命令安装PostgreSQL仓库:
代码语言:javascript复制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:
代码语言:javascript复制sudo yum -y install barman
注意:安装Barman将创建一个名为barman的操作系统用户。此帐户没有密码; 您可以从sudo用户帐户切换到此用户。
Barmen已经安装好了!现在,让我们确保服务器可以安全地相互连接。
步骤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
我们将向您展示如何设置连接以便用户postgres从main-db-server连接到barman-backup-server。
从main-db-server切换到用户postgres,如果它还不是当前用户:
代码语言:javascript复制sudo su - postgres
运行以下命令以生成SSH密钥对:
代码语言:javascript复制ssh-keygen -t rsa
按下接受密钥文件的默认位置和名称ENTER
。
按ENTER
两次以创建没有任何密码短语的私钥。
生成密钥后,将在postgres用户的主目录下创建一个.ssh
目录,其中包含密钥。
您现在需要将SSH公钥复制到barman-backup-server上barman用户的.ssh
目录下的authorized_keys
文件中。
注意:很遗憾,您无法在此处使用此ssh-copy-id barman@barman-backup-server-ip
命令。那是因为这个命令会询问Barmen用户的密码,默认情况下没有设置。因此,您需要手动复制公钥内容。
运行以下命令输出postgres用户的公钥内容:
代码语言:javascript复制cat ~/.ssh/id_rsa.pub
复制输出的内容。
切换到连接到barman-backup-server服务器的控制台并切换到用户barman:
代码语言:javascript复制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并从那里测试连接:
代码语言:javascript复制ssh barman@barman-backup-server-ip
在关于远程服务器的真实性未知并且您接受提示的初始警告之后,应该建立从主db-server服务器到barman-backup-server的连接。如果成功,请通过执行exit
命令注销会话。
exit
您需要再设置三次SSH密钥连接。您可以跳过制作.ssh
目录(如果已经制作)(尽管这不是必需的)。
- 再次运行相同的命令,这次是从standby-db-server到barman-backup-server
- 第三次运行它们,这次是来自barman-backup-server上的barman用户,然后转到main-db-server上的postgres用户
- 最后,运行命令将密钥从barman-backup-server上的barman用户复制到standby-db-server上的postgres用户
确保以单向方式测试连接,以便接受有关新连接的初始警告。
从standby-db-server:
代码语言:javascript复制ssh barman@barman-backup-server-ip
从barman-backup-server:
代码语言:javascript复制ssh postgres@main-db-server-ip
从barman-backup-server:
代码语言:javascript复制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服务器三次 - 取消该
basebackup_retry_sleep
行的注释并保持默认值30
。每次重试之间会有30秒的延迟 - 取消该
last_backup_maximum_age
行的注释并将其值设置为1 DAYS
新设置应如下所示:
摘自/etc/barman.conf
代码语言:javascript复制[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将重试三次
- PostgreSQL服务器上次完全备份的时间不应超过1天
在文件末尾添加一个新部分。它的标题应该用方括号里的[main-db-server]
来表示。(如果要使用Barman备份更多数据库服务器,可以为每个服务器创建一个这样的块,并为每个服务器使用唯一的头名称。)
本节包含数据库服务器的连接信息以及一些独特的备份设置。
在新块中添加这些参数:
代码语言:javascript复制[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天的恢复窗口保留足够的备份。这意味着我们可以将整个数据库服务器恢复到过去七天内的任何时间点。对于生产系统,您应该将此值设置得更高,以便手头有更旧的备份。
您需要在ssh_command
和conninfo
的参数中使用main-db-server的IP地址。否则,您可以完全复制上述设置。
修改后的文件的最终版本应如下所示,减去所有注释和未修改的设置:
代码语言:javascript复制[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:
代码语言:javascript复制sudo su - barman
运行此命令以找到传入的备份目录:
代码语言:javascript复制barman show-server main-db-server | grep incoming_wals_directory
这应该输出这样的东西:
代码语言:javascript复制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
的值,请使用该值。
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:
代码语言:javascript复制sudo systemctl restart postgresql-9.4.service
注意:如果您正在配置现有的生产PostgreSQL实例,则很可能已经设置了这三个参数。然后,您必须仅添加/修改archive_command
参数,以便PostgreSQL将其WAL文件发送到备份服务器。
第7步 - 测试Barman
现在是时候检查Barman是否正确设置了所有配置并且可以连接到main-db-server。
在barman-backup-server上,如果不是当前用户,请切换到用户barman。运行以下命令以测试与主数据库服务器的连接:
代码语言:javascript复制barman check main-db-server
请注意,如果您在步骤5中的/etc/barman.conf
文件中的服务器块的方括号之间输入了不同的名称,则应使用该名称。
如果一切正常,输出应如下所示:
代码语言:javascript复制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实例,Postgres未配置为WAL归档,SSH无法在服务器之间工作,等等。无论原因是什么,都需要在备份发生之前修复。运行前面的步骤并确保所有连接都正常工作。
要获取使用Barman配置的PostgreSQL服务器列表,请运行以下命令:
代码语言:javascript复制barman list-server
现在它应该只显示:
代码语言:javascript复制main-db-server - Main DB Server
第8步 - 创建第一个备份
现在你准备好了Barman,让我们手动创建一个备份。
以barman-backup-server上的barman用户身份运行以下命令进行首次备份:
代码语言:javascript复制barman backup main-db-server
同样,该main-db-server
值是您在步骤5 中作为/etc/barman.conf
文件中服务器块的顶部输入的值。
这将启动PostgreSQL数据目录的完整备份。由于我们的实例只有一个带有两个表的小型数据库,所以它应该很快完成。
代码语言:javascript复制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
代码语言:javascript复制Output
main-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
将显示一组详细信息:
代码语言:javascript复制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)
要深入查看哪些文件进入备份,请运行以下命令:
代码语言:javascript复制barman list-files main-db-server backup-id
这将给出从该特定备份还原所需的基本备份和WAL日志文件的列表。
第9步 - 计划备份
理想情况下,您的备份应按计划自动进行。
在此步骤中,我们将自动执行备份,并且我们将告诉Barman对备份执行维护,以便删除早于保留策略的文件。要启用计划,请在barman-backup-server上以barman用户身份运行此命令(如有必要,请切换到此用户):
代码语言:javascript复制crontab -e
这将为crontab
用户barmen打开一个文件。编辑文件,添加这些行,然后保存并退出:
30 23 * * * /usr/bin/barman backup main-db-server
* * * * * /usr/bin/barman cron
第一个命令将在每晚11:30 PM 运行main-db-server的完整备份。(如果您在/etc/barman.conf
文件中使用了不同的服务器名称,请改用该名称。)
第二个命令将每分钟运行一次,并对WAL文件和基本备份文件执行维护操作。
第10步 - 模拟“灾难”
您现在将看到如何从刚创建的备份中恢复。为了测试恢复,我们首先模拟一个丢失了一些数据的“灾难”场景。
我们在这里删除一张表。不要在生产数据库上执行此操作!
返回主db-server控制台并切换到用户postgres(如果它还不是当前用户)。
启动该psql
实用程序:
psql
从psql
提示符处,执行以下命令将数据库上下文切换为mytestdb
:
connect mytestdb;
接下来,列出数据库中的表:
代码语言:javascript复制dt
输出将显示您在本教程开头创建的表:
代码语言:javascript复制Output
List of relations
Schema | Name | Type | Owner
-------- -------------- ------- ----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres
现在,运行此命令以删除其中一个表:
代码语言:javascript复制drop table mytesttable2;
如果您现在dt
再次执行该命令:
dt
你会看到只mytesttable1
留下来。
这是您希望从备份还原的数据丢失情况类型。在这种情况下,您将备份还原到单独的服务器:standby-db-server。
步骤11 - 恢复或迁移到远程服务器
您可以按照此部分还原备份,或将最新的PostgreSQL备份迁移到新服务器。
转到standby-db-server。
首先,利用有sudo权限得用户停止PostgreSQL服务。(如果在服务运行时尝试运行恢复,则重启将会阻塞。)
代码语言:javascript复制sudo systemctl stop postgresql-9.4.service
服务停止后,转到barman-backup-server。切换到用户barman,如果它还不是当前用户。
让我们找到最新备份的详细信息:
代码语言:javascript复制barman show-backup main-db-server latest
代码语言:javascript复制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
从输出中,记下第一行(上图中的20160114T173552
)上打印的备份ID 。如果latest
备份包含您需要的数据,则可以将其latest
用作备份ID。
还可以从Begin time
字段(上图中的2016-01-14 17:35:53.164222-05:00
)检查备份的时间。
接下来,运行此命令将指定的备份从barman-backup-server恢复到standby-db-server:
代码语言:javascript复制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的默认数据目录。对于真实用例,请选择适当的路径
要成功执行还原操作,您应该收到如下输出:
代码语言:javascript复制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服务:
代码语言:javascript复制sudo systemctl start postgresql-9.4.service
那应该是它!
让我们验证我们的数据库已启动。切换到用户postgres并启动该psql
实用程序:
sudo su - postgres
psql
切换数据库上下文mytestdb
并列出其中的表:
connect mytestdb;
dt
代码语言:javascript复制 List of relations
Schema | Name | Type | Owner
-------- -------------- ------- ----------
public | mytesttable1 | table | postgres
public | mytesttable2 | table | postgres
(2 rows)
该列表应在数据库中显示两个表。换句话说,您刚刚恢复了丢弃的表。
根据您更大的恢复策略,您现在可能想要故障转移到standby-db-server,或者您可能想要检查已还原的数据库是否正常工作,然后再次运行此部分以还原到main-db-服务器。
要还原到任何其他服务器,只需确保已安装PostgreSQL并与Barman服务器建立适当的连接,然后使用目标恢复服务器的IP地址执行此部分。
结论
在本教程中,我们已经了解了如何安装和配置Barman来备份PostgreSQL服务器。我们还学习了如何从这些备份中恢复或迁移。
经过仔细考虑,Barman可以成为所有PostgresSQL数据库的中央存储库。它提供了强大的备份机制和简单的命令集。但是,创建备份只是故事的一半。您应始终通过将备份还原到其他位置来验证备份。这项工作应该定期进行。
将Barman纳入备份策略的一些问题:
- 将备份多少个PostgreSQL实例?
- Barman服务器上是否有足够的磁盘空间用于托管指定保留期的所有备份?如何监控服务器的空间使用情况?
- 不同服务器的所有备份是否应该同时启动,还是可以在非高峰时段交错?同时启动所有服务器的备份会给Barman服务器和网络带来不必要的压力
- Barman服务器和Postgres服务器之间的网络速度是否可靠?
另一点需要注意的是,Barman无法备份和恢复单个数据库。它适用于文件系统级别,并使用全有或全无的方法。在备份期间,备份包含其所有数据文件的整个实例; 恢复时,将恢复所有这些文件。同样,您不能使用Barman进行仅架构或仅数据备份。
因此,我们建议您设计备份策略,以便使用Barman进行逻辑备份pg_dump
或pg_dumpall
使用Barman进行物理备份。这样,如果需要快速还原单个数据库,则可以使用pg_dump
备份。对于时间点恢复,请使用Barman备份。
更多CentOS教程请前往腾讯云 社区学习更多知识。
参考文献:《How To Back Up, Restore, and Migrate PostgreSQL Databases with Barman on CentOS 7》