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


跑步时 pg_restore --clean --dbname=my_database backup_file.sql 要将数据库转储还原到空数据库,还原会成功,但会显示以下警告消息:

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

如消息所示,恢复成功。有错误,但是 pg_restore 声称忽略了他们。我还能够手动查询数据库,以验证恢复后我预期在转储中的所有数据是否都存在于数据库中。

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

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

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


9040
2017-08-21 19:04


起源

只需添加 --clean 选项对我有帮助。我试图用bash读取退出状态 $?。什么时候运行它没有 --clean 选项, $? 回 1,而运行它 --clean 选项 $? 回 0 - Manoj


答案:


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

解决此问题的最佳方法是采取措施防止错误发生。在这种情况下,你可能会这样做 丢桌子 在运行之前使用单独的命令 pg_restore,离开了 --clean 选项。


11
2017-08-21 20:55



如何从上面的命令中获取返回值? - Manoj
@Manoj在* nix系统中,退出状态存储在 $? 变量。 - Ajedi32