广告
返回顶部
首页 > 资讯 > 数据库 >postgres initdb 初始化
  • 497
分享到

postgres initdb 初始化

postgresinitdb初始化 2014-11-18 07:11:44 497人浏览 才女
摘要

语法说明: initdb [option...] [ --pgdata | -D ] directory 参数解析: -A authmethod --auth=authmethod 这个选项为本地用户指定在pg_hba.conf中使用的默

postgres initdb 初始化

语法说明:

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

参数解析:

  • -A authmethod
  • --auth=authmethod 这个选项为本地用户指定在pg_hba.conf中使用的默认认证方法 (host和local行)。 initdb将使用指定的非复制身份验证方法以及复制连接预填充 pg_hba.conf条目。 除非你信任你系统上的所有本地用户,不要使用trust。为了安装方便,trust是默认值。
  • --auth-host=authmethod 这个选项为通过 tcp/IP 连接的本地用户指定在pg_hba.conf中使用的认证方法(host行)。
  • --auth-local=authmethod 这个选项为通过 Unix 域套接字连接的本地用户指定在pg_hba.conf中使用的认证方法(local行)。
  • -D directory
  • --pgdata=directory 这个选项指定数据库集簇应该存放的目录。这是initdb要求的唯一信息,但是你可以通过设定PGDATA环境变量来避免书写它,这很方便因为之后数据库服务器(postgres)可以使用同一个变量来找到数据库目录。
  • -E encoding
  • --encoding=encoding 选择模板数据库的编码。这也将是后来创建的任何数据库的默认编码,除非你覆盖它。默认值来自于区域,或者如果该值不起作用则为sql_ASCII。postgresql服务器所支持的字符集在第 23.3.1 节中描述。
  • -k
  • --data-checksums 在数据页面上使用校验码来帮助检测 I/O 系统造成的损坏。启用校验码将会引起显著的性能惩罚。这个选项只能在初始化期间被设置,并且以后不能修改。如果被设置,在所有数据库中会为所有对象计算校验码。
  • --locale=locale 为数据库集簇设置默认区域。如果这个选项没有被指定,该区域将从initdb所运行的环境中继承。区域支持在第 23.1 节中描述。
  • --lc-collate=locale
  • --lc-ctype=locale
  • --lc-messages=locale
  • --lc-monetary=locale
  • --lc-numeric=locale
  • --lc-time=locale 和--locale相似,但是只在指定的分类中设置区域。
  • --no-locale 等效于--locale=C。
  • -N
  • --no-sync 默认情况下,initdb将等待所有文件被安全地写到磁盘。这个选项会导致initdb不等待就返回,这当然更快,但是也意味着一次后续的操作系统崩溃可能让数据目录损坏。通常,这个选项对测试有用,但是不应该在创建生产安装时使用。
  • --pwfile=filename 让initdb从一个文件读取数据库超级用户的口令。该文件的第一行被当作口令。
  • -S
  • --sync-only 安全地把所有数据库文件写入到磁盘并退出。这不会执行任何正常的initdb操作。
  • -T config
  • --text-search-config=config 设置默认的文本搜索配置。详见default_text_search_config。
  • -U username
  • --username=username 选择数据库超级用户的用户名。这个的默认值是实际运行initdb的用户的名称。超级用户的名字是什么真的不重要,但是你可以选择保留常用的名字postgres,即使操作系统的用户名不同。
  • -W
  • --pwprompt 让initdb提示要求为数据库超级用户给予一个口令。如果你没有计划使用口令认证,这就不重要。否则在你设置一个口令之前你就无法使用口令认证。
  • -X directory
  • --waldir=directory 这个选项指定预写日志会被存储在哪个目录中。 其他较少使用的选项:
  • -d
  • --debug 打印来自引导后端的调试输出以及普通大众不那么感兴趣的一些消息。引导后端被程序initdb用来创建目录表。这个选项会生成大量极端无聊的输出。
  • -L directory 指定initdb应从哪里寻找它的输入文件来初始化数据库集簇。这通常没有必要。如果你需要显式指定它们的位置,你应该被告知。
  • -n
  • --no-clean 默认情况下,当initdb确定有一个错误阻止它完整地创建数据库集簇,它会移除在它发现无法完成任务之前创建的任何文件。这个选项会抑制这种整理并且对调试有用。 其他选项:
  • -V
  • --version 打印initdb版本并退出。
  • -?
  • --help

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

