了解 PostgreSQL 的人肯定听过 template1 和 template0,这两个作为模板库,在建库的时候会用到,但这两者是有很大差别的,曾经一段时间对这两个模板库的使用比较模糊,今天再次查看了文档,决定通过实验记录下来。
默认数据库模板
1.1 默认模板库为 template1
1 |
postgres=# create database db1; |
备注:建库时如果不指定 TEMPLATE 属性,默认用的是 template1 模板库.
1.2 手工指定模板库
1 |
postgres=# create database db2 template template0; |
备注:也可以指定模板库为 template0
Template1 和 Template0 的区别?
数据库初始化之后, 就有了 template0, template1 库,开始时这两个库的内容是一样的,但这两个库有啥异同呢?
2.1 template1 可以连接并创建对象,template0 不可以连接
1 |
postgres=# /c template1 |
备注:当然可以通过其它方法连接 template0 库,有兴趣的同学自己研究下,这里不演示了。正因为 template1 可以创建对像,相比 template0 ,被称为非干净数据库,而 template0 被称为干净的数据库。
2.2 使用 template1 模板库建库时不可指定新的 encoding 和 locale,而 template0 可以
1 |
template1=# create database db3 TEMPLATE template0 ENCODING 'SQL_ASCII' ; |
Template0、Template1 库都不可删除
1 |
postgres=# drop database template0; |
备注:当然有方法删除 template1 库,而且这个操作并不危险,需要修改系统表,这里不演示了。
克隆数据库
之前简单介绍了 template0 和 template1 的异同,有必要介绍通过模板库复制库的操作,例如这里已经有个 francs 库了,现在想复制一个 francs1 库,内容和 francs 库一样。
4.1 复制库
1 |
postgres=# /c francs |
备注:这种方法在复制数据库时提供了方便, 也可以定制自己的数据库模板, 但是这么操作有个前提,
复制时源库不可以连接, 复制过程中也不允许连接源库, 否则会报以下错误:
4.2 错误代码
1 |
ERROR: source database "francs" is being accessed by other users |
参考
原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/238037.html