此文件主要用于PostgreSQL数据库集簇初始化。
后端接口postgres.bki文件是在编译的过程中由/src/backend/catalog目录下的脚本程序genbki.sh读取/src/include/catalog目录下的以.h结尾的系统表定义文件(包括系统表索引和TOAST表定义文件)创建,并通常存放在安装树的share子目录下。
在pg_*.h(星号表示对应系统表的名称,每个这样的头文件对应一个系统表的结构定义)的头文件中包含如下内容的定义:定义CATALOG宏,用于以统一的模式去定义系统表的结构以及用以描述系统表的数据结构,如系统表pg_class的定义通过CATALOG(pg_class,1259)来表现。通过宏DATA(x)和DESCR(x)来定义insert操作,这样的Insert操作可能会有多个,用于定义系统表中的初始数据。以pg_class.h为例,其定义了系统relation关系表用于初始化关系表的内容(/src/include/catalog/pg_class.h)。
#ifndef PG_CLASS_H
#define PG_CLASS_H
#include "catalog/genbki.h"
/* pg_class definition. cpp turns this into typedef struct FormData_pg_class */
#define RelationRelationId 1259
CATALOG(pg_class,1259) BKI_BOOTSTRAP
{
NameData relname; /* class name */
Oid relnamespace;/* OID of namespace containing this class */
Oid reltype; /* OID of associated entry in pg_type */
......
85 #define RELKIND_SEQUENCE 'S' /* SEQUENCE relation */
86 #define RELKIND_UNCATALOGED 'u' /* temporary heap */
87 #define RELKIND_TOASTVALUE 't' /* moved off huge values */
88 #define RELKIND_VIEW 'v' /* view */
89 #define RELKIND_COMPOSITE_TYPE 'c' /* composite type */
90 #endif /* PG_CLASS_H */
模板数据库template1是通过运行在bootstrap模式的postgres程序读取postgres.bki文件创建的。BKI文件是一些用特殊语言写的脚本,这些脚本使PostgreSQL后端能够理解,且以特殊的bootstrap模式来执行之,这种模式允许在不存在系统表的零初始条件下执行数据库函数,而普通的SQL命令要求系统表必须存在。因此BKI文件仅用于初始化数据集簇。
在整个源代码被编译时,genbki.sh脚本会被调用,它将从每一个pg_*.h文件中读取系统表定义、系统表的初始化数据、系统表上的索引等信息,然后分别将其转换为对应的BKI命令,最后将所有BKI命令写入postgres.bki文件中;