二、初始化代码解析:

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

  • help和version直接解析并返回

  • getopt_long:从参数中获取有效值,进行基本信息填充

  • 判断解析到的参数值是否有效

  • 设置wal日志

  • setup_pgdata设置路径

  • setup_bin_path获取其他可执行文件路径

  • 设置相关信息 …

  • initialize_data_directory初始化

    • setup_signals
    • create_data_directory、create_xlog_or_symlink创建文件夹
    • write_version_file写版本文件PG_VERSION
    • test_config_settings测试基本配置是否成功
    • setup_config相关信息写入配置文件postgresql.conf
    • bootstrap_template1将postgres.bki文件中的信息取出,在bootstrap 模式下运行 BKI script 来创建 template1数据库
    • write_version_file("base/1");在pg_data/base/1/PG_VERSION中写入postgresql的主版本
    • PG_CMD_OPEN;打开 "/home/perrynzhou/Database/pgsql/bin/postgres" --single -F -O -j -c search_path=pg_catalog -c exit_on_error=true template1 >/dev/null 命令,等待执行命令
    • setup_auth(cmdfd);通过执行" REVOKE ALL on pg_authid FROM public"授权
    • setup_depend(cmdfd);往系统表pg_xxx插入默认的数据
    • setup_sysviews(cmdfd);在template1中执行system_views.sql 语句
    • setup_description(cmdfd);初始化系统表xxx_description
    • setup_collation(cmdfd);初始化系统表pg_collation
    • setup_dictionary(cmdfd);执行snowball_create.sql语句
    • setup_privileges(cmdfd);初始化授权相关的表
    • setup_schema(cmdfd);通过执行infORMation_schema.sql初始化information_schema表,
    • load_plpgsql(cmdfd);执行 CREATE EXTENSION plpgsql语句
    • vacuum_db(cmdfd);/执行ANALYZE和VACUUM FREEZE
    • make_template0(cmdfd);通过template1初始化template0
    • make_postgres(cmdfd);创建postgres数据库
  • 显示成功,告诉用户怎么使用

三、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文件的结构必须是这样的:

  • create bootstrap 其中一个关键表
  • insert 数据,这些数据至少描述这些关键表本身
  • close
  • 重复创建和填充其它关键表
  • create (不带 bootstrap)一个非关键表
  • open
  • insert需要的数据
  • close
  • 重复创建其它非关键表
  • 定义索引和toast表
  • build indices 当然,肯定还有其它未记录文档的顺序依赖关系。

例子

