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日志、空间回收等功能。