PostgreSQL的体系结构
PostgreSql主要有连接管理系统、编译执行系统、存储管理系统、事务系统、系统表5大部分组成,如下图所示
1. 系统表
1.数字字典时关系数据库系统管理控制信息的核心,在postgreSQl中系统表扮演者数字字典的角色
2.系统表是PostgreSql存放结果元数据的地方,存放系统信息普通表或视图,用户可以去修改这些表结构,但是又可能早成系统紊乱,所以不建议由人工维护,应交由系统自己维护
3.在postgreSql中每个数据库都有自己的一套系统表,在数据库创建时通过模板数据库模板中拷贝过来的
4.由于系统表中保存了数据库的所有元数据,所以系统运行时对系统表的访问是非常频繁的,为了提高系统新能,在内建中建立了共享的系统表CACHE,使用Hash函数和Hash表提高查询效率
-
主要系统表功能及依赖关系
-
pg_namespace
系统表 pg_namespace用于存储命名空间。命名空间SQL91模式下层的结构:每个名字空间有独立的关系,类型等集合,层次结构是:数据库.模式.表.属性 访问对象时按一下名字空间顺序搜索 - 特殊名字空间(special),仅用户创建模式 - 临时表名字空间(TEMP) - 系统表名字空间
属性名 数据类型 注释 nspname NameData(长度为64字节数组) 用于存放命名空间的名称 nsowner Oid 用于表示该命名空间的所有者,由于系统中每个用户也会分配一个Oid作为唯一标识,因此这里 nspower中只存储所有者的oid nspacl aclitem类型边长数据组 其中存放对于该名字空间的访问权限表 -
pg_tablespace
pg_tablespace存储表空间信息,将表放置在不同表空间有助于实施磁盘文件布局,在整个数据集族中只有一份,而不是每个数据库都要有自己的 pg_tablespace,这是一个共享表 PostgreSql里的表空间允许用户在文件系统里自定义表数据库对象的存放位置,可以控制磁盘的布局,可以将数据分布到不同的磁盘位置上。在分配磁盘空间已满时,可将数据分配到其他磁盘存储,同时可以使用数据模式安排磁盘位置,优化性能。
属性名 数据类型 注释 spcname NameData 表存储空间 spcowner Oid 表示该表空间的所有者,通常为创建表空间用户 spclocation Text( 实际是一种变长的字符串数据类型) 用于存储表空间的物理位置(操作系统目录路径) spcal aclitem类型的变长数组 存放对于该表空间的访问控制列表 -
pg_database
pg_database中存放了当前数据集族中数据库的信息,它也是一个在整个集族范围共享的系统表,该表中每一个元组就是表示集族中的一个数据库,每个数据库都被分配一个OID最为唯一标识,并且存储在对应元组的隐藏属性中。
属性名 数据类型 注释 datname NameData 表示数据库的名称 datdba Oid 数据库的拥有者 encoding int4 该数据表示数据库的字符集编码,比如0表示sql_ascII编码,6表示UTF8编码 datcollate NameData 数据库LC_COLLATE 设置 dattype NameData 数据库LC_TYPE 设置 datistemplate bool 该数据库是否可以作为创建其他数据的模板 datconnlimit int4 数据库允许的最大并发连接数,如果为-1表示对并发没有限制 datlastsysoid Oid 数据库中使用的最后的OID,在使用pg_dump时特别有用 datfrozenxid Transactionld 数据库中所有在这个事务ID之前的事务都被替换为一个永久“冻结”的ID,该属性用来跟踪该数据库是否需要进行vacuum(清理)操作 dattablespace Oid 数据库所在的表空间 datcongif text类型动态数组 数据库定义的GUI 参数 Daracl aclitem类型的变长数组 存放对于该数据库的访问权限列表 -
pg_class
pg_class存储表及与表类似结构的数据对象信息,包括索引、序列、视图、复合数据类型、TOAST表等
-
-
pg_type
pg_type存储数据类型信息
-
pg_attribute
pa_attributr存储表的属性信息,对于数据库中表中的每个属性都有一个元组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vdtKPkyR-1641737871642)(C:\Users\mzn45\AppData\Roaming\Typora\typora-user-images\image-20220109114938818.png)]
-
pg_index
pg_index存储索引的具体信息
-
系统表之前的依赖关系图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5B3y6iru-1641737871644)(C:\Users\mzn45\AppData\Roaming\Typora\typora-user-images\image-20220109115342823.png)]
2.数据集族
PostgreSQL安装完成后,在做任何其他事之前,必须先使用initdb程序初始化磁盘上的数据存储区,即数据集族。由PpostSql管理用户的数据库及系统数据库总称为数据集族。在数据集族中OID唯一标识一个数据库对象,这些对象可以是数据库、表、索引、视图、元组、类型等。
初始化数据集族包括创建数据系统所有数据的数据目录,创建共享的系统表,创建其他的配置文件和控制文件、并穿件三个数据库:模板数据库template1和template0、默认用户的数据库postgre.以后创建数据库时,template1中的内容都会被拷贝到之后创建的数据库中。而template0和postgre都是通过拷贝template1创建的
在每个具体的数据库在PGDATA/base下都会有一个对应的子目录,名字是该数据库系统表pg_database里的OID,每个索引都存储在所属数据库目录下的独立文件中,以该表或者索引的filenode号命名,该号被记录在该表的索引或系统表pg_calss中对应元组的refilenode属性中。表或索引超过1G后会拆分,后面的命名会递增,如refilenode1,refilenode2..
在表中存储较大的数据时,会有一个TOAST表以之关联,用于存储无法在数据行中放置的超大外置数据表,对应pg_class元组的reltoastrelid属性,记录了TOAST表的OID
3.守护进程
多用户模式下一个数据库实例由数据库服务器守护进程Postmaster来管理。它是一个运行在服务器上的总控进行,负责整个系统的启动和关闭,并且在服务进程出现错误时完成系统的回复。它管理数据库文件、监听并接收来自客户端的连接请求。并为客户端连接请求fork一个Postgres服务进程,来代表客户端在数据库上执行各种命令,同时还管理与数据库运行相关的辅助进程。
-
初始化内存上下文
内存上下文释放时会释放在其中分配的所有内存,这样即使某些内存没有被任何指针指向或忘记释放,我们都可以通过释放内存上下文来避免内存泄漏。
-
配置参数
GUC模块实现了多种数据类型的变量配置。这些参数可能会由不同的进程在不同的时机进行配置,系统会根据既定的优先权来确定什么情况下的配置参数可以生效
-
监听套接字
Postmaster首先调用SplitIdentifierString函数解析字符串ListenAddresses.得到多个服务器IP地址并构成一个list,然后取出每一个服务器地址,调用函数StreamServerPort在该地址上创建一个监听套接接口。并将返回的套接子描述符保存在整个数组ListenSocket的第一个值为-1的单元中
-
注册信号处理函数
通过信号处理函数,来控制整个系统的启停以及异常的处理
4.辅助进程
PostgreSQL的各个辅助进程完成特定的功能,支撑PostgreSQL系统和管理工作。在Postmaster进程中,为每个辅助进程设置了一个全局变量来表示进程号,并且每个进程号对应的值都为0,只有系统日志辅助进程在Postmaster进入监听循环之前都完成启动操作,在循环监听ServerLoop中,每次循环时都会检测各个辅助进程对应变量值是否为0,然后启动对应的复杂进程
5.服务进程Postgres
Postgres进程是实际的接受查询请求并调用相关模块处理查询的PostgreSqQL服务进程。它直接接受用户的命令进行编译执行,并将结果返回给用户。用户命令分为两种:一种是查询命令、即插入、删除、更新和选择四种命令。另一种是非查询命令,如创建/删除表、视图、索引等领了,服务进程根据不同的命令类型选择不同的策略进行处理。