PostgreSQL学习笔记 ---- Initdb流程

执行 initdb 时,代码流程是从 src\bin\initdb\initdb.c 中的 main() 函数开始执行的:

  1. 根据用户的输入命令行获取输入的命令名(get_progname)。
  2. 设置系统编码为 LC_ALL,查找执行命令的绝对路径。
  3. 设置系统变量(pg_data等),获取系统配置文件的源文件路径( bki 等文件),并检查该路径的有效性。
  4. 设置中断信号处理函数
  5. 创建数据库目录
  6. 测试当前服务器系统性能
  7. 在 bootstrap 模式下创建模板数据库 template1
  8. 创建系统试图、系统表等,并初始化系统表的初始元组,复制 template1 来创建 template0 和 postgres
  9. 打印操作成功等相关信息,退出

初期准备和环境配置

获取程序实际名称

get_progname() 函数中调用 last_dir_separator() 读取用户从终端输入的 argv[0] 的最后一个 ‘/’ 的程序名称:

	nodir_name = last_dir_separator(argv0);
	if (nodir_name)
		nodir_name++;
	else
		nodir_name = skip_drive(argv0);

设置环境变量

设置环境变量主要通过函数 set_pglocale_pgservice

  • 首先设置或读取地域化信息 setlocale(),参数 LC_ALL 代表所有,“” 代表默认本地;
  • 获取到 initdb 的绝对路径 find_my_exec(),并存储在 my_exec_path 中,我的是 /home/sheep/pginstall/pg15.1/bin

帮助和版本信息

当用户不执行初始化动作,只是查看帮助信息或者版本信息时进入如下逻辑:

	if (argc > 1)
	{
   
		if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
		{
   
			usage(progname);
			exit(0);
		}
		if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
		{
   
			puts("initdb (PostgreSQL) " PG_VERSION);
			exit(0);
		}
	}

解析命令行选项

	while ((c = getopt_long(argc, argv, "A:dD:E:gkL:nNsST:U:WX:", long_options, &option_index)) != -1)
	{
   
		switch (c)
		{
   
			case 'A':
				authmethodlocal = authmethodhost = pg_strdup(optarg);
			......
			default:
				/* getopt_long already emitted a complaint */
				pg_log_error_hint("Try \"%s --help\" for more information.", progname);
				exit(1);
		}
	}

如上代码,主要是获取输入的命令后的参数选项;

其中 "A:dD:E:gkL:nNsST:U:WX:" 中每个字母即代表一个命令行选项,带 : 表示该选项后面必须带参数值。

检查认证模式有效性

如下代码:

	check_authmethod_unspecified(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aSimpleSheep

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值