跳转到内容

PostgreSQL/术语

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

为了促进对重要术语的一致使用和理解,我们在此列出并定义了它们。对于某些术语,我们包括简短的注释,以对主题进行初步介绍。

数据库集群

[编辑 | 编辑源代码]



服务器(或节点)

[编辑 | 编辑源代码]

服务器是指安装了 PostgreSQL 的某些(实际或虚拟)硬件。在本文件中,术语实例服务器的概念不同。请参阅本文档中实例的定义。

节点集群

[编辑 | 编辑源代码]

一组通过复制交换信息的节点。

下载并安装 PostgreSQL 后,您将在服务器上获得一组程序、脚本、配置和其他文件。这组文件被称为“安装”。它包括所有实例程序,以及一些客户端程序,如psql

服务器数据库

[编辑 | 编辑源代码]

术语服务器数据库通常在客户端/服务器连接的上下文中用于指代实例或单个数据库

集群(或“数据库集群”)

[编辑 | 编辑源代码]

集群是指文件系统中的一个存储区域(目录、子目录和文件),其中包含一组数据库以及元数据。数据库集群中还包括全局对象(如用户及其权限)的定义。这些对象在整个数据库集群中都是已知的。(用户对某些对象的访问权限(如特定表格或特定模式)可能会受到限制。在这种情况下,用户将无权访问集群中的其他对象。)

数据库集群中至少包含三个数据库:'template0'、'template1'、'postgres',可能还包含更多数据库。

  • 'template0':一个模板数据库,可以被命令CREATE DATABASE使用(template0 永远不应被修改)
  • 'template1':一个模板数据库,可以被命令CREATE DATABASE使用(template1 可以被 DBA 修改)
  • 'postgres':一个空数据库,主要用于维护目的

大多数 PostgreSQL 安装只使用一个数据库集群。它的名称是“main”。但是您可以在同一个 PostgreSQL 安装上创建更多集群,请参阅后面的工具initdb

实例(或“数据库服务器实例”或“数据库服务器”或“后端”)

[编辑 | 编辑源代码]

实例是指一组进程(在 UNIX 服务器上)或一个服务(在 Windows 服务器上)加上共享内存,它们控制和管理一个集群。使用 IP 术语,可以说一个实例占用一个 IP/端口组合,例如组合https://127.0.0.1:5432。同一个服务器的不同端口可能运行着另一个实例。构成实例的进程(在 UNIX 服务器上)被称为:postmaster(为每个客户端连接创建一个“postgres”进程)、logger、checkpointer、background writer、WAL writer、autovacuum launcher、archiver、stats collector。每个进程的作用在架构一章中解释。

如果您在服务器上有多个集群,您可以在同一台机器上运行多个实例,每个集群一个实例。

提示:其他出版物有时使用术语服务器来指代实例。由于术语服务器被广泛用于指代实际或虚拟硬件,我们不使用服务器作为实例的同义词。

数据库

[编辑 | 编辑源代码]

数据库是指文件系统中的一个存储区域,其中包含一组对象,存储在文件中。对象包括数据、元数据(表格定义、数据类型、约束、视图,……)以及其他数据,如索引。这些对象存储在默认数据库“postgres”或新创建的数据库中。

一个数据库的存储区域被组织为数据库集群存储区域内的子目录树。因此,数据库集群可以包含多个数据库。

在一个新创建的数据库集群中(请参阅下面的:initdb),存在一个名为“postgres”的空数据库。在大多数情况下,此数据库保持为空,应用程序数据存储在单独的数据库中,如“finance”或“engineering”。但是,“postgres”不应被删除,因为某些工具会尝试在此数据库中存储临时数据。

模式是数据库中的一个命名空间:它包含命名对象(表格、数据类型、函数和运算符),这些对象的名字可能与该数据库其他模式中存在于其他对象的名字重复。每个数据库都包含默认模式“public”,并且可能包含更多模式。一个模式中的所有对象都必须位于同一个数据库中。同一个数据库中不同模式的对象可以有相同的名称。

每个数据库中还有另一个特殊模式。模式“pg_catalog”包含所有系统表格、内置数据类型、函数和运算符。另请参阅下面的“搜索路径”。

搜索路径(或“模式搜索路径”)

[编辑 | 编辑源代码]

搜索路径是一个模式名称列表。如果应用程序使用非限定对象名称(例如:表名称的“employee_table”),则搜索路径用于在给定的模式序列中定位此对象。 模式“pg_catalog”始终是搜索路径的第一部分,尽管它没有在搜索路径中显式列出。 此行为确保 PostgreSQL 找到系统对象。

