1.数据库集簇、数据库和数据表
数据库集簇的逻辑结构
它是一组数据库的集合,由一个Postgresql服务器管理。
--db oid
select datname,oid from pg_database;
--object oid
select relname,oid from pg_class;
数据库集簇的物理结构
本质上就是一个文件目录,即基础目录,包含一系列子目录与文件。执行initdb命令会在指定目录下创建基础目录。
| 文件 | 描述 |
|---|---|
| PG_VERSION | 包含PG主版本号 |
| pg_hba.conf | 控制Pg客户端认证 |
| pg_ident.conf | 控制pg用户名映射 |
| postgresql.conf | 配置参数 |
| postgresl.auto.conf | 存储使用alter system修改的配置参数 |
| postmater.opts | 记录服务器上次启动的命令行选项 |
| base/ | 每个数据库对应的子目录都存储在此 |
| global | 数据库集簇范畴的表(例如pg_database)及pg_control文件 |
| pg_commit_ts/ | 事务提交状态数据(9.6及以下),10之后被重命名为pg_xact |
| pg_dynshmem | 动态共享内存子系统中使用的文件(9.4及更高) |
| pg_logical/ | 逻辑解码的状态数据(9.4及更高) |
| pg_multixact/ | 多事务状态数据 |
| pg_notify/ | LISTEN/NOTIFY状态数据 |
| pg_repslot/ | 复制槽数据(9.4及更高) |
| pg_serial/ | 已提交的可串行化事务相关信息(9.1及更高) |
| pg_snapshots/ | 导出快照(9.2及更高),pg函数pg_export_snapshot在此目录中创建快照信息文件 |
| pg_stat | 统计子系统的永久文件 |
| pg_stat_tmp | 统计子系统的临时文件 |
| pg_subtrans/ | 子事务状态数据 |
| pg_tblspc/ | 指定表空间的符号链接 |
| pg_twophase/ | 两阶段事务的状态文件 |
| pg_wal/(10.0+) | WAL段文件(10.0或更高),从pg_xlog重命名而来 |
| pg_xact/(10+) | 事务提交状态数据,从pg_clog重命名而来 |
| pg_xlog/(9.6-) | WAL段文件,10.0被重命名为pg_wal |
--返回关系对于的文件路径
select pg_relation_filepath('sampletbl');
select relname,oid,relfilenode from pg_class where relname='sampletbl';
--索引和表文件大小单个最大1g,--with-segsize 可更改索引和表的最大文件大小
--_fsm 空间映射文件
--_vm 可见性映射文件
-
关于表空间布局
--执行create tablespace 指定目录创建表空间,new_tblspc
--实际路径/home/postgres/tblspc
--软连接 ls -l $PGDATA/pg_tblspc
--指定表空间
create table newtb1 (...) tablespace new_tblspc;
堆表文件的内部布局
数据文件(堆表、索引,也包括空闲空间映射和可见性映射)内部被划分为固定长度的页,或者叫区块,大小默认是8KB。
表的页面包含了三种类型的数据
- 堆元组,即数据记录本身。
- 行指针,每个行指针占4B,保存着指向堆元组的指针。
- 首部数据,页面起始位置分配了由结构PageHeaderData定义的首部数据。大小24B,页面的元数据。结构主要成员变量如下:
- pd_lsn,本页最近一次变更所写入的xlog记录对应的LSN。
- pd_checksum,本页面的校验和值
- pd_lower,pd_upper,指向行指针的末尾,后者指向最新堆元组的起始位置。
- pd_special,在索引页中会用到该字段。在堆表页中它指向尾页。
为了识别表中的元组,数据库内部会使用元组标识符(tuple identifier,TID).由一对值组成,分别是元组所属页面的区块号和指向元组的行指针的偏移号。
读写元组的方式
- 顺序扫描,通过扫描每一页中的行指针,依序读取所有页面中的所有元组
- B树索引扫描,索引文件包含索引元组,索引元组由一个键值对组成,键为被索引的列值,值为目标堆元组的TID。
--tid扫描,表中找到第0个页面中的第一个元组
select ctid,data from sampletbl where ctid='(0,1)';