我从 cron 作业(debian“wheezy”上的 Postgres 9.3)每晚运行一次 pg_basebackup,但备份一直失败。它实际上会创建输出,但 .tar 文件已损坏且无法提取。我去了我的日志文件,却发现它是 0 字节。谁能告诉我我的设置有什么问题?为什么日志文件没有保存 pg_basebackup 的输出?
#!/bin/sh
PATH=$PATH:/usr/bin
export PATH
BASEBACKUP_LOG=/var/log/postgresql/basebackup.log
[ -f $BASEBACKUP_LOG ] && mv -f $BASEBACKUP_LOG $BASEBACKUP_LOG.old
BACKUP_PATH=/path/to/backup/$(date +%F)
pg_basebackup -D $BACKUP_PATH -Ft -z -v 2>&1 | ts '%F %T %Z' &> $BASEBACKUP_LOG
我正在阅读 pg_basebackup 行的方式,我认为它应该将 stderr 重定向到 stdout,将组合流通过管道传输到 ts 函数(将时间戳添加到一行)并将其写入 $BASEBACKUP_LOG 的路径。我在这里遗漏了一些明显的东西吗?
根据下面给出的建议,我添加了对 ts 和 pg_basebackup 路径的显式引用(都位于 /usr/bin 中)。行为没有变化。
您
#!/bin/sh
在脚本的 shabang 行中指定。这为您提供了一个 POSIX shell。在 POSIX 样式的 shell 下,您只能指定重定向的数字,如2.7 Redirection节下的文档中所述。&>
是一个“bashism”,显示在io-redirection下的 bash 文档中。这可能会在符合 POSIX 的 shell 下导致未定义的行为
/bin/sh
,并通过shellcheck -s sh
在上述问题中的脚本内容上运行,如SC2039的警告中所述,该警告&>
是非标准的,并且可能在不同的上下文中失败。#!/usr/bin/env bash
如果您指定,或者如果您更改执行重定向的方式,如果您想继续使用#!/bin/sh
shell ,您可能会有更好的运气。至于
$BACKUP_PATH
,您可能需要双引号以防止任何可能发生的通配或分词的怪异,这也可能解释零大小的 tar 文件。希望有帮助。=)
我会这样做
找出 pg_basebackup 的确切位置
然后在您的 cron 作业中添加完整路径
Cron 需要完整路径才能在正确的上下文中执行命令。
更新
不确定这是否会对您有所帮助。这是我通常用来备份数据库的备份命令。
usr/local/bin/pg_dump -Ft -c -p some_port -U 用户名 -h HOST database_name | gzip -9 > SOME_FILE
使用 pg_dump 时请记住以下几点
如果您使用 pg_dump 备份(使用非“普通”格式,即 -Fp,这是默认的),您必须使用pg_restore恢复文件
pg_dump的版本必须更新或等同于您正在备份的服务器的版本。