文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

postgres initdb 初始化

2014-11-18 07:48

关注

postgres initdb 初始化

语法说明:

initdb [option...] [ --pgdata | -D ] directory

参数解析:

显示有关initdb命令行参数的帮助并退出。

二、初始化代码解析:

postgresql-12.2srcininitdb文件夹中的initdb.c文件 main函数:

三、bki文件解析

在pg的源码src/backend/catalog/genbki.pl中包含了相关的脚本。在编译pg时,会执行这个脚本、生成一个postgres.bki文件(默认在/usr/local/pgsql/share目录下)

BKI(后端接口)介绍

后端接口(BKI)是用一些特殊语言写的脚本,这些脚本是 PostgreSQL后端可以理解,以特殊的 "bootstrap" 模式执行. 这种模式允许在不存在系统表的零初始条件下执行数据库函数,而普通的SQL命令要求系统表必须存在。 因此BKI文件可以用于在第一时间创建数据库系统,并且除此以外可能也没有其它用处。 在创建一个新的数据库集群时,initdb 使用BKI文件 来完成部分工作。initdb使用的文件是作为编译 PostgreSQL的一部分,由一个叫genbki.pl的程序创建,这个程序读取源代码树木录的src/include/catalog/目录里的几个特殊C开头的文件。生成的BKI文件叫postgres.bki,并且通常安装在安装目录里的share子目录系统初始化的BKI文件的结构. open命令打开的表需要系统事先存在另外一些基本的表 ,在这些表存在并拥有数据之前,不能使用open命令。 这些最低限度必须存在的表是 pg_class, pg_attribute, pg_proc, and pg_type。 为了允许这些表自己被填充, 带bootstrap 选项的create 隐含打开所创建的表用于插入数据。 同样, declare index和declare toast 命令也不能在它们所需要的系统表创建并填充之前使用。 因此,postgres.bki文件的结构必须是这样的:

例子

下面的命令将创建名为 test_table的表,它的OID是420,该表有两个字段cola和colb , 字段类型分别为int4和text, 然后向该表插入两行:

create test_table 420 (cola = int4, colb = text) open test_table insert OID=421 ( 1 "value1" ) insert OID=422 ( 2 null ) close test_table

四、系统表字段增加

为pg_database增加一个字段 datdummy,打开 /src/include/catalog/pg_database.h:

CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO {
    NameData datname; 
    #ifdef CATALOG_VARLEN  
    #endif 
} FormData_pg_database;
 
typedef FormData_pg_database *Form_pg_database;

#define Natts_pg_database 13 
#define Anum_pg_database_datname 1
#define Anum_pg_database_datdba 2
#define Anum_pg_database_encoding 3
#define Anum_pg_database_datcollate 4 
#define Anum_pg_database_datctype 5
#define Anum_pg_database_datistemplate 6
#define Anum_pg_database_datallowconn 7
#define Anum_pg_database_datconnlimit 8 
#define Anum_pg_database_datlastsysoid 9 
#define Anum_pg_database_datfrozenxid 10 
#define Anum_pg_database_datminmxid 11
#define Anum_pg_database_dattablespace 12 
#define Anum_pg_database_datacl 13

1、在 dattablespace 下增加新定义:

int8 datdummy;

2、/src/include/catalog/pg_database.h中的后边字段序号的定义也是很重要的,必须按顺序修改,也要记得属性数相应修改:

#define Natts_pg_database 14 
#define Anum_pg_database_dattablespace 12 
#define Anum_pg_database_datdummy 13 
#define Anum_pg_database_datacl 14

3、/src/include/catalog/pg_database.dat预定义的数据库必须也要修改,null 前边增加 100的字段为 datdummy 数据:

[

{ oid => "1", oid_symbol => "TemplateDbOid",
  descr => "default template for new databases",
  datname => "template1", encoding => "ENCODING", datcollate => "LC_COLLATE",
  datctype => "LC_CTYPE", datistemplate => "t", datallowconn => "t",
  datconnlimit => "-1", datlastsysoid => "0", datfrozenxid => "0",
  datminmxid => "1", dattablespace => "pg_default", datdummy => 111, datacl => "_null_" },

]

4、编译运行

被脚本 genbki.pl 利用生成 postgresql.bki文件

insert OID = 1 ( template1 PGUID ENCODING "LC_COLLATE" "LC_CTYPE" t t -1 0 0 1 1663 111 null));

5、涉及到的相关表操作函数需要将该参数添加进去

例子

修改pg_proc

{ oid => "1242", descr => "I/O",
  proname => "boolin", prorettype => "bool", proargtypes => "cstring",
  prosrc => "boolin" , newvalue => "999"},

结果显示:

select * from pg_proc;
-[ RECORD 1 ]
-----------------------------------------------
oid             | 1242
proname         | boolin
pronamespace    | 11
proowner        | 10
prolang         | 12
procost         | 1
prorows         | 0
provariadic     | 0
prosupport      | -
prokind         | f
prosecdef       | f
proleakproof    | f
proisstrict     | t
proretset       | f
provolatile     | i
proparallel     | s
pronargs        | 1
pronargdefaults | 0
prorettype      | 16
proargtypes     | 2275
proallargtypes  | 
proargmodes     | 
proargnames     | 
proargdefaults  | 
protrftypes     | 
prosrc          | boolin
probin          | 
proconfig       | 
proacl          | 
newvalue        | 

注意:此处未增加相关命令的修改,实际修改时需要注意:

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