# 23.3.模板数据库

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

还有第二个标准系统数据库,名为模板0.此数据库包含的数据与数据库的初始内容相同模板1,也就是说,只有您的PostgreSQL版本预定义的标准对象。模板0在初始化数据库群集后,不应更改。通过指导创建数据库抄袭模板0而不是模板1,您可以创建一个“原始”用户数据库(其中不存在用户定义的对象,系统对象也未被更改),其中不包含任何站点本地添加项模板1。这在恢复文件时特别方便垃圾场转储:转储脚本应该在原始数据库中恢复,以确保重新创建转储数据库的正确内容,而不会与可能已添加到数据库的对象冲突模板1过后

复制的另一个常见原因模板0而不是模板1复制时可以指定新的编码和区域设置模板0,而模板1必须使用与之相同的设置。这是因为模板1可能包含特定于编码或特定于语言环境的数据,而模板0我们不知道。

通过复制创建数据库的步骤模板0,使用:

CREATE DATABASE dbname TEMPLATE template0;

来自SQL环境,或者:

createdb -T template0 dbname

从贝壳里。

可以创建其他模板数据库,实际上,可以通过将集群中的任何数据库的名称指定为模板来复制该数据库创建数据库.然而,重要的是要理解,这并不是(尚未)作为一个通用的。”复制数据库“设施。主要的限制是,在复制源数据库时,不能将其他会话连接到源数据库。创建数据库如果启动时存在任何其他连接,则将失败;在复制操作期间,将阻止与源数据库的新连接。

中存在两个有用的标志pg_数据库对于每个数据库:列datistemplatedatallowconn. datistemplate可以设置为指示数据库将用作创建数据库。如果设置了此标志,则任何具有CREATEDB特权;如果未设置,则只有超级用户和数据库所有者才能克隆它。如果datallowconn如果设置为false,则不允许与该数据库建立新连接(但不能通过简单地设置false来终止现有会话)。这个模板0数据库通常被标记datallowconn=false防止它被修改。二者都模板0模板1应始终标记为datistemplate=true.

# 笔记

模板1模板0除了名字之外,没有任何特殊的身份模板1是的默认源数据库名称创建数据库.例如,一个人可能会摔倒模板1然后从模板0没有任何不良影响。如果一个人不小心在文件中添加了一堆垃圾,那么这种做法可能是可取的模板1(删除)模板1一定有pg_数据库。datistemplate=false.)

这个博士后数据库集群初始化时也会创建数据库。该数据库是供用户和应用程序连接的默认数据库。这只是一份模板1如有必要,可以删除并重新创建。