深入浅出PostgreSQL
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 PostgreSQL简介

PostgreSQL是一个功能强大且开源的对象关系型数据库管理系统,它使用SQL语言扩展了许多语法特性,以支持更复杂的数据负载。

PostgreSQL可以在大多数操作系统上运行。自2001年起,PostgreSQL就已经兼容事务的ACID属性,并拥有一系列强大的插件,如空间数据库扩展插件PostGIS,外部数据表访问插件postgres_fdw、oracle_fdw等。

1.2.1 基本概念

PostgreSQL中的很多概念来源于关系代数。为了使读者更好地理解本书后续内容,有必要了解以下基本概念。

1.关系(Relation)

“关系”是一个表示表(Table)的数学术语。在PostgreSQL中,“关系”表示表或索引。其他数据库一般称表为Table,称索引为Index,而PostgreSQL有时会将它们统称为关系。表用来存储数据,一个表通常由若干行组成。

2.元组(Tuple)和域(Field)

元组(Tuple)表示表中的行(Row),有的数据库将元组称为记录(Record)。一个元组一般由多个域(Field)组成,域有时也被称为字段(Field)或列(Column)。

每个字段都有一个特定的数据类型和可选属性。字段在元组中的位置次序是固定不变的,而行在表中的位置次序则是不固定的(事实上每次数据更新之后行的物理位置都会发生变化)。

3.数据库(Database)和数据库簇(Database Cluster)

多个表组合在一起构成了一个数据库,这是一个逻辑意义上的数据库。一般来说,这些表在业务层面上存在着某种逻辑关系。

在一个单一的PostgreSQL服务器实例中,所有的数据库集合在一起构成了一个数据库簇。

提示:

读者一定要正确理解“数据库簇”的概念,不要将它误解为一个分布式数据库实例的集合。

为了便于管理,我们可以将同一个数据库中的对象(表、数据类型、函数、运算符等)划分成不同的逻辑组合,每一个逻辑组合被称为“模式”(具体内容参见第11章有关模式的相关内容)。

4.表空间(Tablespace)

表空间是一个存储位置,可以在其中保存底层数据库对象的实际数据。在PostgreSQL中,表空间允许数据库管理员定义一个文件系统位置,代表数据库对象(表、索引等)的文件可以存储在该文件目录下。

5.数据段(Segment)和数据页(Page)

每个表和索引都保存在一个单独的文件中,每个文件就是一个数据段(Segment)。

在默认情况下,当一个表或索引的大小超过1GB时,它会被拆分出另一个数据段。第1个数据段以PostgreSQL内部定义的filenode命名,第2个数据段则命名为filenode.1,以此类推。

一个数据段内部是以数据页的形式来组织的,数据页表示硬盘中的数据块,默认大小为8KB,最大为32KB,数据页的大小是在编译时确定的。行就存储在数据页中,由于每个数据页是等价的,因此一个特定的行可以存储在任意一个数据页中。

1.2.2 存储体系结构

1.2.1节介绍了PostgreSQL的几个基本概念,对数据库对象有了初步的认识,那么它们之间的关系是什么呢?下面了解一下它们的逻辑存储结构,如图1-1所示。

如图1-1所示,一个Database Cluster包含多个Database,在一个Database下可以创建多个Table,在Database与Table之间根据需要可以引入一层逻辑实体Schema。每个Table包含了多条Record,而每条Record由多个Field构成。上述不同粒度的逻辑实体是一个逐级包含的关系,这是一种典型的关系型数据库数据模型。

图1-1 PostgreSQL的逻辑存储结构

这些逻辑实体需要被保存到物理磁盘中才能实现持久化存储,实际上,PostgreSQL通过表空间和数据文件的方式实现逻辑实体到物理存储的转化。

表空间对应文件系统中的一棵目录树,每个数据库在表空间目录下有一个对应的子目录(以数据库的OID命名),每个表和索引都可以创建单独的数据文件,它们以表或索引的filenode命名,filenode可以在系统表pg_class中查询到。表还可以创建其他辅助数据文件,如图1-2中以_fsm和_vm为后缀的文件。图1-2展示了默认表空间$PGDATA/base的目录结构示意图。

图1-2 $PGDATA/base的目录结构示意图

表和索引的数据文件大小默认为1GB,当超过该阈值时系统会创建一个新的数据文件,并加上从“.1”开始的后缀名,这样的数据文件又被称为数据段。

1.2.3 进程体系架构

在开始使用PostgreSQL之前,有必要先理解它的体系架构。简单地说,PostgreSQL也采用了客户/服务器(Client/Server)模型,如图1-3所示。

图1-3 PostgreSQL进程体系架构

1.客户端

客户端(也称为“前端”)可以是多种形式,如基于文本的工具、图形化工具、基于数据库访问API的应用程序、数据库后台维护程序等。客户端通过TCP/IP网络连接到服务器端的进程,进行通信交互,实现对数据库的各种操作。

2.服务器端

服务器端(也称为“后端”)包含一组进程,它们负责管理数据库文件、接受来自客户端的连接请求、为客户端执行各种数据库操作等。

PostgreSQL采用了多进程架构,其主进程叫作Postmaster(其程序名叫作postgres)。当接受新的客户端连接请求之后,Postmaster会创建一个新的postgres服务进程,并让该服务进程专门服务新的客户端连接,直到该连接关闭为止。

除postgres服务进程外,Postmaster在启动过程中还会启动一组后台管理维护进程,包括bgWriter、WAL Writer、Checkpointer、Auto Vacuum等进程,实现刷写脏页、记录WAL日志、空间回收等功能。