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 = '';
数据库中的表、索引、序列等对象的OID存储在pg_class系统表中,可以通过如下代码获取这些对象的oid
select oid, relname, relkind from pg_class where relname ~ 'tb1';
表空间
在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
效果如下
[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'
更复杂的以后独立写作