pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE DATABASE实际上是通过复制一个现有数据库来创建新数据库。默认情况下,它复制名为 template1 的标准系统数据库。因此,该数据库就是创建新数据库时使用的“模板”。如果你向 template1 中添加对象,这些对象也会被复制到以后创建的用户数据库中。这种行为允许对数据库中的标准对象集合进行站点本地修改。例如,如果你将过程语言 PL/pgSQL 安装到 template1 中,那么以后创建用户数据库时无需额外操作,它就会自动可用。
还有第二个标准系统数据库,名为 template0。该数据库包含与 template1 初始内容相同的数据,也就是说,只包含你的PostgreSQL版本预定义的标准对象。在 initdb 之后绝不应当更改 template0。通过指示CREATE DATABASE复制 template0 而不是 template1,你可以创建一个“纯净的”用户数据库,它不包含template1中的任何站点本地附加对象。这在恢复pg_dump转储时特别方便:转储脚本应当恢复到一个纯净的数据库中,以确保重建出被转储数据库的正确内容,而不会与现在可能存在于 template1 中的附加对象发生冲突。
要创建一个通过复制 template0 的数据库,可以使用
CREATE DATABASE dbname TEMPLATE template0;
(在 SQL 环境中),或者
createdb -T template0 dbname
可以创建额外的模板数据库,实际上也可以通过将安装中任意数据库的名称指定为 CREATE DATABASE 的模板来复制它。但重要的是要理解,这(至少目前)并不是一个通用的“COPY DATABASE” 功能。特别地,在复制操作期间,源数据库必须是空闲的(没有正在进行的更改数据的 事务),这一点至关重要。CREATE DATABASE 会检查操作开始时没有其他后端进程(它自己除外)连接到源数据库,但这并不能保证复制进行期间不会发生更改,那样会导致复制出的数据库不一致。因此,我们建议把用作模板的数据库当作只读的。
对每个数据库,pg_database 中都有两个有用的标志列:datistemplate和datallowconn。datistemplate可设置为表明某个数据库将作为CREATE DATABASE的模板。如果设置了该标志,任何拥有CREATEDB权限的用户都可以克隆该数据库;如果未设置,则只有超级用户和数据库拥有者才能克隆它。如果datallowconn为假,则不允许建立到该数据库的新连接(但仅仅把该标志设为假并不会终止已有会话)。为了防止被修改,template0 数据库通常被标记为 datallowconn = false。template0 和 template1 始终都应标记为 datistemplate = true。
准备好模板数据库或对其做任何更改之后,最好在该数据库中执行一次 VACUUM FREEZE 或 VACUUM FULL FREEZE。如果在同一数据库中没有其他打开的事务时执行,就可以保证该数据库中的所有元组都已被“冻结”,不会出现事务 ID 回卷问题。这对于将把 datallowconn 设为假的数据库尤为重要,因为在这样的数据库中将无法对它进行例行的 VACUUM 维护。更多信息见 第 8.2.3 节。
template1 和 template0 除了以下事实之外没有任何特殊地位:template1 这个名字是 CREATE DATABASE 的默认源数据库名,也是 createdb 等多种程序的默认连接数据库。例如,可以删除 template1,然后再从 template0 重新创建它,而不会有任何不良后果。如果有人不小心在 template1 里加入了许多杂项对象,这样做也许是可取的。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。