当运行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个用户忽略警告?或者,我是否可以使用其他方法来获得更准确的成功/失败信息?如何恢复数据库并以编程方式可靠地确定恢复是否成功?

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

推荐答案

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

解决这个问题的最佳方法是首先采取措施防止错误发生.在这种情况下,在运行pg_restore之前,您可能需要使用一个单独的命令执行dropping tables次,而不使用--clean选项.

Postgresql相关问答推荐

可以向判断枚举值的SQL列添加约束吗?

如何在PostgreSQL中以行值的形式获取列

多克.波斯格雷斯.PgAdmin4

Jsonb[]字段中的PostgreSQL否定&q;-0.0

如何在PostgreSQL中更改分区的表空间?

数组格式类型的PostgreSQL日期

尽管违反了部分索引约束,Postgres 插入仍在发生

如何准确确定边界附近的点和地理的 ST_Intersects(ST_Intersects geography vs. Geometry diffrepancy)

ST_Intersects 太慢

如何在 sequelize 使用 db postgres 中通过外键更新记录和更新包含许多记录关系

如何将 grafana 与 Google Cloud SQL 集成

在 Ubuntu 11.04 服务器中启用对 postgresql 的 PHP 支持

Postgresql SERIAL 的工作方式是否不同?

datagrip 无法应用更改 此表是只读的

Rails 4 迁移: has_and_belongs_to_many table name

SQL Select 一列中具有重复值的所有行

从长时间的postgres转换日期

如何从 CSV 为 PostgreSQL 副本生成模式

如何更改 PostgreSQL 中的日期样式?

Postgresql:备份所有表 struct ,但只备份少数数据表