困惑于postgresql备份/恢复和模式更改/恢复

我是一个开发人员,他们几乎完全不了解数据库pipe理。 刚才我一直在试图检查数据库更新脚本(一般我可以pipe理的东西),并且因为它做了一些事情,我想做一个备份,以便如果它被破坏,我可以恢复,修复脚本,并再次尝试,而不必担心手动不执行部分模式更改。

那么混淆了我的事情是,我的更新脚本之后确实失败了通过几个ALTER TABLE步骤后,当我做恢复时,我得到各种错误(从不相关的表)关于重复键,空约束违规,等等。 此外,架构更改我的脚本显然不是未完成恢复。

所以在我看来,我必须误解转储/恢复过程的一些基本方面。 我所做的只是用“pg_dump”创build数据库的备份文件,然后反馈给“psql”。 除了一些错误,正如我所说的,它大部分都是有效的,但是没有把模式本身恢复到原来的状态。 它是不是试图做到这一点? 是否有一个过程遵循,将做我所期待的(也就是完全恢复到原来的状态)?

我是唯一使用这个数据库的人; 这是我的工作站上的本地服务器,所以当我正在做我的事情时,并不像其他开发人员那样乱搞。

这是Ubuntu Linux(natty)机器上的postgresql 8.4,如果有关系的话。

你错过的要点是,除非你的pg_dump命令包含-c选项( clean – 在创build它们之前删除对象),你需要在还原之前删除所有的表。
pg_dump生成SQL来重新创build表并重新载入数据,但是如果表已经存在, CREATE TABLE命令将失败(这就是为什么你的模式没有恢复到你所期望的),如果已经存在表格中的数据会包含重复的行,或者包含大量关于重复键的错误(取决于键是否定义)。

您应该花一些时间坐下来,阅读并理解备份/恢复的Postgres文档以及pg_dump手册页 。 事实上,我会build议您阅读Postgres的文档,以了解哪些地方不是100%自信,和/或在邮件列表上提问。 Postgres文档的质量非常好,我把它和FreeBSD手册一起作为所有开源项目应努力生成的文档的一个例子。

pg_dump -c方法的替代方法是使用pg_restore –clean。

我们使用pg_dump -Fc来排除使用-c。