PostgreSQL: pg_dump + psql与模板创建的区别?

3
我知道有两种方法可以复制数据库。其中一种是将数据库导出为一个巨大的SQL文件,然后将其作为单独的数据库加载:
pg_dump <database> | psql <new database>

另一种方法是将数据库名称作为模板传递给数据库创建参数:
createdb -T <database> <new database>

这两种方法有什么区别呢?使用其中一种是否有任何好处,比如性能方面的提升?
2个回答

5
使用 CREATE DATABASE/createdb 带有模板的方式是一个目录复制,而 pg_dump + psql 需要序列化和反序列化整个数据库,并将其发送到客户端进行一次往返,还必须通过事务和写前日志机制运行所有内容。因此,前者方法应该更快。

缺点是 CREATE DATABASE 在复制时锁定了模板数据库。所以,如果您想创建实时数据库的副本,则这种方法效果可能不佳。但是,如果您想快速复制非活动/模板数据库,则使用 CREATE DATABASE 可能是正确的解决方案。


2
根据当前文档,虽然可以通过将其名称指定为模板来复制除template1之外的数据库,但这并不是一个通用的“复制数据库”工具。主要限制在于,在复制过程中不能连接到模板数据库的其他会话。如果在创建数据库时有任何其他连接存在,则CREATE DATABASE将失败;否则,对模板数据库的新连接将被锁定,直到CREATE DATABASE完成。
除了这个温和的警告,它至少可以追溯到8.2版本以来,您可以使用createdb进行某些更改,例如更改排序规则、编码等(在一定限度内)。
就个人而言,我很难证明使用需要完全锁定数据库的createdb来复制生产数据库的合理性。
我认为另一个主要区别是,“转储和加载”是复制数据库的全面支持方式。此外,如果需要,您可以将转储的副本带到独立的开发计算机上进行测试。(createdb实用程序必须同时访问源和目标。)但我没有使用createdb来进行复制,所以我可能是错误的。

完整的数据库锁足以让我不使用模板创建。感谢提供文档链接。 - Jin Kim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接