PostgreSQL 介绍及发展历史

42 阅读12分钟

介绍

PostgreSQL,也被称为 "Postgres",是一个强大的开源对象-关系数据库管理系统(ORDBMS)。它以其卓越的可靠性、特性丰富和功能强大的事务处理性能而闻名。PostgreSQL 支持几乎所有的 SQL 标准,并添加了一些扩展功能,如外键、子查询、触发器、视图、存储过程和用户自定义函数等。

PostgreSQL 的设计目标之一是提供一个可扩展和可定制的系统,这使得它可以轻松地适应各种应用场景。除了其核心的数据库功能外,PostgreSQL 还提供了许多扩展和插件,以支持特定的数据类型、函数和索引方法。这使得开发者能够根据需求定制数据库系统,从而提高性能和效率。

发展历史

PostgreSQL 的发展历史可以追溯到 1986 年,当时它作为加州大学伯克利分校的一个研究项目开始。最初的代码库是基于 POSTGRES,一个由迈克尔·斯通布雷克(Michael Stonebraker)领导的团队开发的原型系统。

随着项目的不断发展,PostgreSQL 逐渐成为一个独立的开源项目,并在 1996 年发布了第一个公开版本。从那时起,PostgreSQL 的开发和维护工作由全球的志愿者社区负责,他们为系统提供了持续的功能改进和性能优化。

在过去的几十年里,PostgreSQL 逐渐成为最受欢迎的开源数据库之一。它被广泛应用于各种场景,包括网站、电子商务系统、金融应用和科学计算等。其稳定、可靠和可扩展的特性使得它成为处理大规模数据和高并发访问的理想选择。

我们可以根据 PostgreSQL 的源代码看下其第一次提交是在什么时候:

# 克隆 PostgreSQL 的源代码
$ git clone https://git.postgresql.org/git/postgresql.git

# 找到其第一次提交记录
$ git rev-list --max-parents=0 HEAD          
d31084e9d1118b25fd16580d9d8c2924b5740dff

# 看下第一次提交的信息
$ git log `git rev-list --max-parents=0 HEAD`
commit d31084e9d1118b25fd16580d9d8c2924b5740dff (tag: PG95-1_01)
Author: Marc G. Fournier <scrappy@hub.org>
Date:   Tue Jul 9 06:22:35 1996 +0000

    Postgres95 1.01 Distribution - Virgin Sources

除了核心功能外,PostgreSQL 还通过社区的支持得到了广泛的扩展。开发者们贡献了各种插件和工具,以支持特定的业务需求和技术挑战。这些扩展使得PostgreSQL 能够与其他系统进行无缝集成,并提供了更多高级功能,如全文搜索、空间数据支持、复制和分区等。

随着技术的不断发展和变化,PostgreSQL 继续积极应对新的挑战和机遇。它不断引入新的特性和技术,如支持 JSON 和 JSONB 数据类型、提供更好的并发性能和可扩展性等。这使得 PostgreSQL 能够与时俱进,满足不断变化的数据管理需求。

发布策略、版本号及生命周期

PostgreSQL 维护者通常每年发布一次新的主版本,大概在每年的 10 月份左右。主版本是一个稳定的版本,引入了新功能,或许会与之前的版本不兼容。在其生命周期中,主版本会通过次版本的不断改进,这些次版本通常是 Bug 修复和维护版本。

PostgreSQL 版本号标识了主版本和次版本。版本号指定为 major.minor;因此,例如 16.0 表示第一个主版本 16,而 16.1 表示次版本为 1。也就是说,次版本的数字越大,那么版本就越新。

PostgreSQL 的不同主版本不兼容,而不同的次版本是兼容的。这种不兼容意味着什么?PostgreSQL 以二进制格式存储数据,这种格式可能会在主版本之间发生变化。这意味着,虽然我们可以实时在次版本之间升级 PostgreSQL,但我们可能要在主版本升级之间转储和恢复数据库内容。

建议使用 PostgreSQL 时,请使用最新版本,这样软件中会修复之前版本存在的问题。不过使用新的版本,也不能保证软件没有问题,所以,当遇到安全漏洞和性能改进的问题时,我们要及时更新它。

