↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 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 / 7.0 / 6.5 / 6.4

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

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

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

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

为了创建目录文件并将这些初始数据装入其中,以引导模式运行的后端会读取一个包含命令和初始数据的 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 文件格式。

报告文档问题

阅读 上游文档. 通过 PostgreSQL 文档反馈表单.