十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
今天就跟大家聊聊有关如何进行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配置参数值的变更有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。