最后,并非所有 PostgreSQL 版本都会一直存在。PostgreSQL 在新版本发布后会再提供五年的支持和升级;在此之后,主版本将达到其生命周期结束(EOL),PostgreSQL 开发人员将不再维护它。这并不意味着我们无法运行 PostgreSQL 的旧版本;它只是意味着这个版本不会从官方项目中获得任何升级。例如,由于 PostgreSQL 16 于 2023 年发布,它将在 2028 年达到 EOL。请记住,运行 EOL 版本不仅仅是没有获得新的升级、安全补丁和错误修复的问题;当我们遇到问题时,我们将找不到任何帮助,只能自己解决。

探索 PostgreSQL 中的术语

我们有必要了解 PostgreSQL 中的术语,这样在遇到一些概念时,不至于慌乱。另外,与别的数据库(如 MySQL)进行对比着记忆,那么记忆将会在脑海中保留很长的时间,甚至是终身记忆。

PostgreSQL 是一个服务,这意味着它在操作系统上作为守护进程运行;正在运行的 PostgreSQL 守护进程称为实例。PostgreSQL 实例通常被称为集群,因为单个实例可以服务和处理多个数据库。每个数据库都是一个孤立的空间,用户和应用程序可以在这里存储数据。

只有被允许的用户才可以访问数据库,但连接到数据库的用户不能跨数据库并与另一个数据库中包含的数据进行交互,除非他们也明确连接到后者。

数据库可以通过命名空间来组织,称为 schema(模式)。模式不能嵌套。

数据库对象是由用户可以在数据库中创建和管理的所有内容表示,例如表、函数、触发器和数据类型。每个对象都属于一个且只有一个模式,如果没有指定,则将其命名为创建对象的用户。

[!tip]

在 15 版本之前的 PostgreSQL 版本中,如果没有明确指定,每个新对象都属于默认的 public 模式。从 PostgreSQL 15 版本开始,每个用户都被分配一个个人模式,除非明确指定不同的模式名称,否则对象属于此类模式。

用户是在集群范围内定义的,这意味着他们没有绑定到集群中的特定数据库。用户可以连接和管理他们被允许的集群中的任何数据库。

PostgreSQL 将用户分为两大类:

  • 普通用户: 这些用户只能处理属于自己权限范围内的库与对象。
  • 超级用户: 这些用户可以对任何数据库对象做任何事情。

PostgreSQL 允许我们配置多个超级用户,每个超级用户拥有相同的权限:它们可以对每个数据库中的对象做任何操作,更重要的是,它们可以控制集群的生命周期(如:可以终止普通用户的连接、重载配置及停止整个集群等待)。

PostgreSQL 内部数据(如用户、数据库、命名空间、配置和数据库运行时状态)通过 catalogs 提供:以 SQL 交互方式呈现信息的特殊表和视图。许多目录会根据检查它们的用户权限以返回特定的信息,但超级用户通常会看到整个信息。

PostgreSQL 将用户数据(例如表)和其内部状态存储在本地文件系统上。这是一个需要牢记的知识点:PostgreSQL 依赖底层文件系统来实现持久化,因此调整文件系统是确保 PostgreSQL 性能良好的重要任务。特别地,PostgreSQL 将其所有内容(用户数据和内部状态)存储在一个名为 PGDATA 的单一文件系统目录中。PGDATA 目录代表着集群作为数据库提供的内容,因此我们可以在单个 PostgreSQL 安装中切换不同的 PGDATA 目录以提供不同的内容。正如我们将在接下来的章节中看到的,PGDATA 目录在被 PostgreSQL 使用之前需要进行初始化;初始化一次性操作。

PGDATA 目录的详细内容将在下一章中说明,但现在我们只需记住,PGDATA 目录是 PostgreSQL 期望找到数据和配置文件的地方。特别是,PGDATA 目录至少包括预写日志(WAL)和数据存储。如果没有这两部分中的任何一部分,集群将无法保证数据一致性,甚至无法启动。

