我是一名开发人员,对数据库管理几乎一无所知。刚才我一直在尝试仔细检查数据库更新脚本(我基本上可以管理它),因为它做了一些事情,所以我想做一个备份,这样如果它坏了,我可以恢复,修复脚本,然后重试,而不必担心手动撤消部分架构更改。
让我困惑的是,在完成几个ALTER TABLE
步骤后,我的更新脚本确实失败了,当我进行恢复时,我收到各种错误(来自不相关的表),关于重复键、空约束违规等。此外,我的脚本所做的架构更改显然没有通过恢复来撤消。
所以在我看来,我一定是误解了转储/恢复过程的一些基本方面。我所做的就是用“pg_dump”创建数据库的备份文件,然后将其反馈给“psql”。它大多一切正常,除了一些错误,以及如我所说,无法将架构本身恢复到以前的状态。难道它根本就没有尝试这样做吗?是否有一个可以遵循的过程可以实现我所期望的(即完全恢复到以前的状态)?
我是唯一使用这个数据库的人;它是我工作站上的本地服务器,因此当我做我的事情时,其他开发人员不会弄乱它。
如果重要的话,这是 Ubuntu Linux(natty)机器上的 postgresql 8.4。
答案1
您错过的要点是,除非您的 pg_dump 命令包含-c
选项(clean
-在创建对象之前删除对象),否则您需要在恢复之前删除所有表。
pg_dump
生成 SQL 来重新创建表并将数据加载回其中,但如果表已经存在,则命令CREATE TABLE
将失败(这就是为什么您的模式没有恢复到您预期的状态),并且如果表中已经有数据,您最终会得到重复的行,或者大量关于重复键的错误(取决于键是否已定义)。
你应该花点时间坐下来,阅读并理解Postgres 关于备份/恢复的文档和pg_dump 手册页。事实上,我建议你阅读 Postgres 文档,了解你对哪些方面没有 100% 的把握,或者在邮件列表中提问。Postgres 文档质量非常好,我认为它和FreeBSD 使用手册作为文档类型的示例全部开源项目应该努力产生...
答案2
pg_dump -c 方法的替代方法是使用 pg_restore --clean。
我们使用 pg_dump -Fc,它禁止使用 -c。