首页 存档 技术 查看内容

postgresql-数据库参数生效规则

2018-3-30 13:00 |来自: 互联网 387 0

摘要: 引言 我们在使用数据库时,是否想过,数据库运行的各种参数,如:端口、最大连接数等参数是从哪里获得的?如果数据库从多个来源都获得了某参数,那么数据库应优先使用哪个值?这些参数修改后何时生效? 参数来源 ...

引言

我们在使用数据库时,是否想过,数据库运行的各种参数,如:端口、最大连接数等参数是从哪里获得的?如果数据库从多个来源都获得了某参数,那么数据库应优先使用哪个值?这些参数修改后何时生效?

参数来源

对于参数来源,我们会整理出的参数来源包括:环境变量、命令行、配置文件、会话修改。

其实参数来源远不只这些,查阅pg的源码backend/utils/misc/guc.c,我们发现来源有14种,如defaultenvironment variableconfiguration fileclient等,具体如下:

当我们不确定当前起作用的值来自哪里时,我们可以通过查看系统视图pg_settings获得某参数的来源。

参数设置过程

数据库对参数的14种来源,有不同的处理过程,有些是在数据库启动时设置的,有些是在建立数据库连接时设置的,有些可以在连接建立后在会话级别进行设置。

来源为default的参数设置过程

数据库在程序中将涉及到的所有参数根据参数类型的不同用5个数组进行定义:

ConfigureNamesBoolbool型,如fsync)、

ConfigureNamesIntint型,如shared_buffers)、

ConfigureNamesReal(浮点型变量,如random_page_cost)、

ConfigureNamesString(字符串型,如search_path)、

ConfigureNamesEnum(枚举型变量,如wal_level)。

这些数组定义了参数初始值、及参数合法性检查方法,对于intreal等,还设定了其最大值、最小值的范围。

下面以ConfigureNamesInt为例进行说明其数据结构及参数设置过程:

backend/utils/misc/guc.c定义了以上5类参数的数组:

static struct config_int ConfigureNamesInt[] =

ConfigureNamesInt数组的每个元素为config_int结构,在include/postgresql/server/utils/guc_tables.h定义了数组的结构,其结构体定义如下:

struct config_int

{

struct config_generic gen;

/* constant fields, must be set correctly in initial value: */

int*variable;

intboot_val;

intmin;

intmax;

GucIntCheckHook check_hook;

GucIntAssignHook assign_hook;

GucShowHook show_hook;

/* variable fields, initialized at runtime: */

intreset_val;

void*reset_extra;

};

可以看到,结构体包含一些变量:

gen:该变量config_generic结构体,包括名称、参数何时可以被设置、参数来源等信息。

variable:待赋值的全局变量,该变量是最终在数据库层面生效的变量。

boot_val:启动时默认值(即default值);

min:该参数最小值;

max:该参数可以设置的最大值;

GucIntCheckHook:检查值合法性的函数;…。

参数数组如下:

处理过程为:backend/utils/misc/guc.c通过遍历该数组,将boot_val赋予全局变量(pg的各参数均为全局变量),完成变量初始化的赋值。

static void

InitializeOneGUCOption(struct config_generic * gconf)

{

...

gconf-

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部