22.3. 模板数据库

CREATE DATABASE实际上是通过复制现有数据库来工作的。默认情况下,它将复制名为template1的标准系统数据库。 因此,数据库是从中创建新数据库的“模板”。如果将对象添加到template1,这些对象将被复制到随后创建的用户数据库中。此行为允许对数据库中标准对象集进行站点本地修改。例如,如果将程序语言 PL/Perl 安装在template1中,则它将自动在用户数据库中可用,而在创建这些数据库时无需采取任何其他操作。

还有另一个名为template0的标准系统数据库。 该数据库包含与template1的初始内容相同的数据,即,仅包含您的 PostgreSQL 版本 sched 义的标准对象。初始化数据库集群后,切勿更改template0。通过指示CREATE DATABASE复制template0而不是template1,可以创建一个“原始”用户数据库,该数据库不包含template1中的站点本地添加内容。在还原pg_dump转储时,这特别方便:应将转储脚本还原到原始数据库中,以确保重新创建转储数据库的正确内容,而不会与稍后可能添加到template1的对象发生冲突。

复制template0而不是template1的另一个常见原因是,在复制template0时可以指定新的编码和语言环境设置,而template1的副本必须使用与之相同的设置。这是因为template1可能包含特定于编码或特定于语言环境的数据,而template0却不包含。

要通过复制template0创建数据库,请使用:

CREATE DATABASE dbname TEMPLATE template0;

在 SQL 环境中,或者:

createdb -T template0 dbname

从 Shell。

可以创建其他模板数据库,并且确实可以通过将其名称指定为CREATE DATABASE的模板来复制集群中的任何数据库。重要的是要了解,但是,这还不打算用作通用的“ COPY DATABASE”功能。主要限制是在复制源数据库时,无法将其他会话连接到源数据库。如果启动时存在任何其他连接,则CREATE DATABASE将失败。在复制操作期间,将阻止与源数据库的新连接。

每个数据库的pg_database 中存在两个有用的标志:列datistemplatedatallowconn。可以将datistemplate设置为指示数据库旨在作为CREATE DATABASE的模板。如果设置了此标志,则任何具有CREATEDB特权的用户都可以克隆该数据库;如果未设置,则只有超级用户和数据库所有者才能克隆它。如果datallowconn为 false,则将不允许与该数据库构建新连接(但不能仅通过将标志设置为 false 来终止现有会话)。 template0数据库通常标记为datallowconn = false以防止对其进行修改。 template0template1都应始终标有datistemplate = true

Note

template1template0除了名称template1CREATE DATABASE的默认源数据库名称外,没有任何特殊状态。例如,可以删除template1并从template0重新创建它,而没有任何不良影响。如果有人不小心在template1中添加了一些垃圾,则建议采取这种措施。 (要删除template1,它必须具有pg_database.datistemplate = false.)

初始化数据库集群时也会创建postgres数据库。该数据库是用户和应用程序要连接的默认数据库。它只是template1的副本,可以根据需要删除并重新创建。