2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不再支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

第 68 章 系统目录声明与初始内容

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

目录的结构声明在源代码树的 src/include/catalog/ 目录中以特殊格式的 C 头文件中。对于每个目录,都有一个以目录命名的头文件(例如,pg_classpg_class.h),它定义了该目录的列集以及其他一些基本属性,例如其 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文件格式。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。