PostgreSQL数据库 postgres.bki 文件学习

688 篇文章 11 订阅 ¥99.90 ¥299.90
223 篇文章 6 订阅
本文探讨了PostgreSQL数据库中postgres.bki文件的作用,该文件在数据库集群初始化时至关重要。通过genbki.sh脚本,结合pg_*.h头文件中的系统表定义,生成BKI命令并写入postgres.bki,用于bootstrap模式下创建模板数据库template1。BKI文件的内容用于在没有系统表的情况下执行数据库操作。
摘要由CSDN通过智能技术生成

    此文件主要用于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文件中;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值