PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

Chapter 68. 系统目录的声明与初始内容

Table of Contents

68.1. 系统目录声明规则
68.2. 系统目录初始数据
68.2.1. 数据文件格式
68.2.2. OID 分配
68.2.3. OID 引用查找
68.2.4. 数组类型的自动创建
68.2.5. 编辑数据文件的诀窍
68.3. BKI 文件格式
68.4. BKI 命令
68.5. 引导 BKI 文件的结构
68.6. BKI 示例

PostgreSQL 使用许多不同的系统目录来跟踪 数据库对象(例如表和函数)的存在与属性。 物理上系统目录与普通用户表没有区别,但后端 C 代码了解每个目录的结构和 属性,能够在低层级直接操纵它。 因此,例如试图即时修改目录的结构是不可取的;那会破坏 C 代码中内建的 关于目录行如何排布的假设。 不过,目录的结构可以在大版本之间变化。

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

许多目录拥有必须在 initdb 的 “bootstrap”(引导)阶段 载入的初始数据,以便让系统达到能够执行 SQL 命令的状态。 (例如,pg_class.h 必须包含它自己以及每个其他 系统目录和索引的条目。) 这些初始数据以可编辑的形式保存在同样位于 src/include/catalog/ 目录中的数据文件里。 例如,pg_proc.dat 描述了必须插入 pg_proc 目录的全部初始行。

为了创建目录文件并把初始数据载入其中,一个以 bootstrap 模式运行的后端 会读取一个包含命令和初始数据的 BKI(Backend Interface,后端接口)文件。 这种模式下使用的 postgres.bki 文件 是在构建 PostgreSQL 发行版时,由名为 genbki.pl 的 Perl 脚本从前述的头文件和数据文件 准备出来的。 postgres.bki 虽然特定于某个 PostgreSQL 发布版本,但它是平台无关的, 会被安装到安装树的 share 子目录中。

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

大多数 PostgreSQL 开发者不需要直接关注 BKI 文件,但后端中几乎所有非平凡的特性增加都需要 修改目录头文件和/或初始数据文件。 本章其余部分提供这方面的一些信息,并且为了完整性而描述 BKI 文件格式。