Windows Server 2008 R2上的Postgresql 9.0.8物理备份导致“访问被拒绝”

我已经构build了一个脚本来执行PostgreSQL 9pipe理指南(Riggs / Krosing)中的“独立热物理数据库备份”配方,但是我将其修改为Windows Server 2008 R2的Postgresql 9.0.8数据库的物理备份。

对于使用rsync复制所有数据文件(不包括pg_xlog目录)的配方步骤#4我正在使用robocopy.exe(因为rsync是一个* nix实用程序,我正在使用Windows)。 问题是,经常有一个文件不能被复制,导致“访问被拒绝”。 手动复制文件失败,并且在备份脚本失败后很长一段时间 “访问被拒绝” – 所以这不是一个间歇性的问题,可以重新尝试。 该文件只有在重新启动PostgreSQL进程后才能被复制。 这总是一个不同的文件。 最后它是%PGDATADIR%\ 5432 \ base \ 24609 \ 38122。

我想听听你是否已经经历了这个,你做了什么来解决这个问题。 我在考虑:

  1. 备份之前重新启动PostgreSQL服务器(我承认这是一个黑客攻击)
  2. 使用某种可以复制打开文件的工具,如VSHADOW,DISKSHADOW和hobocopy(注意:不是robocopy)
  3. 也许有一些方法来指示PostgreSQL释放所有的锁?
  4. 看起来像添加常规“真空”消除症状

好,首先要把你的食谱收起来。 相反,请阅读有关备份的Postgres手册部分 。 阅读整章 – 时间不长。
(您可能会注意到这本书与本书有一些相似之处 – 大多数Postgres书籍只是本手册的精美版本,但您始终应该从手册中作为您的主要参考)。

我将在下面使用的所有术语都来自手册(所以如果你认为你可以跳过阅读任务,那么你不能 – 如果你这样做的话,你很可能会感到困惑)。


现在为你的实际问题 – 一个Unix解决scheme往往不能直接移植到Windows,这是其中的一种情况:一个* nix系统将愉快地抓取正在被操纵的文件 – Windows引发你所看到的错误。

你如何处理这取决于你在做什么样的备份。

Filesystyem级备份

如果您正在执行“文件系统级备份” ,则必须closures服务器。 完全停止,讨论结束,没有其他select。 数据库必须完全closures,以便这种types的备份是可靠的(如果你得到的备份不可靠有什么意义?)。

连续归档/时间点恢复和从属服务器

如果您在设置时间点恢复和日志传送过程中进行基本备份 ,则有两种select:

  • 无论如何,closures服务器。
  • 使用一个工具,可以复制打开的文件(选项(2)从你的问题)

然后按照时间点恢复/日志传送的其他文档,创build一个从服务器。
当你想把你的数据库服务器复制到磁盘时,只需停止从服务器,备份服务器,然后重新启动服务器 – 全世界都会一直启动主服务器,从服务器会在重启时赶上错过的内容。

您还可以使用基本备份加上您通常发送给从站的滚动事务日志作为可靠的数据库备份。 这似乎是最接近你试图达到你的问题,但我会build议我描述的奴隶备份,而不是 – 更多的好处(你有一个热备用)和较less的主服务器的工作(没有额外检查点以滚动备份的事务日志)。

别的东西

如果没有上述的吸引力,你几乎坚持使用SQL转储 。
有缺点:Postgres必须locking每个表,因为它被转储(这意味着写入您的数据库将被阻止),SQL转储比其他选项更慢。
如果你的数据库是任何真正的大小,我不会build议这种方法。