Postgresql模板数据库之template1 和 template0
一、简介
template1和template0是PostgreSQL的模板数据库。所谓模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库设置和数据文件。PostgreSQL安装好以后会默认附带两个模板数据库:template0和template1。
PostgreSQL默认初始化数据库后,模板数据库template0和template1包含的内容是一致的。在PG中创建数据库时,默认是从template1模板数据库中克隆出来的!

我们知道创建数据库时的语法为:

如:create database aaaa with template='template0' encoding ='UTF8' lc_collate='C' lc_ctype='en_US.utf8' owner='test123'; 其中template表示模板数据库。建库时如果不指定 TEMPLATE 属性,默认用的是 template1 模板库。
二、template1和template0的区别是什么?1、template1 可以连接,template0 不可以连接。

2、使用 template1 模板库建库时不可指定新的 encoding 和 locale,而 template0 可以。这里的“新的”指的是非UTF8,使用\l 命令查看template0和template1的encoding和locale

我们看到template0和template1的encoding是UTF8、Collate为en_US.utf8、Ctype为en_US.utf8。
注:template0和template1都不能被删除(需要特殊手段)。
三、怎么创建模板数据库?
1、除了template0和template1,能指定is_template创建自定义模板库。
create database lhrtmpdb with template template0 lc_collate 'en_US.utf8' lc_ctype 'en_US.utf8' is_template=true;
2、如何删除刚创建模板数据库?
解决需要先把模板库改成普通库再删除。

