(六)PostgreSQL的组织结构(2)
安装完postgresql后,我们发现它自带了3个数据库。postgres、template0、template1
postgres=# \lList of databasesName | 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/postgrestemplate1 | postgres | UTF8 | libc | en_US.UTF-8 | en_US.UTF-8 | | | =c/postgres +| | | | | | | | postgres=CTc/postgres
(3 rows)
postgres
库
在 PostgreSQL 中,postgres
库是默认创建的数据库,它通常用作新用户的初始数据库以及进行各种操作和管理任务的地方。
作用和用途
-
默认连接数据库:当用户第一次连接到 PostgreSQL 实例时,如果没有指定特定的数据库,通常会连接到
postgres
数据库。这使得新用户在开始创建自己的数据库之前有一个默认的操作环境。 -
管理和维护任务:数据库管理员(DBA)通常使用
postgres
数据库执行一些管理任务,如查询系统目录、管理用户(角色)和权限,以及执行数据库级别的维护操作等。 -
模板数据库:尽管
postgres
数据库本身不是模板数据库(PostgreSQL 使用名为template1
的数据库作为新数据库的默认模板),但在实践中,很多数据库管理员会使用postgres
库来创建或测试数据库对象和策略,然后在新的用户数据库中实施这些对象和策略。 -
系统级别的查询和操作:
postgres
数据库也经常被用来执行系统级别的查询,比如查询pg_catalog
或information_schema
这样的系统目录来获取数据库实例的全局信息。
注意事项
-
虽然
postgres
数据库通常用于上述目的,但强烈建议开发者或测试者创建并使用自己的数据库环境,以避免在postgres
数据库中意外更改数据或配置,这些更改可能会影响到其他数据库或整个 PostgreSQL 实例的运行。 -
对于生产环境,将具体的业务数据和应用存储在单独创建的数据库中,而不是默认的
postgres
数据库中,是一种最佳实践。这样做有助于保持环境的清洁、安全,以及更好地管理和维护数据。
简而言之,postgres
数据库作为 PostgreSQL 提供的默认数据库,主要用作初始连接点以及执行系统级别的管理和查询任务。但对于任何具体的业务应用或数据存储,建议创建专用的数据库。
template0
和template1
库
在 PostgreSQL 中,template0
是一个特殊的系统数据库模板,它的存在具有重要意义。PostgreSQL 允许通过现有数据库来创建新数据库,而 template0
和 template1
是创建新数据库时可供选择的模板数据库。然而,template0
与 template1
在用途和功能上有一些关键的区别。
template0
的主要用途
-
恢复默认设置:
template0
提供了一个干净的状态,反映了 PostgreSQL 安装时数据库的初始状态。如果template1
被不小心修改了,template0
可用于创建一个全新的、未修改的数据库。 -
创建新数据库时指定编码:当需要以与
template1
不同的编码创建数据库时,template0
是理想的选择。使用template0
,用户可以创建具有不同编码或 LC_COLLATE(排序规则)设置的数据库。
理解 template0
和 template1
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
因为某些原因(例如,包含了特定于应用的设置或对象)而不适用时。
注意事项
- template0 和 template1 都不应该用于普通业务数据的存储。它们是系统级别的数据库,主要用于作为创建新数据库的模板。
- 默认情况下,
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
被修改的情况下还能创建新的数据库。
谨记:心存敬畏,行有所止。