下面的命令将创建名为 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

  • 1、FormData_pg_proc结构体中添加int16 newvalue BKI_DEFAULT(999);
  • 2、pg_proc_d.h中添加#define Anum_pg_proc_newvalue 30
  • 3、pg_proc.dat的每个表插入添加newvalue选项
{ 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        | 

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

  • 1、表的增删改查
  • 2、该列明的具体操作
您可能感兴趣的文档:

--结束END--

本文标题: postgres initdb 初始化

本文链接: https://www.lsjlt.com/news/6182.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • postgres initdb 初始化
    语法说明: initdb [option...] [ --pgdata | -D ] directory 参数解析: -A authmethod --auth=authmethod 这个选项为本地用户指定在pg_hba.conf中使用的默...
    99+
    2014-11-18
    postgres initdb 初始化
  • 002-postgres initdb 初始化
    语法说明: initdb [option...] [ --pgdata | -D ] directory 参数解析: -A authmethod --auth=authmethod 这个选项为本地用户指定在pg_hba.conf中使用的默...
    99+
    2016-12-11
    002-postgres initdb 初始化
  • informix 初始化
    [informix@python ~]$ cat   .bash_profile PATH=$PATH:$HOME/binexport PATHexport INFORMIXD...
    99+
    2022-10-18
  • OGG在RAC上的初始化(下)-- OGG初始化
    上篇地址http://blog.itpub.net/29047826/viewspace-1284906/ 1,源端执行RMAN全库备份 备份路径为节点node1的本地磁盘。为了将该备份复制到灾备端,此次...
    99+
    2022-10-18
  • MYSQL的初始化
    #一 MYSQL安装后 应该进行初始化 ##首先配置好环境变量 在此电脑中的属性 配置信息如下 ## 初始化MYSQL 在mysql的根目录中创建一个my.ini的文档 my.in...
    99+
    2023-10-03
    mysql 数据库 Powered by 金山文档
  • AS3 Vecter初始化
    var vec : Vecter.<Point> = new <Point>[     new Point(1,1),     new Point(1,2) ];类似于 Array的初始化的方法。 var arr :...
    99+
    2023-01-31
    初始化 Vecter
  • Python list初始化
    1、基本方法。lst = [1, 2, 3, 4, 5]2、初始化连续数字。>>> lst = [n for n in range(5, 10)] >>> print(lst) [5, 6, 7, 8, ...
    99+
    2023-01-31
    初始化 Python list
  • Servlet如何初始化
    这篇文章主要为大家展示了“Servlet如何初始化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Servlet如何初始化”这篇文章吧。有时候,我们需要仅仅是在服务启动,而非其他更为复杂的定时任务...
    99+
    2023-06-17
  • win10如何初始化
    这篇文章主要介绍“win10如何初始化”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“win10如何初始化”文章能帮助大家解决问题。首先点击左下角开始菜单,打开“设置” 接着进入其中“更新和安全”选项...
    99+
    2023-07-02
  • MySQL 初始化安装
    下载mysql编译后的包,解压到/export/local/ (具体根据自己使用情况而定)下一、添加mysql用户和用户组1、groupadd mysql2、useradd -r -g mysql mysq...
    99+
    2022-10-18
  • mysql初始化设置
    ...
    99+
    2018-11-24
    mysql初始化设置
  • 初始化配置wordpress
    前言:    上文主要讲到的是搭建wordpress的运行环境,本问将主要讲一下如何配置数据库,和wordpress以使此博客系统可以访问。正文: &nbs...
    99+
    2022-10-18
  • Hibernate如何初始化
    小编给大家分享一下Hibernate如何初始化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hibernate有两种配置文件格式,一种是XML,默认为hibern...
    99+
    2023-06-17
  • bash初始化机制
    这篇文章主要介绍了详解bash中的初始化机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。Bash初始化文件...
    99+
    2023-06-05
  • java初始化分析
    关于初始化的一点体会 [@more@]class Egg2 {static int i=5; int j=5; static//父类静态变量初始化块首先被执行,在main方法之前。 { System.out.println("superCl...
    99+
    2023-06-03
  • eclipse如何初始化
    要初始化Eclipse,您可以按照以下步骤操作:1. 下载并安装Eclipse:首先,您需要从Eclipse官方网站下载适合您操作系...
    99+
    2023-08-29
    eclipse
  • Win10怎样初始化电脑?Win10初始化电脑的方式
    当电脑初始化系统软件后操作系统会复原到刚安裝情况并清理数据文档,也就是等同于将电脑恢复到刚选购时的情况。那麼Win10应当怎样初始化电脑呢?还不清楚具体步骤的小伙伴们,可以参照下列实际操作哦,期待对你有些协助。Win10初始化电脑的方式:最...
    99+
    2023-07-14
  • Java中实例初始化和静态初始化的过程详解
    目录一、实例初始化1.1 实例初始化过程1.2 实例初始化的顺序1.3 实例初始化的注意事项二、静态初始化2.1 静态初始化过程2.2 静态初始化的顺序2.3 静态初始化的注意事项三...
    99+
    2023-05-18
    Java实例初始化和静态初始化 Java实例初始化 Java静态初始化 Java初始化
  • 【vue3+ts】项目初始化
    1、win+r呼出cmd,输入构建命令 //用vite构建npm init vite@latest//用cli脚手架构建npm init vur@latest 2、设置vscode插件 搜索volar...
    99+
    2023-10-12
    前端
  • 云服务器初始化
    云服务器初始化是指在开始运行服务器之前,将所有的数据和资源准备好,包括硬件、存储、网络、操作系统等等,以便在服务器运行期间进行快速配置和安装。以下是云服务器初始化的几个步骤: 确定需要的硬件和软件配置:在准备开始运行服务器之前,需要确定...
    99+
    2023-10-26
    初始化 服务器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作