四、模板template1
在PG中创建数据库时,默认是从template1模板数据库中克隆出来的!
CREATE DATABASE实际上通过拷贝一个已有数据库进行工作。默认情况下,它拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的“模板”。 如果你为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。 这种行为允许对数据库中标准对象集合的站点本地修改。例如,如果你把过程语言PL/Perl安装到 template1中,那么你在创建用户数据库后不需要额外的操作就可以使用该语言。
五、总结
CREATE DATABASE实际上通过拷贝一个已有数据库进行工作。默认情况下,它拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的“模板”。 如果你为template1数据库增加对象,这些对象将被拷贝到后续创建的用户数据库中。 这种行为允许对数据库中标准对象集合的站点本地修改。例如,如果你把过程语言PL/Perl安装到 template1中,那么你在创建用户数据库后不需要额外的操作就可以使用该语言。 系统里还有名为template0的第二个标准系统数据库。 这个数据库包含和template1初始内容一样的数据,也就是说,只包含你的PostgreSQL版本预定义的标准对象。 在数据库集簇被初始化之后,不应该对template0做任何修改。 通过指示CREATE DATABASE使用template0取代template1进行拷贝, 你可以创建一个“原始的”用户数据库(其中不存在用户定义的对象,并且系统对象没有被改变),它不会包含任何template1中的站点本地附加物。 这一点在恢复一个pg_dump转储时非常方便:转储脚本应该在一个原始的数据库中恢复以确保我们重建被转储数据库的正确内容,而不和任何现在可能已经被加入到template1中的附加物相冲突。
另一个从template0而不是template1复制的常见原因是, 可以在复制template0时指定新的编码和区域设置,而一个template1的副本必须使用和它相同的设置。这是因为的template1可能包含编码相关或区域相关的数据,而template0中没有。
要通过拷贝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。
六、注意
除了template1是CREATE DATABASE的默认源数据库名之外, template1和template0没有任何特殊的状态。例如,我们可以删除template1然后从template0重新创建它而不会有任何不良效果。如果我们不小心在template1中增加了一堆垃圾,那么我们就会建议做这样的操作(要删除template1,它必须有pg_database.datistemplate = false)。 当数据库集簇被初始化时,也会创建postgres数据库。这个数据库用于做为用户和应用连接的默认数据库。它只是 template1的一个拷贝,需要时可以删除并重建。
Postgresql模板数据库之template1 和 template0的更多相关文章
- PostegreSQL模板数据库
模板数据库 模板数据库就是创建新database时,PostgreSQL会基于模板数据库制作一份副本,其中会包含所有的数据库设置和数据文件. CREATE DATABASE 实际上是通过拷贝一个现有的 ...
- postgres模板数据库
CREATE DATABASE 实际上是通过拷贝一个现有的数据库进行工作的.缺省时,它拷贝名为 template1 的标准系统数据库.所以该数据库是创建新数据库的"模板".如果你给 ...
- PostgreSQL 管理数据库
管理数据库每个正在运行的PostgreSQL 服务器实例都管理着一个或多个数据库.因此,在组织SQL对象(“数据库对象”)的层次中,数据库位于最顶层. 本章描述数据库的属性,以及如何创建.管理.删除它 ...
- postgresql查看数据库占用的物理存储空间大小
1.手动查看: 查看数据库postgres的oid postgres=# SELECT oid from pg_database where datname='postgres'; oid------ ...
- postgresql 查看数据库,表,索引,表空间以及大小
转载 http://blog.51yip.com/pgsql/1525.html 1,查看数据库 playboy=> \l //\加上字母l,相当于mysql的,mysql> show d ...
- POSTGRESQL 查看数据库 数据表大小
1.查看数据库大小: select pg_database_size('log_analysis'); select pg_database_size('log_analysis'); pg_data ...
- PostgreSQL 创建数据库
PostgreSQL 创建数据库可以用以下三种方式: 1.使用 CREATE DATABASE SQL 语句来创建. 2.使用 createdb 命令来创建. 3.使用 pgAdmin 工具. CRE ...
- PostgreSQL 删除数据库
PostgreSQL 删除数据库可以用以下三种方式: 1.使用 DROP DATABASE SQL 语句来删除. 2.使用 dropdb 命令来删除. 3.使用 pgAdmin 工具. 注意:删除数据 ...
- SQLite vs MySQL vs PostgreSQL:关系型数据库比较
自1970年埃德加·科德提出关系模型之后,关系型数据库便开始出现,经过了40多年的演化,如今的关系型数据库种类繁多,功能强大,使用广泛.面对如此之多的关系型数据库,我们应该如何权衡找出适合自己应用场景 ...
- postmaster - PostgreSQL多用户数据库服务器
SYNOPSIS postmaster [ -A 0 | 1] [ -B nbuffers] [ -c name=value] [ -d debug-level] [ -D datadir] [ -F ...
随机推荐
- 全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决
目录 全网最全的linux上docker安装oracle的详细文档,遇到了n个问题,查了几十篇文章,最终汇总版,再有解决不了的,私聊我,我帮你解决 1. 拉取阿里镜像oracle 2. 创建初始化数据 ...
- (小白向)2020-12-18 中国大学MOOC第十二讲-动态变量应用
1创建单向链表(10分) 问题描述:根据随机输入的若干非零整数,以数字0结束:建立一个新链表. 输入:随机输入若干个整数,以数字0结束 输出:新建链表中个节点的值,数字间没有间隔字符. 样例:输入 5 ...
- Java开发学习(四十九)----MyBatisPlus更新语句之乐观锁
1.概念 在讲解乐观锁之前,我们还是先来分析下问题: 业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售,为了能保证每个商品或者票只能被一个人购买,如何保证不会出现超买或者重复卖 对于这一类 ...
- css预处理器scss/sass语法以及使用
scss scss在css基础语法上面增加了变量 (variables).嵌套 (nested rules).混合 (mixins).导入 (inline imports) 等高级功能,使用scss可 ...
- 【白话模电1】PN结与二极管
距离上一次写半导体,已经过了很久了,上次分享了本征半导体的基本概念: https://zhuanlan.zhihu.com/p/109483580 今天给大家聊聊半导体工业中的基础:PN结与二极管 1 ...
- P4711 「化学」相对分子质量 代码
#include <bits/stdc++.h> using namespace std; double ret=0; namespace StringUtils { pair<st ...
- Redis+Hbase+RocketMQ 实际使用问题案例分享
需求 将Hbase数据,解析后推送到RocketMQ. redis使用list数据类型,存储了需要推送的数据的RowKey及表名. 简单画个流程图就是: 分析及确定方案 Redis 明确list中元素 ...
- Flutter 3.7 新特性:介绍后台isolate通道
Flutter 3.7 发布,本人对其中后台 isolate 通道比较感兴趣,迫不及待翻译了下Aaron Clarke文章,第一次翻译,有不足地方欢迎各位大佬们评论区指正,我将持续更新到本文,谢谢. ...
- Unity之详解Texture
[Texture]详解什么是Texture 前言 开篇废话 嗨咯大家好呀,时隔多日,小黑又和大家见面咯,最近懒癌犯了,而且技术上边倍受打击,所以回了家只想着睡觉休息,所以希望大家见谅见谅啦. Unit ...
- 基于遗传算法的地图四色原理绘图上色的Python代码
本文介绍利用Python语言,实现基于遗传算法(GA)的地图四色原理着色操作. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个由多个小图斑组成的矢量图层,如下图所示. ...