引言我们在使用数据库时,是否想过,数据库运行的各种参数,如:端口、最大连接数等参数是从哪里获得的?如果数据库从多个来源都获得了某参数,那么数据库应优先使用哪个值?这些参数修改后何时生效? 参数来源对于参数来源,我们会整理出的参数来源包括:环境变量、命令行、配置文件、会话修改。 其实参数来源远不只这些,查阅pg的源码backend/utils/misc/guc.c,我们发现来源有14种,如default、environment variable、configuration file、client等,具体如下: 当我们不确定当前起作用的值来自哪里时,我们可以通过查看系统视图pg_settings获得某参数的来源。 参数设置过程数据库对参数的14种来源,有不同的处理过程,有些是在数据库启动时设置的,有些是在建立数据库连接时设置的,有些可以在连接建立后在会话级别进行设置。 来源为default的参数设置过程数据库在程序中将涉及到的所有参数根据参数类型的不同用5个数组进行定义: ConfigureNamesBool(bool型,如fsync)、 ConfigureNamesInt(int型,如shared_buffers)、 ConfigureNamesReal(浮点型变量,如random_page_cost)、 ConfigureNamesString(字符串型,如search_path)、 ConfigureNamesEnum(枚举型变量,如wal_level)。 这些数组定义了参数初始值、及参数合法性检查方法,对于int、real等,还设定了其最大值、最小值的范围。 下面以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- |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|