Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

第 67 章:系统目录声明和初始内容

目录

67.1. 系统目录声明规则
67.2. 系统目录初始数据
67.2.1. 数据文件格式
67.2.2. OID 分配
67.2.3. OID 引用查找
67.2.4. 自动创建数组类型
67.2.5. 编辑数据文件的食谱
67.3. BKI文件格式
67.4. BKI命令
67.5. 启动结构BKI文件
67.6. BKI 示例

PostgreSQL 使用许多不同的系统目录来跟踪数据库对象(如表和函数)的存在和属性。在物理上系统目录与普通用户表之间没有区别,但后端 C 代码了解每个目录的结构和属性,并可在底层直接对其进行操作。因此,例如,不建议尝试即时更改目录的结构;这将会破坏 C 代码中基于目录行布局的假设。但是,目录结构可以在版本之间发生更改。

目录的结构在源树的 src/include/catalog/ 目录中以特殊格式的 C 头文件来声明。对于每个目录,都有一个以该目录命名的头文件(例如,pg_class.h 对应于 pg_class),它定义了目录中的一组列,以及一些其他基本属性,如其 OID。

许多目录具有一些在 initdb引导 阶段必须加载到其中的初始数据,以使系统能够执行 SQL 命令。(例如,pg_class.h 必须包含它自己的一个条目,以及其他系统目录和索引。这些初始数据以可编辑的形式保存在 src/include/catalog/ 目录中,例如,pg_proc.dat 描述了必须插入到 pg_proc 目录中的所有初始行。

要创建目录文件并加载这些初始数据,运行在引导模式下的后端将读取一个包含BKI(后端界面) 文件,其中包含命令和初始数据。在此模式下使用的 postgres.bki 文件是根据上述头文件和数据文件,在构建 PostgreSQL 发行版时,由名为 genbki.pl 的 Perl 脚本准备的。尽管它特定于某个 PostgreSQL 版本,postgres.bki 是与平台无关的,它安装在安装树的 share 子目录中。

genbki.pl 还会为每个目录生成派生头文件,例如 pg_class 目录的 pg_class_d.h。此文件包含自动生成的宏定义,并且可以包含其他宏、枚举声明等,对于读取特定目录的客户端 C 代码来说是很有用的。

大多数 PostgreSQL 开发人员不必直接关心BKI文件,但是后端中几乎所有非平凡的特性新增都需要修改目录头文件和/或初始数据文件。本章余下部分对此及完整描述提供了相关信息BKI文件格式。