PostgreSQL的标志pg_basebackup是一种广泛使用的PostgreSQL备份工具,允许我们采取网上和一致的文件系统级备份。这些备份可用于point-in-time-recovery或建立一个奴隶/备用。你可以参考我们之前的博文,PostgreSQL的备份策略,在PostgreSQL流复制更快的PITR PostgreSQL我们描述我们如何pg_basebackup用于不同的目的。在这篇文章中,我将演示的步骤恢复备份使用pg_basebackup当我们有很多底层对象存储数据库或表空间。

备份和恢复一个PostgreSQL集群

一个简单的备份可以使用以下语法。

使用tar和压缩格式是有利的,当你想使用更少的磁盘空间来备份和存储所有表空间、数据目录和WAL段,一切只是一个目录(目标目录备份)。

而普通的格式存储数据目录的副本,在目标目录中。当你有一个或多个非默认表空间、表空间可能存储在一个单独的目录中。这通常是一样的原始位置,除非你使用- - -表空间- - - - - -映射修改目的地存储表空间备份。

PostgreSQL支持表空间的概念。在简单的词语,一个表空间可以帮助我们保持多个位置分散数据库或对象。通过这种方式,我们可以将跨多个磁盘IO和平衡负载。

了解发生了什么当我们备份一个PostgreSQL集群包含多个表空间,让我们考虑下面的例子。我们将这些步骤:

  • 创建两个表空间在一个现有的主从复制设置。
  • 进行备份在备份目录,看看是什么。
  • 恢复备份。
  • 总结我们的研究结果

创建两个表空间,使用pg_basebackup备份(tar格式)

步骤1:

我建立了一个复制集群使用PostgreSQL 11.2。你可以参考我们的博客在PostgreSQL流复制复制相同的场景。下面是用于创建两个表空间的步骤:

步骤2:

现在,我在两个不同的表空间创建两个数据库,使用pgbench创建一些表和加载数据。

在使用流媒体构建的主从设置复制,您必须确保目录中存在的奴隶,在运行之前“创建表空间……”的主人。这是因为同样的语句用于创建一个表空间/应用运往奴隶通过wal -这是不可避免的。奴隶崩溃与以下消息,当这些目录不存在:

步骤3:

现在让我们使用pg_basebackup备份。在这个例子中,我使用一个tar格式备份。

在上面的日志,可以看到有三个表空间备份:一个违约,和两个新创建的表空间。如果我们回去看看两个表空间中的数据分发到合适的目录中,我们看到,里面有符号链接创建pg_tblspc目录(在数据目录)的oid的表空间。这些链接指向的实际位置表空间,我们在步骤1中指定。

步骤4:

这里有备份目录内的内容,通过生成备份在步骤3中。

Tar文件:16419. tar.gz16420. tar.gz创建两个表空间备份。这些都是用相同的名称创建的oid各自的表空间。

现在让我们看看我们如何可以恢复备份数据和表空间完全不同的位置。

恢复一个PostgreSQL集群与多个表空间备份

步骤1:

为了进行进一步的恢复,我们首先提取base.tar。gz文件。这个文件包含一些重要文件,帮助我们进一步进行。

步骤2:

恢复的文件,我们需要考虑:

  • backup_label
  • tablespace_map

当你打开backup_label文件,我们看到WAL位置,开始备份开始时间等。这些都是帮助我们一些细节执行point-in-time-recovery。

现在,让我们看看在什么tablespace_map文件。

在上面的日志,你可以看到有两个条目,一个用于每个表空间。这是一个文件,将一个表空间(oid)映射到它的位置。当你开始PostgreSQL后提取表空间和WAL tar文件,自动创建符号链接postgres - pg_tblspc目录中的每个表空间到适当的表空间位置,使用映射在这个文件。

步骤3:

现在,为了恢复这个相同的postgres备份服务器的备份了,您必须在原表空间删除现有的数据目录。这允许您提取每个表空间的tar文件到相应的表空间的位置。

实际的命令提取表空间的备份,在这种情况下,以下:

在一个场景,你想恢复备份的备份到同一台机器从最初,我们必须使用不同的位置而提取的数据目录和表空间备份。为了达到这个目的,tar文件提取单个表空间可能比原来的目录中指定不同的目录中tablespace_map的文件,我们可以修改tablespace_map与新表空间文件位置。接下来的两个步骤帮助你应该看到这是如何工作的。

步骤3:

创建两个不同的目录并提取表空间。

步骤3 b:

编辑tablespace_map与新表空间文件位置。每个表空间的原始位置替换为新位置,我们提取前一步的表空间。以下是编辑后似乎。

步骤4:

提取pg_wal.tar。广州新数据备份pg_wal目录的目录。

步骤5:

创建复苏. conf指定时间当您希望执行point-in-time-recovery。请参考我们之前的博客步骤3,理解复苏。conf PITR的细节。

步骤6:

一旦完成上面所有的步骤你就可以开始PostgreSQL。
您应该能看到以下文件重命名后的复苏。

避免行使手动修改tablespace_map文件,您可以使用- - -表空间- - - - - -映射。这是一个选项,当您使用普通格式备份工作,但不是与焦油。让我们看看为什么你可能更喜欢一个tar格式相比平原。

PostgreSQL集群的备份表空间使用普通格式

考虑同样的场景,你有一个PostgreSQL集群有两个表空间。您可能会看到下面的错误,当你不使用- - -表空间- - - - - -映射

上述错误意味着什么是pg_basebackup试图将表空间存储在相同的位置与原始表空间目录。在这里/data_pgbench表空间的位置:data_pgbench现在,pg_basebackup试图将表空间备份存储在相同的位置。为了克服这个错误,您可以使用以下语法应用表空间的映射。

- - - - - -T用于指定表空间的映射。- - - - - -T可以更换的- - -表空间- - - - - -映射

使用- t的优势(- - -表空间- - - - - -映射)单独的表空间存储在映射目录。在这个例子中使用简单格式备份,必须提取所有以下三个目录,以恢复使用备份/恢复数据库。

  • /备份/ latest_backup
  • / pgdata_pgtest
  • / pgdata_pgbench

然而,你不需要一个tablespace_map文件在这个场景中,它是自动照顾PostgreSQL。
如果你把一个备份tar格式,你看到所有的tar文件为基础,和细胞膜段存储在相同的表空间备份目录,就可以提取这个目录执行恢复/复苏。然而,您必须手动提取表空间和细胞膜部分适当的位置和编辑tablespace_map文件,正如上面所讨论的。

- - - - - -
基于照片的图像艾伦·詹姆斯·亨得利Unsplash坦纳BoriackUnsplash

1评论
最古老的
最新的 大多数投票
内联反馈
查看所有评论
沙R

嗨Avinash,

我是新到Postgresql。在我们的项目我们要迁移到Postgresql。

当有需要大量的数据加载到一个表,通常的过程遵循在大型机DB2是如下提到的

•设置停顿点或把图片复制的表空间(这只是一个备份/恢复点如果在加载数据有问题)
•负载表
•修复表空间——这是检查复制等待状态,并检查数据
•Reorg和Runstats索引的表空间——这是确保索引重建后质量负载。

如果负载体积较低或局限于几百的记录并非所有这些步骤执行。根据上述过程的唯一原因是性能。

请让我知道Postgres进行一般的流程是什么,我相信并不是所有上述步骤是必需的。请澄清。

谢谢,

沙R。