如何检查postgresql备份是否成功?

7
我们有一个PostgreSQL数据库,每晚都会从cron作业中备份,使用以下命令:
su postgres -c "pg_dump our_database | gzip > /home/smb/shared/database_backup.bak.gz"

最近我们遇到了一个磁盘故障,起初只有几个坏扇区,在此期间,pg_dump退出并显示以下错误:

pg_dump: SQL command failed
pg_dump: Error message from server: ERROR: catalog is missing 17 attribute(s) from relid 20158
pd_dump: The command was: LOCK TABLE public.obvez IN ACCESS SHARE MODE

由于它是在cron作业中运行的,所以没有人注意到错误消息,备份被中断了,但它不是0大小,一切看起来都很好,直到最终磁盘故障时我们才意识到我们没有备份。

我们设法从旧备份中恢复了数据,但现在我想知道检查pg_dump是否成功完成其工作的正确方法是什么?


你应该在http://DBA.stackexchange.com上提问,而不是在StackOverflow上。StackOverflow是用于编程的。 - Jonas
@Jonas 这个应该留在这里。OP正在寻找一种检查错误的方法。他试图自动化数据库,但这也可以适用于几乎任何事情,所以我不明白为什么要将其移动到DBA。 - alexandernst
2个回答

10
我会把结果写入日志文件,然后在cronjob结束时将日志文件的内容发送到我的电子邮件地址。这样,当出现问题时,我就会知道发生了什么。
su postgres "pg_dump our_database 2>> $LOG_FILE | gzip > /home/smb/shared/database_backup.bak.gz"
cat $LOG_FILE | mailx $MAINTAINERS -s "Postgresql backup"
补充说明:如果你只想在发生错误时发送电子邮件,可以检查pg_dump的返回代码:
LOG_FILE=/tmp/pgdump.err

if ! pg_dump -U backupuser "our_database" 2> $LOG_FILE 
then 
    cat $LOG_FILE | mailx 'youremailaddress' -s "Postgresql backup failure!"
fi

1
问题在于这个数据库实际上在客户的现场,我相信他们会知道如何读取日志文件。我想我可以修改它,只有在出现问题时才发送电子邮件。 - Dragan Matic
1
@Dragan Matic:啊,你在原始消息中没有说明这一点。我已经扩展了示例,只有当pg_dump返回的结果不是"0"(表示成功)时才发送邮件。另外,你应该考虑使用一个专门的“备份用户”来进行备份,并使用.pgpass而不是sudo。嗯,至少,如果可以避免的话,我不喜欢使用sudo ;) - Berry Langerak

0
有些程序在类Unix系统上使用管道时表现不友好。例如,我正在使用通过gzip传输的pg_dump命令,如下所示:
破损的脚本:错误条件从未发生过
export PGPASSWORD=secret
pg_dump -h host -U user db | gzip - > backup.sql.gz

if [ $? -ne 0 ]; then
    ### Never happens: gzip never fails! ###
    echo Backup failed.
    exit 1
fi

这个使用了检查前一个命令的退出状态($?)的常规方法,但是它不起作用。如果pg_dump因任何原因失败,gzip不会返回任何错误响应。$?被设置为0,表示成功。

幸运的是,有一种更好的方法。在bash中,PIPESTATUS环境变量是一个数组,包含了最后一个管道中执行的所有命令的返回代码。现在可以像这样检查整体返回状态和pg_dump的状态:

正确的脚本:分别检查pg_dump的结果

export PGPASSWORD=secret
pg_dump -h host -U user db | gzip - > backup.sql.gz

if [ $? -ne 0 -o ${PIPESTATUS[0]} -ne 0 ]; then
    echo Backup failed.
    exit 1
fi

现在我可以确信我的自动化数据库备份不会默默失败了。
来源:https://mattryall.net/blog/piped-exit-status

1
你应该添加解释。 - Super Kai - Kazuya Ito
1
你应该加上解释。 - undefined
好的,我已经添加了解释。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接