目录

增加guc参数

 initdb参数传递

bootstrap模式

参数验证


新增controlfile参数pg_test_parameter,支持从initdb命令传递参数,使用场景是新增某些全局重要信息,如透明加密指定算法;

增加guc参数

        增加guc参数的目的是可以查询,pg源码是这样描述guc参数的:它是全局配置管理模式(包括set命令、conf配置文件或其他方式指定参数),我们postgresql.conf文件中所有参数都在这里面,但它是conf文件超集,还有一些配置是不能对用户提供的。

* Support for grand unified configuration scheme, including SET
* command, configuration file, and command line options.
* See src/backend/utils/misc/README for more information.
  • 1.
  • 2.
  • 3.

比如postgresql.conf中定义wal段大小的参数:

{"max_wal_size", PGC_SIGHUP, WAL_CHECKPOINTS,
			gettext_noop("Sets the WAL size that triggers a checkpoint."),
			NULL,
			GUC_UNIT_MB
		},
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

本次我们新增1个guc参数pg_test_parameter,直接仿照src/utils/misc/guc.c文件中的data_directory参数定义,这个参数指定后也是不允许修改的,并且在initdb和pg_ctl都需要指定,跟我们本次想实现的参数类似,但是两者的GucContext和config_group类型有差异;

{"data_directory", PGC_POSTMASTER, FILE_LOCATIONS,
			gettext_noop("Sets the server's data directory."),
			NULL,
			GUC_SUPERUSER_ONLY | GUC_DISALLOW_IN_AUTO_FILE
		},
		&data_directory,
		NULL,
		NULL, NULL, NULL
	},
    {
            {"pg_test_parameter", PGC_INTERNAL, PRESET_OPTIONS,
                    gettext_noop("Sets pg test parameter."),
                    NULL,
                    GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
            },
            &pg_test_parameter,
            NULL,
            NULL, NULL, NULL
    },
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

定义后就会有pg_test_parameter这个全局参数了,但是定义参数要用起来。 

 initdb参数传递

支持initdb方式传递pg_test_parameter,需要接受参数输入,这里增加-p的参数读取与参数解析逻辑,在/src/bin/initdb/initdb.c中:

//增加-p参数
	printf(_("  -p, --pg-test-parameter                show pg_test_parameter settings\n"));
//在main函数中把它定义为必须传递的参数
	static struct option long_options[] = {
        // ...
		{"pg-test-parameter", required_argument, NULL, 'N'}
        // ...
	};
//增加参数解析
	while ((c = getopt_long(argc, argv, "A:dD:E:gkL:nNsST:U:WX:p:", long_options, &option_index)) != -1)
	{
		switch (c)
		{
        // ...

            case 'p':
                pg_test_parameter = pg_strdup(optarg);
                break;
        // ...

		}
	}
// 增加日志
    if (pg_test_parameter)
    {
        printf(_("pg_test_parameter ok. \n"));
    }
    else
        printf(_("pg_test_parameter not ok..\n"));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

这里完成initdb的参数传递,直接通过initdb -p abc方式将pg_test_parameter参数设置成abc。这里传入后根据需要读取

// 增加参数读入


	while ((flag = getopt(argc, argv, "B:p:c:d:D:Fkr:x:X:-:")) != -1)
	{
		switch (flag)
		{
            // ...
            case 'p':
                pg_test_parameter = pstrdup(optarg);
                break;
 // ...
}
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

bootstrap模式

 增加bootstarp模式参数传入,待续

参数验证

initdb指定-p参数:

./initdb -D ~/data -p abc
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "en_US.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

creating directory /home/postgres/data ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
pg_test_parameter ok.

initdb: warning: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.

Success. You can now start the database server using:

    ./pg_ctl -D /home/postgres/data -l logfile start
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.

查看参数(调试中):

postgres=# show pg_test_parameter;
 pg_test_parameter
-------------------

(1 row)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.