PostgreSQL / WAL-archiving:我可以在进行映像快照备份时将 archive_command 留空吗?
Posted
技术标签:
【中文标题】PostgreSQL / WAL-archiving:我可以在进行映像快照备份时将 archive_command 留空吗?【英文标题】:PostgreSQL / WAL-archiving: can I leave archive_command empty when doing image snapshot backups? 【发布时间】:2017-05-22 10:01:28 【问题描述】:我有一个在 Azure VM 上运行的 PostgreSQL 9.5 实例。如here 所述,我必须指定一个 post- 和一个 prescript 来告诉 Azure:“是的,我已经将 VM 置于一个状态,所以整个 VM/blob 可以作为一个备份可以恢复为工作新 VM 的快照” 和 “现在我完成了”,因此 Azure 会将备份标记为 Application consistent。
就 PostgreSQL 而言,我已阅读 the docs on continuous archiving,它说明了为什么以及如何启用 WAL 归档以允许备份。我的问题来了:
如果我设置archive_mode = on
和wal_level = archive
,我可以将archive_command
留空吗?这是否有意义?或者 - 我应该在此处进行某种归档(例如,将日志段复制到另一个位置/磁盘),并且在我的场景中还原 VM 时确保数据库正常工作是否有必要进行归档?
我只需要告诉 PostgreSQL“等一下 / 保持你的数据写入(或其他任何事情),同时我会创建整个 VM 的快照”。计划是先执行pg_start_backup()
,拍摄快照,然后再执行pg_stop_backup()
。
我确实意识到,这种方法(如果它甚至是有效的)本质上是一个文件系统级别的备份,according to docs,必须关闭 postgres 服务才能使 fs-backup 有效。 Another place 我读到点击pg_start_backup()
应该足以保证有效的独立物理备份。
【问题讨论】:
no - 如果您以后不打算将已保存的 WALS 与 restore_command 一起使用,则不必使用archive_command
@VaoTsun 好的,所以如果我理解正确,WALS 用于实际的连续备份,您可以在其中使用 WALS 修补“完整备份”,以便始终拥有最近的还原点?正如您可能推断的那样,我是深水区的 .NET/Azure 开发人员;)
啊,我只是想我可能会给你不好的建议 :) WAL 用于恢复 - 你 pg_start_backup、复制文件、pg_stop_backup 并开始复制 db - 它会从你复制的 WAL 中读取并如果原始服务器在您复制它们之前删除了 WALS - 恢复应该会失败。事实上,我从未尝试过以这种方式复制 VM :) 让我们等待 smbd 体验
我也从未尝试过,但我想在没有累积 WAL 的情况下尝试启动副本时,您会收到“无效的检查点记录”或类似错误。
【参考方案1】:
如果你打算拍摄的快照是真正原子的,即恢复的快照代表了文件系统在某个时间点的状态,你可以从这样的快照中重新启动数据库,它会执行崩溃恢复并以一致的状态出现。
在这种情况下,无需关心 WAL 归档或备份模式。你可以设置archive_mod = off
,不用担心。
如果快照不是真正的原子,或者您想要 point-in-time-recovery(能够将数据库恢复到备份之间的时间点) ,您需要设置并运行 WAL 归档,因为您需要 WAL 将数据库恢复到一致状态。
在这种情况下,archive_mode
必须是 on
,archive_command
必须是仅当 WAL 文件已成功归档时才返回成功的命令。如果在您上次备份和您想要恢复数据库的时间之间只缺少一个 WAL,它将无法正常工作。
【讨论】:
谢谢你,@Laurenz。我解决这个问题已经有一段时间了,但它以这样的方式结束:我意识到,运行 Linux 的 Azure VM 无法制作原子快照(我认为 AWS 可以这样做,但这是 Azure),而他们的 Windows VM 可以。当时客户可以接受的解决方案是在下班时间非常短暂地关闭 postgres 服务以进行快照(在这种情况下大约需要 5-6 秒)。在此之后,我可以成功恢复 postgres 内容的 fs-backup,因为在服务脱机时文件很明显不会接触 = 而备份正在运行。以上是关于PostgreSQL / WAL-archiving:我可以在进行映像快照备份时将 archive_command 留空吗?的主要内容,如果未能解决你的问题,请参考以下文章
prometheus使用postgresql-adapter连接postgresql
PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库