(六)PostgreSQL的组织结构(2)-默认数据库

本文详细介绍了PostgreSQL中默认的三个数据库——postgres、template0和template1,讲述了它们各自的作用、用途、模板特性以及在数据库创建和管理中的重要性。特别强调了在开发和生产环境中应避免在postgres数据库中直接存储业务数据的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL的组织结构(2)-默认数据库

安装完postgresql后,我们发现它自带了3个数据库。postgres、template0、template1

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

postgres

在 PostgreSQL 中,postgres 库是默认创建的数据库,它通常用作新用户的初始数据库以及进行各种操作和管理任务的地方。

作用和用途

  1. 默认连接数据库:当用户第一次连接到 PostgreSQL 实例时,如果没有指定特定的数据库,通常会连接到 postgres 数据库。这使得新用户在开始创建自己的数据库之前有一个默认的操作环境。

  2. 管理和维护任务:数据库管理员(DBA)通常使用 postgres 数据库执行一些管理任务,如查询系统目录、管理用户(角色)和权限,以及执行数据库级别的维护操作等。

  3. 模板数据库:尽管 postgres 数据库本身不是模板数据库(PostgreSQL 使用名为 template1 的数据库作为新数据库的默认模板),但在实践中,很多数据库管理员会使用 postgres 库来创建或测试数据库对象和策略,然后在新的用户数据库中实施这些对象和策略。

  4. 系统级别的查询和操作postgres 数据库也经常被用来执行系统级别的查询,比如查询 pg_cataloginformation_schema 这样的系统目录来获取数据库实例的全局信息。

注意事项

  • 虽然 postgres 数据库通常用于上述目的,但强烈建议开发者或测试者创建并使用自己的数据库环境,以避免在 postgres 数据库中意外更改数据或配置,这些更改可能会影响到其他数据库或整个 PostgreSQL 实例的运行。

  • 对于生产环境,将具体的业务数据和应用存储在单独创建的数据库中,而不是默认的 postgres 数据库中,是一种最佳实践。这样做有助于保持环境的清洁、安全,以及更好地管理和维护数据。

简而言之,postgres 数据库作为 PostgreSQL 提供的默认数据库,主要用作初始连接点以及执行系统级别的管理和查询任务。但对于任何具体的业务应用或数据存储,建议创建专用的数据库。

template0template1

在 PostgreSQL 中,template0 是一个特殊的系统数据库模板,它的存在具有重要意义。PostgreSQL 允许通过现有数据库来创建新数据库,而 template0template1 是创建新数据库时可供选择的模板数据库。然而,template0template1 在用途和功能上有一些关键的区别。

template0 的主要用途

  1. 恢复默认设置template0 提供了一个干净的状态,反映了 PostgreSQL 安装时数据库的初始状态。如果 template1 被不小心修改了,template0 可用于创建一个全新的、未修改的数据库。

  2. 创建新数据库时指定编码:当需要以与 template1 不同的编码创建数据库时,template0 是理想的选择。使用 template0,用户可以创建具有不同编码或 LC_COLLATE(排序规则)设置的数据库。

理解 template0template1

template1

  • 默认模板template1 是 PostgreSQL 中创建新数据库时的默认模板。除非在创建数据库时明确指定了其他模板(包括 template0),否则新创建的数据库会复制 template1 的内容。
  • 用户自定义template1 可以被修改。这意味着,你可以向 template1 中添加公共数据或者设置数据库级别的配置,这样所有基于 template1 创建的新数据库都会继承这些数据和设置。这对于需要在多个数据库中重复使用相同设置或数据的场景很有用。
  • 恢复默认模板的后备选项:由于 template1 可能被修改,所以存在它可能无法用作创建新数据库的默认模板的风险。这就是 template0 存在的意义之一。

template0

  • 干净的初始状态template0 提供了一个干净的、未经修改的数据库模板,反映了 PostgreSQL 安装时的初始状态。它保证了即使 template1 被修改,你仍然可以创建一个干净、原始状态的数据库。
  • 字符集和校对规则的变更template0 允许创建与默认设置(template1可能已经修改)不同的字符集或校对规则的数据库。这在需要支持多语言或特定字符集/校对规则的新数据库时非常有用。
  • 不可修改:为了保持其作为干净模板的角色,template0 是只读的,不允许对其进行更改。这确保了无论系统如何变化,template0 都能提供一个一致的、未经修改的状态,用于创建新的数据库。

使用 template0 创建数据库

CREATE DATABASE newdb WITH TEMPLATE template0 ENCODING 'UTF8';

这个例子显示了如何使用 template0 创建一个新的 UTF-8 编码的数据库。使用 template0 是一个保险的选择,特别是当 template1 因为某些原因(例如,包含了特定于应用的设置或对象)而不适用时。

注意事项

  • template0template1 都不应该用于普通业务数据的存储。它们是系统级别的数据库,主要用于作为创建新数据库的模板。
  • 默认情况下,template0 是不允许连接的,这是为了防止意外修改其中的内容。
--尝试连接template0库,会报错。说明了默认禁止这种操作。
template1=# \c template0
2024-04-10 20:24:13.817 PDT [47814] FATAL:  database "template0" is not currently accepting connections
connection to server on socket "/tmp/.s.PGSQL.5777" failed: FATAL:  database "template0" is not currently accepting connections
Previous connection kept

--尝试连接template1,可以正常登录。 
template1=# \c template1
You are now connected to database "template1" as user "postgres".
template1=# 

template0 提供了一种创建具有特定设置(如编码和排序规则)新数据库的方法,同时也作为一个后备选项,保证在 template1 被修改的情况下还能创建新的数据库。

谨记:心存敬畏,行有所止。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值