运行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。
答案 0 :(得分:12)
事实证明,Postgres实际上并不知道问题中提到的错误是相对无害的;这不是错误被忽略的原因。 pg_restore
实际上忽略该错误的原因是因为pg_restore
默认配置为忽略在恢复过程中发生的几乎所有错误。如果您关心还原的成功/失败状态,这可能不是您想要的行为。使用pg_restore
或--exit-on-error
选项运行--single-transaction
可以解决此问题,但也会导致Postgres将上述问题中的错误视为完全致命错误,而不仅仅是警告(因为再一次,它实际上并不知道该特定命令失败是可以的。)
对此最好的解决方案是采取措施防止错误首先发生。在这种情况下,您可以通过dropping tables使用单独的命令执行此操作,然后再运行pg_restore
,并取消--clean
选项。