Chapter 69.系统目录声明和初始内容

目录

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

目录的结构在源树的src/include/catalog/目录中的特殊格式的 C 头文件中声明。特别是,对于每个目录,都有一个以目录命名的头文件(例如pg_class.h表示pg_class),该头文件定义了目录具有的列集,以及一些其他基本属性,例如其 OID。定义目录结构的其他关键文件包括indexing.h(用于定义所有系统目录中存在的索引)和toasting.h(用于定义需要一个目录的 TOAST 表)。

许多目录具有初始数据,必须在 initdb 的“引导”阶段将其装入其中,以使系统达到可以执行 SQL 命令的程度。 (例如,pg_class.h本身必须包含一个条目,其他系统目录和索引也必须包含一个条目.)此初始数据以可编辑的形式保存在也存储在src/include/catalog/目录中的数据文件中。例如,pg_proc.dat描述必须插入pg_proc目录中的所有初始行。

为了创建目录文件并将此初始数据加载到其中,以引导方式运行的后端读取包含命令和初始数据的 BKI(后端接口)文件。在此模式下使用的postgres.bki文件是在构建 PostgreSQL 发行版时,通过一个名为genbki.pl的 Perl 脚本从上述 Headers 和数据文件准备的。尽管postgres.bki特定于特定的 PostgreSQL 版本,但postgres.bki是平台无关的,并安装在安装树的share子目录中。

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

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