Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17 / 18

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

目录

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. bootstrap BKI 文件的结构
68.6. BKI 示例

PostgreSQL使用许多不同的系统目录来跟踪数据库对象(例如表和函数)的存在及其属性。系统目录与普通用户表在物理上没有区别,但后端 C 代码知道每个目录的结构和属性,并且能够在较低层次上直接操作它。因此,例如,试图在运行中修改某个目录的结构并不可取;那会破坏 C 代码中关于目录行布局方式的既有假设。不过,目录的结构可能会在主版本之间发生变化。

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

许多目录都有初始数据,这些数据必须在 initdbbootstrap 阶段装入其中,才能让系统达到可以执行 SQL 命令的程度。(例如,pg_class.h 必须包含它自身的一条记录,以及每个其他系统目录和索引的一条记录。)这些初始数据以可编辑形式保存在同样位于 src/include/catalog/ 目录中的数据文件里。例如,pg_proc.dat 描述了必须插入到 pg_proc 目录中的所有初始行。

为了创建目录文件并将这些初始数据装入其中,以 bootstrap 模式运行的后端会读取一个包含命令和初始数据的 BKI(Backend Interface,后端接口)文件。在构建 PostgreSQL 发行版时,会由名为 genbki.pl 的 Perl 脚本根据上述头文件和数据文件生成该模式所使用的 postgres.bki 文件。尽管 postgres.bki 针对特定的 PostgreSQL 发行版,但它与平台无关,并会安装到安装树的 share 子目录中。

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

大多数 PostgreSQL 开发者并不需要直接关心 BKI 文件,但后端中几乎任何稍有分量的功能新增,都需要修改目录头文件和/或初始数据文件。本章余下部分将提供一些相关信息,并且为求完整,也会描述 BKI 文件格式。