On this page
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
中存在两个有用的标志:列datistemplate
和datallowconn
。可以将datistemplate
设置为指示数据库旨在作为CREATE DATABASE
的模板。如果设置了此标志,则任何具有CREATEDB
特权的用户都可以克隆该数据库;如果未设置,则只有超级用户和数据库所有者才能克隆它。如果datallowconn
为 false,则将不允许与该数据库构建新连接(但不能仅通过将标志设置为 false 来终止现有会话)。 template0
数据库通常标记为datallowconn = false
以防止对其进行修改。 template0
和template1
都应始终标有datistemplate = true
。
Note
template1
和template0
除了名称template1
是CREATE DATABASE
的默认源数据库名称外,没有任何特殊状态。例如,可以删除template1
并从template0
重新创建它,而没有任何不良影响。如果有人不小心在template1
中添加了一些垃圾,则建议采取这种措施。 (要删除template1
,它必须具有pg_database.datistemplate = false
.)
初始化数据库集群时也会创建postgres
数据库。该数据库是用户和应用程序要连接的默认数据库。它只是template1
的副本,可以根据需要删除并重新创建。