# 第 71 章系统目录声明和初始内容

目录

71.1.系统目录声明规则

71.2.系统目录初始数据

71.2.1.数据文件格式

71.2.2.OID 分配

71.2.3.OID 参考查找

71.2.4.自动创建数组类型

71.2.5.编辑数据文件的方法

71.3.BKI 文件格式

71.4.BKI 命令

71.5.引导 BKI 文件的结构

71.6.BKI 示例

PostgreSQL 使用许多不同的系统目录来跟踪数据库对象的存在和属性,例如表和函数。物理上系统目录和普通用户表没有区别,但后端 C 代码知道每个目录的结构和属性,并且可以在低级别直接操作它。因此,例如,不建议即时更改目录的结构;这将打破 C 代码中关于目录行布局方式的假设。但是目录的结构可以在主要版本之间改变。

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

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

为了创建目录文件并将初始数据加载到其中,在引导模式下运行的后端读取包含命令和初始数据的 BKI(后端接口)文件。这postgres.bki在此模式下使用的文件是从上述头文件和数据文件准备的,同时构建 PostgreSQL 发行版,由名为的 Perl 脚本genbki.pl.尽管它特定于特定的 PostgreSQL 版本,postgres.bki独立于平台,安装在分享安装树的子目录。

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

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