重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 582|回复: 0
打印 上一主题 下一主题

pg 数据库 template0 与 template1 区别与 联系

[复制链接]
跳转到指定楼层
楼主
发表于 2025-8-1 10:17:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 郑全 于 2025-8-1 10:26 编辑

在 PostgreSQL 中,template0 和 template1 是两个特殊的 模板数据库,它们是创建新数据库时的 “模板”,新数据库会继承模板库的结构、配置和部分数据。两者的设计目的和使用场景有明确区别,理解它们的关系与差异对数据库管理至关重要。
一、核心关系:模板与新数据库的继承 template0 和 template1 都是初始化数据库集簇(通过 initdb 命令)时自动创建的,是所有新数据库的 “源头”:

  • 当执行 CREATE DATABASE new_db; 时,PostgreSQL 会默认以 template1 为模板复制出 new_db。
  • 也可以指定模板:CREATE DATABASE new_db WITH TEMPLATE template0;,此时以 template0 为模板。

新数据库会继承模板库的:

  • 系统目录(如 pg_class、pg_user 等元数据表);
  • 数据库配置(如字符集 ENCODING、排序规则 LC_COLLATE 等);
  • 自定义对象(如模板库中创建的表、函数、扩展等,仅 template1 可能包含)。
二、核心区别:用途与特性
维度
template1
template0
定位
可修改的默认模板
不可修改的 “纯净” 模板
是否允许修改
允许用户连接并创建对象(表、函数等)
不建议修改,默认禁止普通用户连接
包含内容
初始与 template0 一致,可添加自定义对象
仅包含 PostgreSQL 初始化时的核心系统对象
典型用途
作为默认模板,批量创建含相同自定义对象的数据库
用于创建与集簇初始化配置一致的 “纯净” 数据库,或修改字符集等基础参数
连接限制
允许连接(psql -d template1)
默认禁止连接(需特殊参数 postgres --single -d template0)


三、详细说明1. template1:默认的 “可定制模板”
  • 可修改性:用户可以直接连接到 template1 并创建对象(如自定义函数、扩展、表等)。例如:
    sql

    -- 连接到 template1
  • \c template1
  • -- 创建一个公共函数,后续新数据库会自动继承
  • CREATE FUNCTION add (a int, b int) RETURNS int AS $$
  •      BEGIN  RETURN a  + b ;
  • END;
  • $$ LANGUAGE plpgsql;


  • 之后用 CREATE DATABASE new_db; 创建的数据库会自动包含这个 add 函数。
  • 风险提示:若 template1 被意外修改或损坏,所有新数据库都会继承问题。因此,修改 template1 需谨慎。
2. template0:“原始备份” 模板
  • 不可修改性:template0 保留了数据库集簇初始化时的 “原始状态”,仅包含 PostgreSQL 必需的系统对象,不允许用户随意修改。
    普通用户无法直接连接 template0(会报错 ERROR: cannot connect to template database "template0"),避免误操作。
  • 关键用途:
    • 创建 “纯净” 数据库:当需要一个不含任何自定义对象的数据库时,可指定 template0:


    • CREATE DATABASE clean_db WITH TEMPLATE template0 ;

      修改基础配置:若需创建与集簇默认字符集、排序规则不同的数据库,必须使用 template0(template1 可能已继承了原配置,无法修改)。例如:
    • -- 创建一个 UTF8 编码的数据库(假设集簇默认不是 UTF8)
    •   CREATE DATABASE utf8_db   WITH TEMPLATE template0
    •     ENCODING  'UTF8'   LC_COLLATE  'en_US.UTF-8'
    •     LC_CTYPE  'en_US.UTF-8' ;
    • 恢复模板:若 template1 损坏,可通过 template0 重建 template1:
    • -- 先删除损坏的 template1(需先修改其属性)
    •   UPDATE pg_database SET is_template   WHERE datname =  'template1';
    •   DROP DATABASE template1
    • -- 用 template0 重建 template1
    • CREATE DATABASE template1 WITH TEMPLATE template0;


四、总结
  • template1 是 “可定制的默认模板”,适合批量创建包含相同自定义对象的数据库。
  • template0 是 “不可修改的原始模板”,用于创建纯净数据库或修改基础配置(如字符集),也是 template1 损坏时的恢复来源。
  • 两者均为模板数据库,且 template1 初始状态与 template0 一致,区别在于是否允许用户定制化修改。

合理使用这两个模板,可以简化数据库创建流程,同时避免因配置不一致导致的问题
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-18 01:34 , Processed in 0.624797 second(s), 20 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表