• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PostgreSQL中的template0和template1库使用实战

    postgresql中默认会有三个数据库:postgres、template0、template1。

    postgres=# \l
             List of databases
     Name | Owner | Encoding | Collate | Ctype | Access privileges 
    -----------+----------+----------+-------------+-------------+-----------------------
     postgres | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =T/postgres   +
       |   |   |    |    | postgres=CTc/postgres
     template0 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
     template1 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
    (3 rows)
     
    postgres=#

    客户端默认会连接到postgres库。可以删除该库,不过会影响默认客户端连接。

    删除了postgres库之后,可以借助模板库template1再创建postgres库:

    $ psql template1
    psql (11.9)
    Type "help" for help.
     
    template1=# drop database postgres;
    DROP DATABASE
    template1=# \l
             List of databases
     Name | Owner | Encoding | Collate | Ctype | Access privileges 
    -----------+----------+----------+-------------+-------------+-----------------------
     template0 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
     template1 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
    (2 rows)
     
    template1=# create database postgres;
    CREATE DATABASE
    template1=# \l
             List of databases
     Name | Owner | Encoding | Collate | Ctype | Access privileges 
    -----------+----------+----------+-------------+-------------+-----------------------
     postgres | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 |
     template0 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
     template1 | postgres | UTF8  | en_US.UTF-8 | en_US.UTF-8 | =c/postgres   +
       |   |   |    |    | postgres=CTc/postgres
    (3 rows)
     
    template1=#

    其实,在使用create database db_name语句创建新库的时候,就是创建模板库template1的一个拷贝。

    那如果我修改了template1库会怎样呢?

    $ psql template1
    psql (11.9)
    Type "help" for help.
     
    template1=# create table my_test_tab(a int);
    CREATE TABLE
    template1=# create extension hstore;
    CREATE EXTENSION
    template1=# \dx
           List of installed extensions
     Name | Version | Schema |     Description     
    ---------+---------+------------+--------------------------------------------------
     hstore | 1.5  | public  | data type for storing sets of (key, value) pairs
     plpgsql | 1.0  | pg_catalog | PL/pgSQL procedural language
    (2 rows)
     
    template1=#

    修改以后,再创建新库的时候,新库也会包含上面的表和扩展:

    template1=# create database db_test;
    CREATE DATABASE
    template1=# \c db_test
    You are now connected to database "db_test" as user "postgres".
    db_test=# \dx
           List of installed extensions
     Name | Version | Schema |     Description     
    ---------+---------+------------+--------------------------------------------------
     hstore | 1.5  | public  | data type for storing sets of (key, value) pairs
     plpgsql | 1.0  | pg_catalog | PL/pgSQL procedural language
    (2 rows)
     
    db_test=# \d
       List of relations
     Schema | Name  | Type | Owner 
    --------+-------------+-------+----------
     public | my_test_tab | table | postgres
    (1 row)
     
    db_test=# 

    无论,在template1中加入了什么,都会在之后新建的库中。

    那template0的用途是什么呢?

    db_test=# select datname,datallowconn,datistemplate from pg_database order by 3;
     datname | datallowconn | datistemplate
    -----------+--------------+---------------
     postgres | t   | f
     db_test | t   | f
     template1 | t   | t
     template0 | f   | t
    (4 rows)
     
    db_test=#

    从这里可以看到,只有template0库对应的datallowconn字段的值是F。这就是上面重建postgres的时候先登录template1而不是template0的原因。

    template0是默认的不可修改的数据库。不建议用户对template0做任何修改。在初始化后的空实例中,template0和template1是完全相同的。

    为什么需要两个模板库呢?假设你搞乱了template1,还可以通过template0恢复template1。

    如果你想创建自己的模板库,只需将你选中库对应的datistemplate(pg_database中的列)设置为T即可。

    当然,在创建新库的时候,还可以选择其他的库做为源库:

    db_test=# create database db_test_2 template db_test;
    CREATE DATABASE
    db_test=#

    但是,要求不能有其他连接连接到模板库,否则会报错:

    db_test=# create database db_test_2 template db_test;
    ERROR: source database "db_test" is being accessed by other users
    DETAIL: There is 1 other session using the database.
    db_test=#

    补充:重建postgresql模板数据库template1

    $ psql -U postgres postgres
    postgres=# update pg_database set datistemplate = false where datname='template1';
    UPDATE 1
    postgres=# drop database template1;
    DROP DATABASE
    postgres=# create database template1 template=template0;
    CREATE DATABASE
    postgres=# update pg_database set datistemplate = true where datname='template1';
    UPDATE 1
    postgres=#

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • PostgreSQL存储过程用法实战详解
    • PostgreSQL实战之启动恢复读取checkpoint记录失败的条件详解
    • postgresql影子用户实践场景分析
    上一篇:PostgreSQL中的collations用法详解
    下一篇:关于PostgreSQL 行排序的实例解析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    PostgreSQL中的template0和template1库使用实战 PostgreSQL,中的,template0,和,