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

第 75 章. 系统目录声明和初始内容

目录

75.1. 系统目录声明规则
75.2. 系统目录初始数据
75.2.1. 数据文件格式
75.2.2. OID 分配
75.2.3. OID 引用查找
75.2.4. 自动创建数组类型
75.2.5. 编辑数据文件的秘诀
75.3. BKI 文件格式
75.4. BKI 命令
75.5. 引导 BKI 文件的结构
75.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 文件是通过一个名为 genbki.pl 的 Perl 脚本从上述标头和数据文件中准备的,同时构建 PostgreSQL 发行版。尽管 postgres.bki 特定于某个 PostgreSQL 版本,但它与平台无关,并且安装在安装树的 share 子目录中。

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

大多数 PostgreSQL 开发人员不必直接关注 BKI 文件,但后端中几乎任何非平凡的功能添加都需要修改目录标头文件和/或初始数据文件。本章的其余部分提供了一些相关信息,并完整描述了 BKI 文件格式。