关于postgresql:如果成功有时导致退出代码为1,我如何可靠地确定pg_restore是否成功?

How do I reliably determine whether pg_restore succeeded, when success sometimes results in an exit code of 1?

运行pg_restore --clean --dbname=my_database backup_file.sql将数据库转储恢复到空数据库时,恢复成功,但出现以下警告消息:

1
2
3
4
5
6
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error FROM TOC entry 161; 1259 16549 TABLE example_table root
pg_restore: [archiver (db)] could NOT EXECUTE query: ERROR:  TABLE"example_table" does NOT exist
    Command was: DROP TABLE public.example_table;

WARNING: errors ignored ON restore: 1

如消息所示,还原成功。有些错误,但江户十一〔一〕声称忽略了这些错误。我还能够手动查询数据库,以验证在还原之后,我希望在转储中的所有数据都存在于数据库中。

问题是上述命令已退出,状态为1,而不是0。当以编程方式执行数据库还原时(正如我在自动化此过程时打算做的那样),这是有问题的,因为我的脚本需要能够可靠地确定还原是否成功。

有没有办法让pg_restore在确定退出状态时忽略警告?或者,是否有其他方法可以替代pg_restore,我可以使用它从中获得更准确的成功/失败信息?如何还原数据库并以编程方式可靠地确定还原是否成功?

请注意,我目前正在使用PostgreSQL 9.1。


事实证明,Postgres并不真正知道问题中提到的错误是相对无害的;这并不是忽略错误的原因。pg_restore实际忽略该错误的原因是,pg_restore默认配置为忽略还原过程中发生的几乎所有错误。如果您关心恢复的成功/失败状态,那么这可能不是您想要的行为。使用--exit-on-error--single-transaction选项运行pg_restore可以解决这一问题,但也会导致postgres将上述问题中的错误视为完全致命错误,而不仅仅是警告(因为它实际上不知道特定命令失败是可以的)。

最好的解决方案是首先采取措施防止错误发生。在这种情况下,您可能需要在运行pg_restore之前使用一个单独的命令删除表,并去掉--clean选项。