当前位置:   article > 正文

PostgreSQL体系架构介绍_pg内部结构

pg内部结构

PostgreSQL是最像Oracle的开源数据库,我们可以拿Oracle来比较学习它的体系结构,比较容易理解。PostgreSQL的主要结构如下:
在这里插入图片描述

1.存储结构

PG数据存储结构分为:逻辑存储结构和物理存储存储。其中:逻辑存储结构是内部的组织和管理数据的方式;物理存储结构是操作系统中组织和管理数据的方式。

1.1逻辑存储结构

数据库集簇是数据库对象的集合。

关系数据库理论中,数据库对象是用于存储或引用数据的数据结构。

表就是一个例子,还有索引、序列、视图、函数等这些对象。

在PostgreSQL中,数据库本身也是数据库对象,并且在逻辑上彼此分离。

除数据库之外的其他数据库对象(例如表、索引等)都属于它们各自的数据库,虽然它们隶属于同一个数据库集簇,但也无法直接从集簇中的一个数据库访问集簇中的另一个数据库对象。

数据库本身也是数据库对象,一个数据库集簇可以包含多个Database、多个User、每个Database以及Database中的所有对象都有它们的所有者:User。

在这里插入图片描述

  • 创建一个Database时,会为这个Database创建一个名为public的默认Schema,每个Database可以有多个Schema。

  • 在这个数据库中创建其他数据库对象时,如果没有指定Schema,都会在public这个Schema中。

  • Schema可以理解为一个数据库中的命名空间,在数据库中创建的所有对象都在Schema中创建。

  • 一个用户可以从同一个客户端连接中访问不同的Schema。

  • 不同的Schema中可以有多个相同的名称的Table、Index、View、Sequence、Function等数据库对象。

1.2物理存储结构

数据库的文件默认保存在initdb时创建的数据目录中。
在数据目录中有很多类型、功能不同的目录和文件。
除了数据文件之外,还有参数文件、控制文件、数据库运行日志及预写日志等。

1.2.1数据目录

数据目录用来存放PostgreSQL持久化数据,通常可以将数据目录路径配置为PGDATA环境变量。
PGDATA="/var/lib/postgresql/data"

在这里插入图片描述
而PostgreSQL的物理存储结构主要是指硬盘上存储的文件,包括:数据文件、日志文件、参数文件、控制文件、redo日志(WAL)

1.2.2数据文件(表文件)

先了解两个基础的数据库对象:OID和表空间。

OID

PostgreSQL中的所有数据库对象都由各自的对象标识符(OID)进行内部管理。
它们是无符号的4字节整型数。
数据库对象和各个OID之间的关系存储在适当的系统目录中,具体取决于对象的类型。
数据库的OID存储在pg_database系统表中,可以通过下面代码查询。

select oid, datname from pg_database where datname = '';
  • 1

数据库中的表、索引、序列等对象的OID存储在pg_class系统表中,可以通过如下代码获取这些对象的oid

select oid, relname, relkind from pg_class where relname ~ 'tb1';
  • 1
表空间

在PostgresSql中最大的逻辑存储单位是表空间。
数据库中创建的对象都保存在表空间中,如表、索引和整个数据库都可以被分配到特定的表空间中。
在创建数据库对象时,可以指定数据库对象的表空间,如果不指定则使用默认表空间也就是数据库对象的文件的位置。

初始化数据库目录时,会自动创建pg_default和pg_global表空间。

1.2.3 日志文件

logging_collector = on
log_destination = 'csvlog'
log_directory = '/home/postgres/pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_connections = on
log_disconnections = on
log_rotation_age = 1d
log_rotation_size = 20MB

# 记录用户登陆数据库后的各种操作,postgres日志里分成了3类,通过参数pg_statement来控制,
# 默认的pg_statement参数值是none,即不记录,可以设置ddl(记录create,drop和alter)、
# mod(记录ddl+insert,delete,update和truncate)和all(mod+select)。

log_statement = 'all'                   # none, ddl, mod, all

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

效果如下

[root@k8slys01 pgsmaster]# tail -f log/postgresql-2021-12-09_121245.csv
2021-12-09 12:20:06.077 UTC [47] LOG:  statement: select pg_switch_wal()
2021-12-09 12:20:06.158 UTC [47] LOG:  statement: select oid, datname from pg_database
2021-12-09 12:20:06.161 UTC [38] LOG:  statement: SELECT c.conkey FROM pg_constraint c WHERE c.contype = 'p' and c.conrelid = 1262
2021-12-09 12:20:06.167 UTC [47] LOG:  statement: SELECT * from pg_class
2021-12-09 12:20:06.182 UTC [38] LOG:  statement: SELECT c.conkey FROM pg_constraint c WHERE c.contype = 'p' and c.conrelid = 1259
2021-12-09 12:20:06.184 UTC [47] LOG:  statement: select pg_current_wal_lsn(),
        pg_walfile_name(pg_current_wal_lsn()),
        pg_walfile_name_offset(pg_current_wal_lsn())
2021-12-09 12:21:06.397 UTC [38] LOG:  statement: INSERT INTO "public"."tb_user"("name") VALUES ('33333') RETURNING *
2021-12-09 12:21:06.405 UTC [38] LOG:  statement: SELECT * FROM "public"."tb_user" WHERE "name" = '33333'

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

更复杂的以后独立写作

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/870365
推荐阅读
相关标签
  

闽ICP备14008679号