当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是不是成功?
Posted
技术标签:
【中文标题】当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是不是成功?【英文标题】:How do I reliably determine whether pg_restore succeeded, when success sometimes results in an exit code of 1?当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是否成功? 【发布时间】:2015-11-15 19:57:18 【问题描述】:运行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。
【问题讨论】:
添加--clean
选项对我有帮助。我试图使用$?
读取bash 中的退出状态。在不使用 --clean
选项运行时,$?
返回 1
,而使用 --clean
选项运行时 $?
返回 0
【参考方案1】:
原来 Postgres 实际上并不知道问题中提到的错误是相对无害的;这不是错误被忽略的原因。 pg_restore
实际上忽略该错误的原因是因为 pg_restore
默认配置为忽略在还原过程中发生的几乎所有错误。如果您关心恢复的成功/失败状态,这可能不是您想要的行为。使用 --exit-on-error
或 --single-transaction
选项运行 pg_restore
可以解决这个问题,但也会导致 Postgres 将上述问题中的错误视为完全致命的错误,而不仅仅是警告(因为再次,它不会实际上知道该特定命令失败是可以的)。
对此的最佳解决方案是首先采取措施防止错误发生。在这种情况下,您可能会在运行 pg_restore
之前通过 dropping tables 使用单独的命令执行此操作,并放弃 --clean
选项。
【讨论】:
以上是关于当成功有时会导致退出代码为 1 时,如何可靠地确定 pg_restore 是不是成功?的主要内容,如果未能解决你的问题,请参考以下文章