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

标签 postgresql postgresql-9.1

当运行 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。

最佳答案

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

解决此问题的最佳方法是首先采取措施防止错误发生。在这种情况下,您可能会通过 dropping tables 来完成此操作在运行 pg_restore 之前使用单独的命令,并保留 --clean 选项。

关于postgresql - 当成功有时导致退出代码为 1 时,我如何可靠地确定 pg_restore 是否成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32147653/

相关文章:

postgresql - 将字符串时间戳转换为日期

sql - 按聚合 (ARRAY_AGG) 聚合?

python - 在 Django JSONField 中过滤列表项

node.js - 身份验证无法将 node.js 与 PostgreSQL 连接起来

regexp_matches - 错误 : invalid regular expression: quantifier operand invalid

java - 在postgreSQL驱动程序中打印PreparedStatement

postgresql - 当记录的 tenant_id 更新时,用 citus 数据组织分片

sql - 未找到 Postgresql 列,但在描述中显示

PostgreSQL isset 函数

postgresql - postgres 将数据库复制到另一台服务器可减少数据库大小