配置文件guc.c

http://www.postgres.cn/docs/12/view-pg-settings.html

 Column      |  Type   | Collation | Nullable | Default | Storage  | Description

—————–+———+———–+———-+———+———-+————- name | text | | | | extended | 名称 setting | text | | | | extended | 配置 unit | text | | | | extended | 单位 category | text | | | | extended | 分类 short_desc | text | | | | extended | 描述 extra_desc | text | | | | extended | 附加描述 context | text | | | | extended | 上下文 vartype | text | | | | extended | 参数类型 source | text | | | | extended | 来源 min_val | text | | | | extended | 最小值 max_val | text | | | | extended | 最大值 enumvals | text[] | | | | extended | 枚举的允许值 boot_val | text | | | | extended | 默认值 reset_val | text | | | | extended | 当前session中reset 之后会设置的值 sourcefile | text | | | | extended | 设置文件 sourceline | integer | | | | plain | 文件行号 pending_restart | boolean | | | | plain | 修改文件是否需要重启生效 select name, setting, boot_val, reset_val, sourcefile, sourceline, pending_restart from pg_settings ; View definition: SELECT a.name, a.setting, a.unit, a.category, a.short_desc, a.extra_desc, a.context, a.vartype, a.source, a.min_val, a.max_val, a.enumvals, a.boot_val, a.reset_val, a.sourcefile, a.sourceline, a.pending_restart FROM pg_show_all_settings() a(name, setting, unit, category, short_desc, extra_desc, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, sourcefile, sourceline, pending_restart); Rules: pg_settings_n AS ON UPDATE TO pg_settings DO INSTEAD NOTHING pg_settings_u AS ON UPDATE TO pg_settings WHERE new.name = old.name DO SELECT set_config(old.name, new.setting, false) AS set_config

表中需要说明参数文件以及行号是因为可以在一个文件中配置多个相同参数,但是只有最后一个生效,另外,配置文件支持include操作,实现复杂配置

typedef enum { PGC_INTERNAL, 环境搭建之后无法修改,例如block大小,只能在编译或者初始化的时候设置 PGC_POSTMASTER, 修改后需要重启,一般是会影响整个环境的参数,例如节点类型,节点端口等。 PGC_SIGHUP, 不需要重启,修改之后使用SIGHUP信号通知其他进程获取文件重新获取或者直接修改值 PGC_SU_BACKEND, 可以在使用libpq链接的时候设置值 PGC_BACKEND, 和PGC_SU_BACKEND类似,但是PGC_SU_BACKEND需要时super用户才可以使用,而这项任何用户都可以 PGC_SUSET, 可以在session中直接设置值,但是需要时supper用户 PGC_USERSET 任何人都可以在随意设置 } GucContext;

PGC_SIGHUP之后的选项,几乎都可以在配置文件postgresql.conf中重新设置,但是需要使用信号触发重新读取,SQL可以使用 SELECT pg_reload_conf();,命令行可以使用 pg_ctl reload 一般配置在postgresql.conf中设置,但是也可以使用SQLALTER SYSTEM配置参数,次SQL会创建一个postgresql.auto.conf,然后设置参数,且触发其他进程重新加载配置,优先级在postgresql.conf之上,会覆盖postgresql.conf中的设置 不建议修改

在启动会话的时候使用 -c 或者 libpq 链接时候设置的值,此时它具有最最高优先级,后续无法修改,即使后续修改了默认值,也只会影响其他进程或者后续启动的进程

设置参数的方法

  1. set 允许在事务回滚,只能修改
  2. ALTER SYSTEM set 直接作用在文件系统,不能回滚
  3. ALTER DATABASE
  4. ALTER ROLE

context的检测规则,一些参数需要满足上下文条件才可以使用,或者使用权限更高的语句,例如alter system

    switch (record->context)
    {
        case PGC_INTERNAL:
            if (context != PGC_INTERNAL)
            {
                ereport(elevel,
                        (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
                         errmsg("parameter \"%s\" cannot be changed",
                                name)));
                return 0;
            }
            break;
        case PGC_POSTMASTER:
            if (context == PGC_SIGHUP)
            {
                prohibitValueChange = true;
            }
            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;
            }
            break;
        case PGC_SIGHUP:
            if (context != PGC_SIGHUP && context != PGC_POSTMASTER)
            {
                ereport(elevel,
                        (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
                         errmsg("parameter \"%s\" cannot be changed now",
                                name)));
                return 0;
            }

            break;
        case PGC_SU_BACKEND:
            if (context == PGC_BACKEND)
            {
                ereport(elevel,
                        (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                         errmsg("permission denied to set parameter \"%s\"",
                                name)));
                return 0;
            }
        case PGC_BACKEND:
            if (context == PGC_SIGHUP)
            {
                if (IsUnderPostmaster && !is_reload)
                    return -1;
            }
            else if (context != PGC_POSTMASTER &&
                     context != PGC_BACKEND &&
                     context != PGC_SU_BACKEND &&
                     source != PGC_S_CLIENT)
            {
                ereport(elevel,
                        (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),
                         errmsg("parameter \"%s\" cannot be set after connection start",
                                name)));
                return 0;
            }
            break;
        case PGC_SUSET:
            if (context == PGC_USERSET || context == PGC_BACKEND)
            {
                ereport(elevel,
                        (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
                         errmsg("permission denied to set parameter \"%s\"",
                                name)));
                return 0;
            }
            break;
        case PGC_USERSET:
            break;
    }