注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL:深入理解 template1 和 template0  

2014-02-19 14:00:45|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

            了解 PostgreSQL 的人肯定听过 template1 和 template0,这两个作为模板库,
在建库的时候会用到,但这两者是有很大差别的,曾经一段时间对这两个模板库的使
用比较模糊,今天再次查看了文档,决定通过实验记录下来。

一 关于默认模板库
--1.1 默认模板库为 template1
 postgres=# create database db1;
CREATE DATABASE
备注:建库时如果不指定 TEMPLATE 属性,默认用的是 template1 模板库.

--1.2 手工指定模板库
 postgres=# create database db2 template template0;
CREATE DATABASE
备注:也可以指定模板库为 template0


二 template1 和 template0 的区别?

         数据库初始化之后, 就有了 template0, template1 库,开始时这两个库的内容是一样的,
但这两个库有啥异同呢?

--2.1 template1 可以连接并创建对象,template0 不可以连接
 postgres=# \c template1
You are now connected to database "template1" as user "postgres".

template1=# create table tmp_1( id int4);
CREATE TABLE

template1=# \c template0
FATAL:  database "template0" is not currently accepting connections
Previous connection kept
备注:当然可以通过其它方法连接 template0 库,有兴趣的同学自己研究下,这里不演示了。
            正因为 template1 可以创建对像,相比 template0 ,被称为非干净数据库,而 template0
            被称为干净的数据库。

--2.2 使用 template1 模板库建库时不可指定新的 encoding 和 locale,而 template0 可以
 template1=# create database db3 TEMPLATE template0 ENCODING 'SQL_ASCII' ;
CREATE DATABASE

template1=# create database db4 TEMPLATE template1 ENCODING 'SQL_ASCII' ;
ERROR:  new encoding (SQL_ASCII) is incompatible with the encoding of the template database (UTF8)
HINT:  Use the same encoding as in the template database, or use template0 as template.
   

--3 template0 库和 template1 都不可删除
 postgres=# drop database template0;
ERROR:  cannot drop a template database

postgres=# drop database template1;
ERROR:  cannot drop a template database
备注:当然有方法删除 template1 库,而且这个操作并不危险,需要修改系统表,这里不演示了。


三 关于复制数据库
        之前简单介绍了 template0 和 template1 的异同,有必要介绍通过模板库复制库的操作,例如
这里已经有个 francs 库了,现在想复制一个 francs1 库,内容和 francs 库一样。

--3.1 复制库
 postgres=# \c francs 
You are now connected to database "francs" as user "postgres".

francs=# select count(*) from pg_stat_user_tables ;
 count 
-------
    41
(1 row)

postgres=# create database francs1 TEMPLATE francs ;
CREATE DATABASE

postgres=# \c francs1 francs
You are now connected to database "francs1" as user "francs".
francs1=> select count(*) from pg_stat_user_tables ;
 count 
-------
    41
(1 row)
备注:这种方法在复制数据库时提供了方便, 也可以定制自己的数据库模板, 但是这么操作有个前提,
           复制时源库不可以连接,  复制过程中也不允许连接源库, 否则会报以下错误:

--3.2 错误代码
ERROR:  source database "francs" is being accessed by other users
DETAIL:  There is 1 other session using the database.
   

四 参考



  评论这张
 
阅读(3554)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016