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创建数据库,可在 SQL 环境中使用:
CREATE DATABASE dbname TEMPLATE template0;
或在 shell 中使用:
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。如果在同一数据库中没有其他打开的事务时执行 该操作,就能保证该数据库中的所有行都已被“冻结”,不会受到事务 ID 回卷问题的影响。对于将被设置datallowconn为假的数据库来说, 这一点尤其重要,因为在那样的数据库中将无法进行例行的维护性 VACUUM。更多信息见第 21.1.3 节。
template1和template0除了template1这个名字是CREATE DATABASE的默认源数据库名、也是createdb等各类程序默认连接的template1之外,并无任何特殊地位。例如,可以删除template1,然后再从template0重新创建它,而不会有任何不良后果。如果有人不小心在template1里加入了许多杂项对象,这样做也许是可取的。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。