在PostgreSQL上只有文件系统备份的问题?

我在亚马逊云中运行我的数据库服务器,并在单独的EBS卷上有数据库文件。 当涉及到备份/恢复操作时,我发现只需执行文件系统级备份而不是sql转储就简单多了,因为我可以立即创build备份并从中进行恢复。

如果我坚持仅使用文件系统级备份,是否有可能忽略的问题?

在Ubuntu 12.04上运行PostgreSQL 9.1(今年晚些时候更新到9.3)

如果我坚持仅使用文件系统级备份,是否有可能忽略的任何问题?

是的 – 但不是你想的那个。 只要你做文件系统级别的拷贝权利是安全的,那就是依赖物理备份就是风险。

在写这篇文章时,我注意到文件系统级备份的章节需要更新,以指向pg_basebackuppg_start_backup() 。 虽然技术上来说,stream复制和PITR的一部分,但这些工具只是制作安全,一致的文件系统级副本的方法,应在文档的该部分中引用。

这样做安全

根据PostgreSQL文件系统级备份的文档以及做一个基础备份 ,只要你按照给定的规则进行文件系统级拷贝是非常安全的,即执行以下操作之一:

  • 在备份之前停止服务器并将其closures直到备份完成;

  • 使用pg_basebackup ;

  • 使用pg_start_backup()pg_stop_backup() 并复制pg_stop_backup()生成的文件 ; 要么

  • 使用primefaces文件系统快照并从快照中复制,在这种情况下没有任何东西可以写入,因为它是一个快照。

你也可以使用pg_basebackup -X stream ,这是我的首选。 它使用复制协议来执行文件系统级副本,照顾pg_start_backup()等。

物理备份具有可用作时间点恢复基础的主要优点。

快照的情况是安全的,因为它就像一个崩溃。 没有文字logging,数据库状态在特定时刻被捕获。 预写日志包含所有已提交的事务数据,因此在DB恢复时,从数据库中重新启动尚未刷新到堆中的任何数据。 这就像在崩溃后启动。 如果您正在复制仍在写入的实时数据库目录,则只需要pg_start_backup()和好友; 快照避免了这一点。

请注意, 如果快照实际上是primefaces级的 ,那么依靠快照仅是安全的 ,即它在一个瞬间捕获文件系统状态。 如果只涉及一个卷/文件系统,也是安全的 – 不能使用两个独立文件系统的两个快照进行备份,它们将不会在同一瞬间完成。 如果使用表空间,快照备份是不安全的,但是pg_basebackuppg_start_backup() ,rsync, pg_stop_backup()仍然是安全的。

这意味着如果你的数据库文件系统是在一个md RAIDarrays中的(比如说)四个EBS卷,或者你有一个用于pg_xlog而另一个用于数据库的其余部分,那么你不能使用EBS快照进行一致的备份。 如果一切都是一个EBS卷,则EBS快照是安全的。

您也可以在运行备份之前停止PostgreSQL,然后启动它。 如果您是能够承受备份停机时间的幸运者之一,那很酷。 我个人更喜欢热备份。

风险

真正需要关注的问题是,当您进行物理备份时,您会复制未经validation的数据库结构。 如果没有检测到腐败,那么您的备份可能比您想象的要less得多。 我个人也会使用逻辑转储。

一个有用的折中可以是一旦你做了副本,启动你的文件系统级备份,然后从文件系统级备份做一个pg_dump 。 这确保了它的可读性,并给你一个逻辑副本。 如果您的逻辑转储失败,您的自动化应该通过电子邮件发送给您,并尖叫寻求帮助,因为这表明您的物理副本可能也会被损坏。

顺便说一句,我前一阵子写了一堆关于避免数据丢失/腐败的问题 – 请参阅避免PostgreSQL数据库损坏 。

如果您完全closuresPostgres,则可以执行可靠的文件系统备份,然后在Postgresclosures时执行备份。 备份完成后,启动Postgres。

如果Postgres在备份期间运行,所有投注都closures。

最好是在“Postgres”数据库备份中进行上述操作。