我试图弄清楚 PostgreSQL 周围的各种事情,以及备份应该如何与 WAL 和 Commvault Simpana 一起工作。Simpana 告诉我一切正常,但文件仍留在 WAL 存档目录中。
让旅程开始吧。
环境
PostgreSQL 和操作系统版本
PostgreSQL 9.3 在 Ubuntu 14.04.3 LTS 服务器上运行。
Postgres WAL 配置
postgres.conf 文件为 WAL 归档设置如下。
#------------------------------------------------------------------------------
# WRITE AHEAD LOG
#------------------------------------------------------------------------------
# - Settings -
#wal_level = minimal # minimal, archive, or hot_standby
wal_level = archive
[...]
# - Archiving -
archive_mode = on
#archive_mode = off # allows archiving to be done
# (change requires restart)
archive_command = 'cp %p /pgsql-backup/archive/postgres1/%f'
# command to use to archive a logfile segment
# archive_command = ''
# command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# %f = file name only
# e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0 # force a logfile segment switch after this
# number of seconds; 0 disables
如果test ...
零件留在其中,archive_command
它会破坏 Simpana 备份,这就是我们省略它的原因。
上面的配置应该会导致 WAL 文件从/pg_xlog/
目录复制到/pgsql-backup/archive/postgres1/
目录,当...
- 不再需要,因为 pg_basebackup
- WAL 文件已满(默认为 16MB)且不再使用
Commvault Simpana
客户端计算机已配置为备份存档日志目录中的 PostgreSQL 数据库/实例和 WAL 文件。不再需要时应删除 WAL 文件,因为已为 PostgreSQL 客户端设置了 Simpana 选项“删除存档”。
预期行为
因为 Simpana 正在使用 PostgreSQL 本机命令执行备份,所以我希望当 Simpana 完成完整备份或 WAL 备份时,/pgsql-backup/archive/postgres1/
目录中的文件将被删除。
有效行为
当我/pgsql-backup/archive/postgres1/
在 Simpana 执行备份后检查目录时,目录中还会有一个带有0000000300000037000000nn.mmmmmmmm.backup
语法的文件。这暗示 Simpana 正在使用本机 PostgreSQL 命令执行备份,因为0000000300000037000000nn.mmmmmmmm.backup
只有在使用pg_basebackup
. 这只是我在阅读 PostgreSQL 9.3 的文档后得出的结论。
以下是目录内容的示例:
[...]
00000003000000370000007A
00000003000000370000007B.00000028.backup
000000030000003700000091.00000028.backup
000000030000003700000093.00000028.backup
000000030000003700000095.00000028.backup
000000030000003700000097.00000028.backup
000000030000003700000099.00000028.backup
00000003000000370000009B.00000028.backup
PostgreSQL 文档
官方文档指出
要使用备份,您需要保留在文件系统备份期间和之后生成的所有 WAL 段文件。为了帮助您执行此操作,基本备份过程会创建一个备份历史文件,该文件会立即存储到 WAL 存档区域中。该文件以文件系统备份所需的第一个 WAL 段文件命名。例如,如果起始 WAL 文件是 0000000100001234000055CD,则备份历史文件将命名为 0000000100001234000055CD.007C9330.backup。(文件名的第二部分代表 WAL 文件中的确切位置,通常可以忽略。)一旦您安全地归档了文件系统备份和备份期间使用的 WAL 段文件(如备份历史记录中指定的那样)文件),不再需要名称数字较小的所有已归档 WAL 段来恢复文件系统备份,并且可以将其删除。但是,您应该考虑保留几个备份集,以绝对确定您可以恢复数据。
这破坏了我的结论,即 Simpana 正在使用本机 PostgreSQL 命令来备份目录中的数据库/实例及其 WAL 存档日志文件/pgsql-backup/archive/postgres1/
。
根据文档,nnnnnnnnnnnnnnnnnnnnnn.mmmmmmmm.backup 文件是指向成功前滚恢复所需的最早 WAL 文件的指针。存档日志目录中的任何旧 WAL 文件都可以删除并且不再需要。
让我吃惊的是,Archive Log 目录中有一个 WAL 文件,没有对应的 *.mmmmmmmm.backup 指针文件。
问题
- 如果我不使用 Simpana 进行备份,谁会(必须)删除 WAL 存档目录中的 *.mmmmmmmm.backup 文件?
pg_archivecleanup
命令? - 为什么存档日志目录中仍然有一个完整的 WAL 文件,而它应该像存档日志目录中的所有其他 WAL 文件一样被删除?
- 为什么存档日志目录中没有
00000003000000370000007A.mmmmmmmm.backup
仍然存在的WAL 文件的文件?00000003000000370000007A
我期待您的回复,并希望有人在某个地方有类似的 Simpana 和 PostgreSQL 配置。
我们对 Simpana postgres 备份也有同样的问题。该文档指出:
所以:如果您不进行额外的仅日志备份,就在下一次完整备份之前;所有这些墙永远不会被备份/删除;更糟糕的是:在磁盘故障的情况下,您永远不能 PITR 到这个时间段。
这似乎从根本上是关于 Commvault Simpana 的问题,而不是 PostgreSQL 的问题。由于 Commvault 似乎是商业软件,因此您最好联系他们的支持台。
我不知道这里的“WAL 备份”是什么意思。这是 Simpana 特有的术语吗?这是否只是意味着您原始存档目录中的 WAL 文件已被复制到某个异地存储?
如果您不使用 Simpana,那么您将使用其他东西。我们不能告诉你其他东西会是什么——有很多选择。虽然
pg_archivecleanup
是一种这样的方法,但这些天它看起来已经过时了。如果您只想将 WAL 文件保留足够长的时间以便在备用设备上安全地存储(或重放)它们,您现在可以使用“流式复制”,从而完全取消日志传送。或者您可以制定一个永久保留第一个基本备份的策略(在您初始化空数据库之后立即),以及从那时起存档的每个 WAL 文件,以便您可以对历史中的任何时间进行时间点恢复您的数据库。
在我看来,当 Simpana 决定清理存档时,它不是删除所有比当前需要的最旧文件更旧的 WAL 文件,而是删除从上次清理时仍需要的文件开始的文件范围,结束在当前需要的那个之前的那个。
如果是这种情况,那么如果一个 WAL 文件在您打开归档后立即被 PostgreSQL 归档,但在激活 Simpana 之前(或在它得到支持之前),那么该文件将永远不会被删除。
如果在 00000003000000370000007A 是活动的 WAL 文件期间没有启动备份,那么首先就不会有 00000003000000370000007A.mmmmmmmm.backup 文件。
WAL 是 Write Ahead Log 的缩写。如果您想保护任何关键数据库的数据,您必须在 PostgreSQL 中启用归档模式。
简而言之,归档是为数据库中发生的所有事务创建备份的过程,以便您可以将数据库恢复到任何时间点。
什么是 PostgreSQL WAL 归档?
在数据库上执行的任何事务首先写入 WAL 文件,如 Oracle 中的重做日志,然后应用于实际的数据文件。随着您不断添加和修改数据库中的数据,WAL 文件会不断生成。在 PostgreSQL 术语中,将生成的 WAL 文件复制出来称为归档,用于数据库的备份和恢复、时间点恢复和复制。
在 Postgres 中启用 WAL 归档的步骤
以下是完整的步骤: 在 PostgreSQL 中启用存档模式