跳转到内容

PostgreSQL/集群架构

来自维基教科书,开放的书籍,开放的世界


一个服务器,它可以是硬件、容器或虚拟机,包含一个或多个数据库集群(简称集群)。每个集群由一个实例控制。如果同一服务器上有多个集群和实例,则实例的端口必须彼此不同,集群的根目录也必须不同。

每个新创建的集群都包含三个数据库,分别是template0template1postgres,这三个数据库都包含public模式以及系统模式pg_cataloginformation_schemapg_temp 以及其他一些模式。表、视图以及大多数其他 SQL 对象都位于这些模式中。DBA 可以创建更多集群、数据库、模式或 SQL 对象。



初始化阶段

[编辑 | 编辑源代码]

使用initdb命令创建集群。template0 是任何集群创建阶段的第一个数据库。在第二步中,数据库template1 将作为template0 的副本生成,最后数据库postgres 将作为template1 的副本生成。之后,DBA 可以使用createdb命令在该集群中创建更多数据库,例如:my_db。与一开始一样,新数据库将是template1 的副本。由于template0 作为所有其他数据库的原始模板的独特作用,不允许任何客户端连接到它并修改它。但是 DBA 可以更改template1

客户端连接在数据库级别上运行,可以访问连接数据库中任何模式中的数据和 SQL 对象,只要它们被允许这样做。如果它们需要访问同一集群或其他集群中不同数据库的任何对象,则需要使用特殊技术,例如外键数据包装器 (FDW) 或dblink(或者它们使用多个连接并在客户端侧同步这些连接)。

SQL 对象

[编辑 | 编辑源代码]

我们使用术语SQL 对象 来指代所有可以使用 SQL 命令CREATE ... 创建的对象,例如:数据库、模式、表、视图、物化视图、索引、约束、序列、函数、过程、触发器、角色、数据类型、域、操作符、表空间、扩展、外键数据包装器等等。这些 SQL 对象以层次结构的方式排列

  • 数据库名称、表空间和角色(用户)在集群级别上是已知的。例如:如上所述,连接在数据库级别上运行。但是,当您使用这种连接创建新角色时,该角色也为同一集群的所有其他数据库所知。
  • 扩展,例如:PostGIS,驻留在数据库级别。安装扩展后,该数据库的所有模式都可以使用它。但在同一集群中的其他数据库中,该扩展是未知的。
  • 模式是数据库的一部分。其中一些是预定义的。
  • pg_catalog 是一个包含描述该数据库中大多数 SQL 对象的表的模式,尤其是所有表和视图。它们甚至描述自己。information_schema 是一个类似的模式。它包含 pg_catalog 中的几个表和视图,以符合 SQL 标准的方式。
  • public 充当默认模式。它不应该包含用户定义的 SQL 对象。相反,建议创建一个或多个其他模式来管理特定于应用程序的对象,如表或触发器。要访问这些其他模式中的对象,可以完全限定它们,例如 my_schema.my_table,或者通过更改search_path
  • 模式中存在不同类型的 SQL 对象:'关系' 类对象(表、视图、物化视图、索引、序列、外键表)、函数、过程、触发器、约束、数据类型、域、操作符等等。
  • 一个模式中的 SQL 对象与不同模式中的 SQL 对象不同,即使它们使用相同的名称,例如:my_schema1 中的表t1my_schema2 中的t1 不同。
  • '关系' 类对象、数据类型和域的名称在其模式内是唯一的:例如:您不能在同一个模式中拥有一个名为emplyee 的表和一个名为employee 的视图。



华夏公益教科书