Postgresql体系架构(三)-逻辑结构
- 逻辑概览
逻辑存储结构是内部的组织和管理数据的方式;主要包括数据库集群(Database Cluster)、数据库(Database)、表空间(Table Spaces)、数据库(Databases)、表(Tables)、索引(Indexes)等。
所有数据库对象都有各自的对象标识符oid(object identifiers),它是一个无符号的四字节整数,相关对象的oid都存放在相关的系统目录表中,比如数据库的oid和表的oid分别存放在pg_database,pg_class表中。
- 1. 数据库集群-Database Cluster
也叫数据库集簇。它是指有单个PostgreSQL服务器实例管理的数据库集合,组成数据库集群的这些数据库使用相同的全局配置文件和监听端口、共用进程和内存结构。一个DataBase Cluster可以包括:多个DataBase、多个User、以及Database中的所有对象。
- 2. 数据库-Database
数据库是数据库对象的集合。在关系数据库理论中,数据库对象是一种用于存储或引用数据的数据结构。(堆)表是一个典型的例子,还有许多其他的例子,如索引、序列、视图、函数。 在 PostgreSQL 中,数据库本身也是数据库对象,在逻辑上彼此分离。所有其他数据库对象 (如表、索引等)都属于各自的数据库。
数据库初始化之后自动会创建postgres、template0、template1三个数据库。
postgres数据库:这是默认的管理数据库,用于管理 PostgreSQL 服务器和用户角色。它包含了用于管理服务器和用户的系统表,例如 pg_roles、pg_database 等。通常不建议用于存储实际数据,而仅用于管理目的。
template0数据库:是一个不可修改的数据库,它是PostgreSQL的原始模板,包含了数据库的初始设置和结构。任何时候都不应对template0进行修改,因为它是一个干净的模板,用于在需要时创建一个新的、干净的数据库副本。使用template0创建数据库时,可以指定字符集和本地化设置。例如,可以指定编码为UTF-8,collate和ctype属性为特定的区域设置。template0主要用于在数据库损坏或需要恢复原始状态时使用。由于它是一个不可修改的模板,可以确保新创建的数据库始终基于一个干净的状态
template1数据库:是PostgreSQL中的一个模板数据库,可用于创建其他数据库的模板,在创建新数据库时提供基础设置和数据结构。与 template0 类似,也是一个模板数据库。但与template0 不同的是,template1 是可以被修改的,比如修改模版字符集、或者可以在其中创建用户自定义的对象,例如函数、表等。默认情况,我们新创建database会以template1库为模板进行创建。使用template1创建数据库时,不能指定新的字符集和本地化设置,只能使用与template1相同的设置 。template0不能连接,而template1可以连接并创建对象。当创建数据库时,如果不指定模板属性,PostgreSQL默认使用template1作为模板库。
1.3. 表空间 Tablespace
1.3.1. 表空间概述
PostgreSQL 表空间(Tablespace)是一种存储机制,允许数据库管理员将数据库对象(如表、索引等)存储在文件系统上的指定位置。表空间允许更灵活地管理存储资源,优化数据库性能。
1.3.2. 表空间的作用
- 存储管理:允许将数据库对象分布在不同的物理存储设备上,提高存储效率和访问速度。
- 性能优化:通过将频繁访问的数据对象放在高性能存储设备上,可以减少I/O延迟,提高数据库性能。
- 备份恢复:表空间使得数据库对象的备份和恢复更加灵活,可以单独备份或恢复特定的表空间。
- 存储扩展:随着数据量的增长,表空间允许轻松添加新的存储设备,扩展存储空间。
- 多对多的关系:在PostgreSQL集群中,一个表空间可以被多个数据库使用,而一个数据库也 可以使用多个表空间。
1.3.3. 表空间类型
- pg_global :系统字典表表空间,用于共享系统目录。如pg_database、pg_authid、pg_tablespace 等表以及它们的索引。
- pg_default :是 template1 和 template0 数据库的默认表空间,该表空间的物理文件存储在数据目录中的base目录中,如果没有给出 TABLESPACE 子句,则用于在数据库内创建的表、索引和临时文件的默认表空间。每当您在创建表/数据库而未在创建表语句中指定表空间时,它将转到 pg_default 表空间。
- 自定义表空间:用户创建的表空间。对应文件系统目录$PGDATA/pg_tblspc/。当手动创建表空间时,该目录下会自动生成一个软链接,指向表空间设定的路径。
[postgres@pgserver01 ~]$ ls -l $PGDATA/pg_tblspc/
- 4.模式Schema
PostgreSQL中的Schema是一个逻辑容器,用于组织和管理数据库对象,如表、视图、函数等。Schema可以帮助区分不同用户或应用程序的数据,避免命名冲突,并提供更好的安全性和可管理性。
Schema的基本概念和用途
Schema在PostgreSQL中类似于一个命名空间,它包含命名对象(如表、数据类型、函数和运算符),这些对象的名称可以与其他Schema中存在的其他对象的名称重复。通过将Schema名称作为前缀“限定”其名称,可以访问这些对象。此外,Schema还可以用于实现多租户架构、数据隔离和权限管理等功能。
创建数据库时会自动会创建information_schema、pg_catalog、pg_toast、public四个模式。
默认Schema
每个数据库都有一个默认的Schema,名为public
。当创建一个新的表时,如果没有指定Schema,表将被创建在public
Schema中。
PostgreSQL 语句CREATE SCHEMA 创建一个schema
1.5. 段-segment
一个段是分配给一个逻辑结构(一个表、一个索引或其他对象)的一组区,是数据库对象使用 的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。
- 每一个表和索引都存放到单独的数据文件中
- 文件名是表或索引的文件结点(filenode)编号
- 如果表或索引超过 1 GB 就会被分割为多个段
- 第一个段以文件结点(filenode)编号命名,第二个以及之后的段以filenode.1, filenode.2形式命名
- 数据大小编译安装时可设定相关参数:
./configure --help 查看 with-segsize 默认单个文件大小是1G
- 6.区-extent
区是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,PostgreSQL为该段分配一个新的范围
- 7. 块-block(Page)
数据块是PostgreSQL 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,是最小的逻辑部件。默认值8K。
- 8. 数据库对象-Database object
如:表、视图、索引、序列、函数等等。在PostgreSQL中的所有数据库对象都由各自的对象标识符(OID)进行内部的管理。例如,数据库的OID存储在pg_database系统表中,可以通过下面的语句进行查询。
2. 系统信息
2.1. 系统信息视图
Postgres 数据库的表元数据信息等都放置在pg_catalog schema中,包括系统表 、索引 、内置 数据类型、内置函数等。比如,常见的pg_class储存表的描述信息;
pg_database 存储已经创 建数据库的信息;pg_am 用于存储表访问方法的元数据。
\dS 将列出pg_catalog 模式中的pg_* 表并且显示系统信息
2.1. 系统管理函数
查看当前日志文件lsn位置:
select pg_current_wal_lsn();
查看某个lsn对应的日志名:
select pg_walfile_name('2/9817FE40');
查看表的数据文件路径,filenode:
select pg_relation_filepath('test'::regclass); select pg_relation_filenode('test');
查看表的oid:
select 'test'::regclass::oid;
查看当前会话pid:
select pg_backend_pid();
生成uuid
select gen_random_uuid();
重载配置文件信息:
select pg_reload_conf();
查看数据库启动时间:
select pg_postmaster_start_time();
查看用户表、列等权限信息:
select has_any_column_privilege(user,table,privilege);
select has_any_column_privilege(table,privilege);
select has_column_privilege(user,table,column,privilege);
select has_table_privilege(user,table,privilege);
查看当前快照信息:
select txid_current_snapshot();
查看对象的大小信息:
select pg_relation_size();
select pg_table_size();
select pg_total_relation_size();
物理、逻辑复制槽: pg_create/drop_physical_replication_slot(slotname); pg_create_logical_replication_slot(slotname,decodingname); pg_logical_slot_get_changes();
3. 分区表
3.1. 分区表定义
分区表是一种数据库优化技术,它允许将一个大表逻辑上划分为多个较小的、可管理的部分,这些部分被称为分区或子表。分区表在物理上是分开存储的,但在逻辑上仍作为一个整体呈现给用户。
3.2. 分区表的好处
提升查询性能:将数据按指定的规则分布落到到子分区,查询可以定位到一个或几个分区来限制查询扫描的数据量,以提高查询性能。
简化维护操作:分区表允许用户专注于表中的特定数据子集,简化了数据维护。添加、删除或归档数据变得更加容易,减少了管理开销并优化了存储使用。
增强并发性: 分区表支持并行查询执行,多个查询可以同时在不同的分区上运行
优化存储管理:可以将分区放到不同的表空间上,可以将 系统很少访问的分区放到廉价的磁盘上,也可以将系统长访问的分区存储到高速的存储上。
增强可扩展性:随着数据量增长,可通过增加分区来水平扩展。
数据归档:可以通过时间戳等字段将数据分区,以便更容易地归档和删除旧数据。
数据安全性:可以通过分区限制对某些数据的访问,从而提高数据安全性。
3.3. 分区表特点
PG 数据库表分区表的结构是由主表(父表)与分区表(子表)组成,主表是创建子表的模板, 它是一个正常的普通表,正常情况下它并不储存任何数据;分区表继承并属于一个主表,分区 表中存储所有的数据,主表与分区表属于一对多的关系,也就是说,一个主表包含多个分区表, 而一个分区表只从属于一个主表。
官方声明分区实现方式:声明式分区、继承分区;除此之外还支持其它的第三方分区管理方式,比如pathman扩展等。
声明分区也叫原生分区,从PG10版本开始支持,相当于“官方支持”的分区表,也是最为推荐 的分区方式。虽然与继承分区不一样,但是其内部也是用继承表实现的。声明式分区支持:范围分区、list分区、hash分区。
3.4. 分区表的分类
(1) 范围分区表
范围分区表一般指的一个分区的范围,然后把满足条件的行存放在该分区中,最常见的是以日 期做为分区条件,根据时间段分为不同的分区,存放不同时间段的数据。
select
tableoid::regclass,
count(*)
FROM part_range
group by tableoid::regclass;
(2) list 分区表
list 分区以指定的分区值将数据存放到对应的分区上,然后把满足条件的行存放在该分区中, 最常见的是以某列值为分区条件,根据不同的列值存放在不同的分区。
SELECT
tableoid::regclass,
*
FROM part_range;
(3) hash 分区表
hash 分区将数据散列存储在各个分区上,以打散热点数据存放到对应的分区上,然后把满足条件的行存放在该分区中,最常见的是平均的把数据放在不同的分区。
SELECT
tableoid::regclass,
count(*)
FROM part_hash
group by tableoid::regclass;
(4) 混合分区表
PG分区下面也可以建立子分区构成级联模式,子分区可以有不同的分区方式,这样的分区称 为混合分区。
3.5. 分区表时需要注意的事项
分区策略选择:根据数据的特性和查询需求选择合适的分区策略(如范围分区、列表分区等)。
分区管理:定期检查和维护分区,如合并、拆分或删除不再需要的分区。
索引优化:在每个分区上创建适当的索引以提高查询性能。
约束和触发器:确保分区表上的约束和触发器在分区上正确应用。
性能监控:使用PostgreSQL的性能监控工具来评估分区表对查询性能的影响,并根据需要进行调整。
3.6. 分区表总结
不支持interval 分区,没有自带的自动新增分区功能;
只支持分区索引,不支持全局索引;
分区表的分区本身也是表,主表不存储数据,分区表存储数据; truncate,vacuum,analyze 主表会执行所有分区。truncate only 不能在主表上执行,但可以在存数据的分区表上执行,仅清除这个分区表; range,hash 分区的分区键可以有多个列,list分区的分区键只能是单个列或表达式;
default 分区表会接收不在声明的范围中的数据;如果没有default分区,插入范围外的数据会直接报错;
如果要新增分区,需要注意default分区中是否有这个新增分区的数据; partition of 创建的分区会自动创建主表上定于的索引、约束、行级触发器;