目录
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(后端接口) 文件,其中包含命令和初始数据。在构建 PostgreSQL 发行版时,通过名为 genbki.pl
的 Perl 脚本从上述头文件和数据文件准备用于此模式的 postgres.bki
文件。尽管它特定于某个 PostgreSQL 版本,但 postgres.bki
是平台无关的,并且安装在安装树的 share
子目录中。
genbki.pl
还会为每个目录生成一个派生的头文件,例如,对于 pg_class
目录,则生成 pg_class_d.h
。此文件包含自动生成的宏定义,并且可能包含其他宏、枚举声明等等,这些对于读取特定目录的客户端 C 代码可能很有用。
大多数 PostgreSQL 开发人员不需要直接关注BKI文件,但后端中几乎所有非平凡的功能添加都需要修改目录头文件和/或初始数据文件。本章的其余部分提供了一些关于此方面的信息,并且为了完整性,描述了BKI文件格式。
如果您在文档中发现任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。