什么是PostgreSQL模板?

2020-07-10 00:22:03

无论何时在Postgres中创建新数据库,实际上都是基于集群中已经存在的数据库。

这个数据库template1和另一个称为template0的数据库是存在于每个新创建的数据库集群中的标准系统数据库。你不相信我吗?为什么不快速启动一个数据库,并使用下面的查询亲自查看它:

在这篇文章中,我们将探索这些模板数据库,看看如何才能充分利用它们的潜力。我们甚至会研究创建我们自己的模板数据库。

只需从数据库模板1复制所有内容。我们可以通过任何方式修改此模板数据库:添加表、插入一些数据、创建新的扩展或安装过程语言。这些操作中的任何一个都将传播到随后创建的数据库。

然而,这是不可取的。删除这些修改中的任何一个都需要您从模板1手动卸载或删除这些更改。您确实可以选择删除并完全重新创建整个template1数据库。不幸的是,这会冒着在此过程中犯错误的风险,从而有效地破坏CREATE DATABASE。最好不要使用template1,而创建您自己的模板数据库。

这样做允许任何具有CREATEDB特权的用户或角色将其用作模板。如果不允许,则只允许数据库的超级用户或所有者执行此操作。

有了这一点,您现在可以拥有定制的模板,而无需担心污染模板1。

您可以安全地删除整个自定义模板数据库,而不会有中断CREATE DATABASE的风险。

要从自定义模板数据库正确创建数据库,不应存在其他连接。如果查询开始时存在任何连接,则CREATE DATABASE立即失败。

因此,如果您希望在保持连接的同时复制数据库(例如,生产数据库),那么使用postgres实用程序pg_dump会更理想。

模板0包含与模板1相同的数据。如果template1发生任何不可逆的情况,我们可以将此模板数据库视为后备。因此,一旦初始化数据库集群,就不应该以任何方式修改此模板数据库。要创建以template0作为模板数据库的数据库,请执行以下操作:

如果template1出现任何问题,可以删除它,然后使用template0作为模板数据库重新创建它。

我们还可以创建一个干净的数据库,该数据库不包含Template1中存在的任何修改。这在从pg_dump恢复时非常有用。由转储中不存在的修改带来的任何冲突都将被消除。

模板0可用于指定新编码。正如本文所指出的,使用template1和新编码创建新数据库将导致错误。

为了快速总结,我们发现默认情况下,新数据库是从一个名为template1的模板数据库创建的。模板1可以按照我们喜欢的任何方式进行修改,并且这些更改将出现在随后创建的任何数据库中。我们还可以创建自定义模板数据库,并基于它们创建新数据库。如果出现问题,Template0总是在那里提供帮助。