initdb(操作系统命令)

[编辑 | 编辑源代码]

尽管它的名称是“initdb”,但该实用程序创建了一个新的集群,其中包含 3 个数据库“template0”、“template1”和“postgres”。

createdb(操作系统命令)

[编辑 | 编辑源代码]

实用程序“createdb”在实际的集群中创建了一个新的数据库

CREATE DATABASE(SQL 命令)

[编辑 | 编辑源代码]

SQL 命令“CREATE DATABASE”在实际的集群中创建了一个新的数据库

目录结构

[编辑 | 编辑源代码]

一个集群及其数据库由文件组成,这些文件包含数据、实际状态信息、修改信息等等。 这些文件按固定方式在一个目录节点下组织。


一致性写入

[编辑 | 编辑源代码]

共享缓冲区

[编辑 | 编辑源代码]

共享缓冲区是 RAM 页面,它们镜像磁盘上数据文件的页面。 它们的存在是为了性能原因。 术语“共享”源于许多进程读写该区域的事实。

“脏”页面

[编辑 | 编辑源代码]

共享缓冲区中的页面镜像磁盘上数据文件的页面。 当客户端请求更改数据时,这些页面会更改,而不会 - 暂时 - 更改磁盘上的相关页面。 在后台写入器将这些修改后的页面写入磁盘之前,它们被称为“脏”页面。

检查点

[编辑 | 编辑源代码]

检查点是时间的特殊点,在该时间点保证数据库文件处于一致状态。 在检查点时,所有更改记录都刷新到 WAL 文件,所有脏数据页面(在共享缓冲区中)都刷新到磁盘,最后将特殊的检查点记录写入 WAL 文件。

实例的检查点进程会自动定期触发检查点。 此外,可以通过在客户端程序中发出命令“CHECKPOINT”来强制它们。 对于数据库系统来说,执行检查点需要很长时间 - 因为需要进行物理磁盘写入。

WAL 文件

[编辑 | 编辑源代码]

WAL 文件包含通过修改命令(如“INSERT”、“UPDATE”、“DELETE”或“CREATE TABLE ...”)应用于数据的更改。 这是冗余信息,因为它也记录在数据文件中(以便稍后获得更好的性能)。 根据实例的配置,WAL 文件中可能包含更多信息。 WAL 文件驻留在“pg_wal”目录中(在 10 版之前名为“pg_xlog”),具有二进制格式和固定大小 16MB。 当它们不再需要时,它们会通过重命名和重用其已分配的空间来回收。

WAL 文件中的单个信息单元称为日志记录

提示:在 PostgreSQL 文档和相关文档中,还有许多其他类似的术语,这些术语指的是我们在本维基教科书中称为WAL 文件的内容:段、WAL 段、日志文件(不要与术语“日志文件”混淆,见下文)、WAL 日志文件......

日志文件

[编辑 | 编辑源代码]

实例记录并报告有关可读文本文件中的特殊情况的警告和错误消息。 这些日志文件可以驻留在服务器目录结构中的任何地方,并且不是集群的一部分。

提示:术语“日志文件”与本章的其他术语无关。 这里提到它是因为它有时用作我们称之为WAL 文件的同义词 - 见上文。

日志记录

[编辑 | 编辑源代码]

日志记录是WAL 文件中的单个信息单元。

术语“段”有时用作WAL 文件的同义词。

多版本并发控制(MVCC)是一种常见的数据库技术,用于实现两个目标:首先,它允许在逻辑级别管理并行运行的事务;其次,它确保并发读写操作的高性能。 它的实现方式如下:每当现有行的某些值发生变化时,PostgreSQL 就会将此行的最新版本写入数据库,而不会删除旧版本。 在这种情况下,数据库包含该行的多个版本。 除了其常规数据外,行还包含事务 ID,这些事务 ID 允许确定哪些其他事务将看到新行或旧行。 因此,其他事务只看到那些(其他事务)已提交的值。

过时的旧行会在稍后由实用程序“vacuumdb”或 SQL 命令“vacuum”删除。

备份和恢复

[编辑 | 编辑源代码]

术语“冷”作为备份方法名称的补充,表明使用此方法必须停止实例才能创建有用的备份。 相反,添加“热”表示必须运行实例的方法(因此在备份操作期间可能会对数据进行更改)。

