《PostgreSQL技术内幕——原理探索》第一章 数据库集簇,数据库,数据表

0    80    1

Tags:

👉 本文共约7642个字,系统预计阅读时间或需29分钟。

第一章和第二章简单介绍了一些PostgreSQL的基础知识,有助于读者理解后续章节的内容。本章包括以下几个主题:

  • 数据库集簇(database cluster)的逻辑结构
  • 数据库集簇的物理结构
  • 堆表(heap table)文件的内部布局
  • 从表中读写数据的方式

如果你已经熟悉这些内容,可以跳过本章。

1.1 数据库集簇的逻辑结构

数据库集簇(database cluster)是一组数据库(database) 的集合,由一个PostgreSQL服务器管理。第一次听到这个定义也许会令人疑惑,PostgreSQL中的术语“数据库集簇”,并非 意味着“一组数据库服务器”。 一个PostgreSQL服务器只会在单机上运行并管理单个数据库集簇。

图1.1展示了一个数据库集簇的逻辑结构。 数据库(database)数据库对象(database objects)的集合。 在关系型数据库理论中,数据库对象是用于存储或引用数据的数据结构。 (堆)表是一个典型的例子,还有更多种对象,例如索引,序列,视图,函数等。 在PostgreSQL中数据库本身也是数据库对象,并在逻辑上彼此分离。 所有其他的数据库对象(例如表,索引等)归属于各自相应的数据库。

图1.1 数据库集簇的逻辑结构

《PostgreSQL技术内幕——原理探索》第一章 数据库集簇,数据库,数据表

在PostgreSQL内部,所有的数据库对象都通过相应的对象标识符(Object Identifiers, OID)进行管理,这些标识符是无符号的4字节整型。数据库对象与相应OID之间的关系存储在相应的系统目录中,依具体的对象类型而异。 例如数据库和堆表对象的OID分别存储在pg_databasepg_class中,因此当你希望找出OID时,可以执行以下查询:

1.2 数据库集簇的物理结构

数据库集簇在本质上就是一个文件目录,名曰基础目录(base directory),包含着一系列子目录与文件。 执行 initdb 命令会在指定目录下创建基础目录从而初始化一个新的数据库集簇。 通常会将基础目录的路径配置到环境变量PGDATA中,但这并不是必须的。

图1.2 展示了一个PostgreSQL数据库集簇的例子。 base子目录中的每一个子目录都对应一个数据库,数据库中每个表和索引都会在相应子目录下存储为(至少)一个文件;还有几个包含特定数据的子目录,以及配置文件。 虽然PostgreSQL支持表空间(Tablespace),但该术语的含义与其他RDBMS不同。 PostgreSQL中的表空间对应一个包含基础目录之外数据的目录。

图1.2 数据库集簇示例

《PostgreSQL技术内幕——原理探索》第一章 数据库集簇,数据库,数据表

后续小节将描述数据库集簇的布局,数据库的布局,表和索引对应的文件布局,以及PostgreSQL中表空间的布局。

1.2.1 数据库集簇的布局

官方文档中描述了数据库集簇的布局。 表1.1中列出了主要的文件与子目录:

表 1.1 基本目录下的数据库文件和子目录的布局(参考官方文档)

文件描述
PG_VERSION包含PostgreSQL主版本号
pg_hba.conf控制PosgreSQL客户端认证
pg_ident.conf控制PostgreSQL用户名映射
postgresql.conf配置参数
postgresql.auto.conf存储使用ALTER SYSTEM修改的配置参数(9.4或更新版本)
postmaster.opts记录服务器上次启动的命令行选项
子目录描述
base/每个数据库对应的子目录存储于此
global/数据库集簇范畴的表(例如pg_database),以及pg_control文件。
pg_commit_ts/事务提交的时间戳数据(9.5及更新版本)。
pg_clog/ (9.6-)事务提交状态数据(9.6及更老版本),在版本10中被重命名为pg_xact。CLOG将在5.4节中描述
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或更新版本)。 PostgreSQL函数pg_export_snapshot在此子目录中创建快照信息文件。
pg_stat/统计子系统的永久文件
pg_stat_tmp/统计子系统的临时文件
pg_subtrans/子事务状态数据
pg_tblspc/指向表空间的符号链接
pg_twophase/两阶段事务(prepared transactions)的状态文件
pg_wal/ (10+)WAL( Write Ahead Logging)段文件(10或更新版本),从pg_xlog重命名而来。
pg_xact/ (10+)事务提交状态数据,(10或更新版本),从pg_clog重命名而来。CLOG将在5.4节中描述。
pg_xlog/ (9.6-)WAL(Write Ahead Logging)段文件(9.6及更老版本),它在版本10中被重命名为pg_wal

1.2.2 数据库布局

一个数据库与base子目录下的一个子目录对应;且该子目录的名称与相应数据库的OID相同。 例如当数据库sampledb的OID为16384时,它对应的子目录名称即为16384。

1.2.3 表与索引相关文件的布局

每个小于1GB的表或索引都在相应的数据库目录中存储为单个文件。在数据库内部,表和索引作为数据库对象是通过OID来管理的,而这些数据文件则由变量relfilenode管理。 表和索引的relfilenode值通常与其OID一致,但也有例外,下面将详细展开。

让我们看一看表sampletbloidrelfilenode

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!
《PostgreSQL技术内幕——原理探索》第一章 数据库集簇,数据库,数据表后续精彩内容已被小麦苗无情隐藏,请输入验证码解锁本站所有文章!
验证码:
请先关注本站微信公众号,然后回复“验证码”,获取验证码。在微信里搜索“DB宝”或者“www_xmmup_com”或者微信扫描右侧二维码都可以关注本站微信公众号。

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦。
  • 18509239930
  • 个人微信

  • DB宝
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部