温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行PostgreSQL配置参数值的变更

发布时间:2021-10-20 17:48:21 来源:亿速云 阅读:172 作者:柒染 栏目:大数据

今天就跟大家聊聊有关如何进行PostgreSQL配置参数值的变更,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

配置参数(或者叫GUC变量,grand unified configuration)常见的就是出现在 postgresql.conf 中的设置项,更多信息可查看文档 19. Server Configuration ,我主要讲他们在代码中是如何设置和发挥作用。

1、参数值变更函数定义

void
SetConfigOption(const char *name, const char *value,
				GucContext context, GucSource source)

第一个参数是参数名,第二个是字符串表示的值,第三个是调用它的修改动作上下文,第四个是参数来源。

2、初始化时的两个例子

	SetConfigOption("transaction_deferrable", "no",
					PGC_POSTMASTER, PGC_S_OVERRIDE);

和读取环境变量(InitializeGUCOptionsFromEnvironment()

SetConfigOption("port", env, PGC_POSTMASTER, PGC_S_ENV_VAR);

读到一个 config_generic 结构体成员 vartype 是 PGC_BOOL,既可以知道它实际指向的是一个 config_bool 类型结构体。

SetConfigOption 只是封装调用 set_config_option,下边我们从后者的代码逻辑看参数各定义的作用。

3、函数 set_config_option 第三个参数

前边我们提到参数上下文,并且大家也知道有些参数是不允许启动后修改,就是这个上下文控制:

else if (context != PGC_POSTMASTER)
{
  ereport(elevel,
      (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
       errmsg("parameter \"%s\" cannot be changed without restarting the server",
          name)));
  return 0;
}

参数修改方式可以知道它由什么方式(比如SET 命令)修改,也就知道修改时的上下文,与参数的定义比较,很容易就知道应该接受还是拒绝新值。

4、参数值的解析转换

设定的值其实都是字符串,也就是第二个参数const char *value,它需要转换成相应的值,比如枚举,折回去看枚举参数的定义:

  {
    {"backslash_quote", PGC_USERSET, COMPAT_OPTIONS_PREVIOUS,
      gettext_noop("Sets whether \"\\'\" is allowed in string literals."),
      NULL
    },
    &backslash_quote,
    BACKSLASH_QUOTE_SAFE_ENCODING, backslash_quote_options,
    NULL, NULL, NULL
  },

再来看 backslash_quote_options

static const struct config_enum_entry backslash_quote_options[] = {
	{"safe_encoding", BACKSLASH_QUOTE_SAFE_ENCODING, false},
	{"on", BACKSLASH_QUOTE_ON, false},
	{"off", BACKSLASH_QUOTE_OFF, false},
	{"true", BACKSLASH_QUOTE_ON, true},
	{"false", BACKSLASH_QUOTE_OFF, true},
	{"yes", BACKSLASH_QUOTE_ON, true},
	{"no", BACKSLASH_QUOTE_OFF, true},
	{"1", BACKSLASH_QUOTE_ON, true},
	{"0", BACKSLASH_QUOTE_OFF, true},
	{NULL, 0, false}
};

这里最后是由函数 parse_and_validate_value 进行检查和解析,有兴趣可以自行读代码。

5、带单位的值

shared_buffer = 128MB,我们应该都见过,它的定义是整数,由函数 parse_int 处理。它是内存单位(GUC_UNIT_BLOCKS),通过转换表 memory_unit_conversion_table 计算最终大小,也就是 shared_buffer 的转换定义:1MB = 1024 / (BLCKSZ / 1024) 个块。

看完上述内容,你们对如何进行PostgreSQL配置参数值的变更有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI