我一直在尝试为一个简单的、测试性的 PostgreSQL 9.0 数据库设置连续归档,按照文档。在 postgres.conf 中我设置了:
wal_level = archive
archive_mode = on
archive_command = 'touch /home/myusername/backup/testtouch'
archive_timeout = 30s
...并重新启动 PostgreSQL。touch 列出的文件从未出现。我可以手动运行 touch 命令,它按预期工作。
如果我尝试创建备份,它会永远等待 archive_command。在 psql 中;
postgres =#SELECT pg_start_backup('touchtest');
pg_start_backup
-----------------
0/14000020(1行)postgres=# SELECT pg_stop_backup();
注意:pg_stop_backup 清理完成,正在等待所需的 WAL 段被归档 > 警告:pg_stop_backup 仍在等待所有所需的 WAL 段被归档(已过 60 秒)
提示:检查 archive_command 是否正确执行。pg_stop_backup 可以安全地取消,但如果没有所有 WAL 段,数据库备份将不可用。
是什么原因造成的?我该如何解决?
附加信息:在 CentOS 5.4 上运行。以 root 身份安装 PostgreSQL 9.0.2。
更新:我首先尝试使用两者进行存档cp -i %p /home/myusername/backup/%f </dev/null
,以test ! -f /home/myusername/backup/%f && cp %p /home/myusername/backup/%f
匹配手册。我将其简化为更简单的触摸呼叫以进行故障排除。
答案1
Postgres 配置看起来正确
CentOS 默认将用户目录模式设置为 700,因此请检查是否确实如此,以及您是否可以使用 su 以 root 用户身份接触该文件
su - postgres -c "touch /home/myusername/backup/testtouch"
如果确实有效,则尝试在 postgres 中使用详细日志记录并检查 postgres 日志中是否存在进一步的错误。
答案2
您的存档命令需要包含更多信息。
在 archive_command 中,%p 被替换为要存档的文件的路径名,而 %f 仅被替换为文件名。(路径名是相对于当前工作目录,即集群的数据目录。)
archive_command = '复制“%p”“C:\ server \ archivedir \%f”'#Windows
总之,在我看来(不熟悉 CentOS 的 touch 命令),您并没有在存档命令脚本中包含变量。请记住,要存档的日志文件的文件名永远在变化。存档命令还需要知道您要将文件存档到哪里。