冷备份是集群中所有文件的完整副本,使用 OS 工具(如 cp 或 tar)创建。 在创建冷备份期间,实例不能运行 - 否则备份将毫无用处。 因此,您需要一段应用程序不使用集群中的任何数据库的时间 - 无法实现连续的 7×24 操作模式。 其次:冷备份仅适用于集群级别,不适用于任何更细粒度的级别,如数据库或表。

提示:冷备份有时被称为“离线备份”。

逻辑备份是数据库或其某些部分内数据的完整副本。 它使用实用程序“pg_dump”创建。 尽管“pg_dump”可以与应用程序并行运行(实例必须启动),但它会在其启动时创建一致的快照。

pg_dump 支持两种输出格式。第一种是包含 SQL 命令(如 CREATE 和 INSERT)的文本格式。以这种格式创建的文件可由 psql 用于恢复备份数据。第二种格式是二进制格式,称为“归档格式”。此格式的文件可使用工具 pg_restore 恢复其数据。

如上所述,pg_dump数据库级别或数据库的较小部分(如表)上运行。如果要引用集群级别,必须使用 pg_dumpall。请注意,用户/角色及其权限等重要对象始终在集群级别定义。

此类备份包含两个部分。第一个是所谓的基本备份,它是集群所有文件的副本。第二个包含备份命令开始后所有数据更改。它们存储在 WAL 文件中。

此类备份仅在集群级别起作用,不在任何更细的粒度(如数据库或表)上起作用。

当您使用“连续归档”(基本备份)技术并归档所有发生的 WAL 文件时,您可以将数据库恢复到任意时间点。为此,您必须恢复基本备份并针对其重放 WAL 文件,直至定义的时间戳。

归档是将WAL 文件复制到安全位置的过程。当您计划使用PITR时,您必须确保WAL 文件的序列保存更长时间。为了支持在正确时间复制WAL 文件的过程(当它们完全填满并且已切换到下一个WAL 文件时),PostgreSQL 运行归档过程,该过程是实例的一部分。此过程将WAL 文件复制到可配置的目标位置。

恢复是将WAL 文件针对物理备份进行重放的过程。涉及的步骤之一是从安全归档位置将WAL 文件复制到其在“/pg_xlog”中的原始位置。恢复的目的是将集群带到定义时间戳的一致状态。

归档恢复模式

[编辑 | 编辑源代码]

当发生恢复时,实例处于归档恢复模式

重启点

[编辑 | 编辑源代码]

重启点与检查点类似。重启点仅在实例处于归档恢复模式备用模式时执行。

时间线

[编辑 | 编辑源代码]

恢复成功后,PostgreSQL 将集群转移到新的时间线,以避免在重置 PITR 并重新应用WAL 文件时(例如:到不同的时间戳)可能出现的问题。时间线名称是顺序编号:1、2、3、...。

复制是一种将数据从主服务器写入的发送到一个或多个备用服务器,甚至另一个主服务器的技术。

主服务器

[编辑 | 编辑源代码]

主服务器是服务器上的一个实例,它除了本地处理数据外,还会将数据发送到其他实例

备用服务器

[编辑 | 编辑源代码]

备用服务器是服务器上的一个实例,它接收来自主服务器有关其数据更改的信息。

热备用服务器

[编辑 | 编辑源代码]

热备用服务器是一个正在运行的实例,它处于备用模式(recovery.conf 文件)。它会持续读取和处理传入的WAL 文件(在日志传送的情况下)或日志记录(在流复制的情况下)。它不接受客户端连接。

热备用服务器

[编辑 | 编辑源代码]

热备用服务器是一个热备用服务器,在 postgres.conf 中添加了hot_standby 标志。它接受客户端连接和只读查询。

同步复制

[编辑 | 编辑源代码]

备用服务器立即处理接收到的数据,向主服务器发送确认记录,并且主服务器延迟其 COMMIT 操作,直到收到备用服务器的确认时,复制称为同步

异步复制

[编辑 | 编辑源代码]

主服务器将数据发送到备用服务器并且不期望此操作的任何反馈时,复制称为异步

流复制

[编辑 | 编辑源代码]

日志条目通过 TCP 连接从主服务器传输到备用服务器时,除了将其传输到本地WAL 文件之外,还会使用此术语。流复制默认情况下是异步的,但也可以是同步的。

日志传送复制

[编辑 | 编辑源代码]

日志传送是从主服务器备用服务器传输WAL 文件的过程。日志传送是异步操作。


华夏公益教科书