WAL 是许多数据库系统使用的一种技术,其基本工作原理与其他技术(如事务性文件系统,例如ZFS、带有软更新的 UFS 等)类似。其思想是,在对数据块进行任何更改之前,会创建一个持久的日志。在这种情况下,如果集群崩溃,它始终可以依赖已写入的日志来了解已完成的操作以及需要恢复的内容(更多详细信息请参阅后面的章节)。请注意,“崩溃”一词指的是可能影响集群的任何灾难,包括软件错误,但更有可能是电力不足、硬盘故障等。PostgreSQL 致力于为我们提供尽可能高的数据一致性,并因此请确保日志(WAL)尽可能安全。

[!tip]

SQL 标准定义了所谓的 “information schema”,这是所有标准数据库实现(包括 PostgreSQL)的一组表,DBA 可以用来检查数据库本身的内部状态。例如,Information schema 定义了一个表,用于收集关于所有用户定义表的信息,以便可以查询 Information schema 来查看特定表是否存在。PostgreSQL 的 catalog(目录) 可以被称为“强化版的 Information schema”:目录比通用 Information schema 更准确且特定于 PostgreSQL,DBA 可以从 catalog(目录)中提取更多关于PostgreSQL 状态的信息。

MySQL 里面也是有 "information schema" 的,我们可以看一下:

mysql> show databases;
+-----------------------+
| Database              |
+-----------------------+
| information_schema    |
......
| performance_schema    |
......
+-----------------------+
35 rows in set (0.04 sec)

当集群启动时,PostgreSQL 会启动一个名为 postmaster 的单一进程。postmaster 的作用是管理数据库活动,然后等待传入的连接。用户连接通常通过 TCP/IP 连接进行,需要 postmaster 派生另一个名为 backend process 的进程,后者负责仅为一个连接提供服务。

这意味着每次打开与集群的新连接时,集群都会启动一个新的后端进程来提供服务,直到连接结束并销毁该进程。通常,postmaster 还会启动一些实用程序进程,负责在 PostgreSQL 运行时保持其良好状态;这些进程将在本章和下一章中讨论。

总之,PostgreSQL 为我们提供了可在系统中任何位置安装的可执行文件,并且可以为单个集群提供服务。该集群反过来从一个单独的 PGDATA 目录中提供数据,其中包括用户数据、集群的内部状态、目录和 WAL。每当客户端连接到服务器时,postmaster 进程会派生出一个新的后端进程,该进程是负责服务的连接。

以下是 PostgreSQL 中使用的最复杂术语的快速回顾:

  • Cluster: 集群就是表示整个 PostgreSQL 服务。
  • Postmaster: 集群执行的第一个进程,这个进程负责跟踪整个集群的活动。每次建立新连接时,Postmaster 都会派生一个后端进程。
  • Database: 用户或应用程序可以连接的、彼此相互独立的数据仓库(容器)。一个集群可以管理多个数据库。一个数据库可以有多个对象组成,包括 schemas(namespace)、表、触发器及其他对象。
  • PGDATA: 是一个环境变量,指向了 PostgreSQL 的数据目录。PostgreSQL 的所有数据均存放在此。
  • WALs: 是数据变更的日志记录,用于发生故障时的数据恢复。

好了,我们已经讨论了与 PostgreSQL 相关的基本术语,是时候把它安装在我们的机器上了。

总结

PostgreSQL 作为一个开源的数据库管理系统,以其卓越的性能、丰富的特性和强大的可扩展性而受到广泛赞誉。它的历史可以追溯到加州大学伯克利分校的研究项目,并逐渐成为一个独立的开源项目,由全球的志愿者社区维护和发展。

PostgreSQL 的成功归功于其强大的功能和社区的支持。它提供了丰富的数据类型、函数和扩展,使得开发者能够灵活地适应各种应用场景。同时,全球的志愿者社区为 PostgreSQL 提供了持续的功能改进和性能优化,使得它成为处理大规模数据和高并发访问的理想选择。

随着技术的不断发展和变化,PostgreSQL 将继续积极应对新的挑战和机遇。它将继续引入新的特性和技术,以满足不断变化的数据管理需求。因此,无论是个人开发者还是大型企业,PostgreSQL 都是一个值得考虑的强大数据库解决方案。