postgresql GUC参数上下文介绍
1. 引言
PostgreSQL中的GUC(Grand Unified Configuration)参数是用于控制 PostgreSQL 行为的配置选项,这些配置参数的上下文权限对于保护数据库安全性和优化性能至关重要。本文将深入探讨六种 GUC 参数上下文权限,分析他们的差异以及相关的表现。
2. GUC 参数上下文权限概述
在 PostgreSQL 中,GUC 参数的上下文定义了该参数可以在哪些情况下被修改。有效的上下文权限控制可确保数据库维护稳定性与安全性。通过精细的权限管理,数据库管理员能够决定哪些用户可以更改哪些参数,影响系统的操作行为。
3. GUC 参数的六种上下文权限
- Internal:
- 描述:这些参数只能被系统内部使用,通常是 PostgreSQL 的默认设置。用户无法直接修改这类参数。
- 示例:如
block_size
的默认值通常是一个内部参数。
- Postmaster:
- 描述:这类参数只能在数据库集群启动时设置,影响整个 PostgreSQL 实例的行为。一旦数据库启动,这些参数将无法在运行时修改。
- 示例:
port
参数,决定数据库监听的端口。
- SIGHUP:
- 描述:可以通过向数据库实例发送 SIGHUP 信号来重新加载的参数。这些参数允许在不中断连接的情况下进行动态更改。
- 示例:如
log_min_messages
,可以通过 SIGHUP 信号更新日志级别。
- Backend:
- 描述:允许在后端(数据库会话)中修改的参数,细分包括(backend和backend-superuser)。这种类型的参数影响当前会话的行为。
- 示例:
ignore_system_indexes
表示读取系统表时忽略系统索引。
- UserSet:
- 描述:这些参数可以通过普通用户在会话中修改。允许用户在无需超级用户权限的情况下进行特定配置调整。
- 示例:如
search_path
,每个用户可以根据需要设置自己的搜索路径。
- SuSet:
- 描述:通过超级用户进行设置,这些修改可以影响全局或特定会话的配置。通常属于更高权限的调控。
- 示例:如
log_duration
,允许超级用户根据需求进行调整。
4. 查询参数上下文权限的方法
要查询 PostgreSQL 中的 GUC 参数及其上下文信息,可以利用系统视图 pg_settings
。下面的 SQL 语句展示了如何检索参数名称、当前设置与上下文类型:
SELECT name, setting, context FROM pg_settings;
通过这个查询,数据库管理员可以审查所有参数的上下文权限,进一步评估参数的设置对数据库性能和安全性的影响。
5. 设置参数的方法
1.修改配置文件
postgresql.conf
文件是 PostgreSQL 主要的配置文件,许多 GUC 参数的设置在这里定义。系统启动时,postmaster
上下文的参数从该文件加载。在运行时,通过 SIGHUP
信号可以动态修改某些参数,但若某参数标记为 postmaster
,依然无法修改。在服务器处理期间,单个会话可以使用 backend
或 userset
权限修改对应参数,而这些更改仅影响当前会话。
2.通过SQL影响参数
针对不同的上下文,存在两个SQL语句实现配置参数:
ALTER SYSTEM SET configuration_parameter { TO | = } { value [, ...] | DEFAULT }
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
其中,ALTER SYSTEM
被用来在整个数据库集簇范围内更改 服务器配置参数。它比传统的手动编辑postgresql.conf
文件的方法更方便。ALTER SYSTEM
会把给出的参数 设置写入到postgresql.auto.conf
文件中,该文件会随着 postgresql.conf
一起被读入。把一个参数设置为 DEFAULT
或者使用RESET
变体可以 把该配置项从postgresql.auto.conf
文件中移除。使用 RESET ALL
可以移除所有这类配置项。
SET
命令更改运行时配置参数。一些参数可以用 SET
即时更改(但是有些需要超级用户特权才能更改)。 SET
只影响当前会话所使用的值。
下表总结了不同上下文权限的参数,可以使用的设置参数的方法:
参数上下文权限 | 允许的设置方法 | 是否必须要重启 |
---|---|---|
internal | 无 | N/A |
postmaster | postgresql.conf | 是 |
ALTER SYSTEM SET | 是 | |
sighup | postgresql.conf | 否,可以使用pg_reload_conf() )发SIGHUP信号在本次会话生效 |
ALTER SYSTEM SET | 否,可以使用pg_reload_conf() )发SIGHUP信号在本次会话生效 |
|
backend | postgresql.conf | 否,且本次会话无法生效;需要使用pg_reload_conf() )发SIGHUP信号才能在下一次会话生效 |
ALTER SYSTEM SET | 否,且本次会话无法生效;需要使用pg_reload_conf() )发SIGHUP信号才能在新会话生效 |
|
userset | postgresql.conf | 否,但可以使用pg_reload_conf() )发SIGHUP信号在本次会话生效 |
SET | 否,直接生效 | |
suset | postgresql.conf | 否,但可以使用pg_reload_conf() )发SIGHUP信号在本次会话生效 |
SET | 否,直接生效 |
6. 设置参数举例
6.1backend上下文参数举例
以下将在pg14.13实例上,使用上下文权限为backend的参数ignore_system_indexes
举例,通过ALTER SYSTEM SET
进行设置。
1.在当前会话设置,但pg_reload_conf后仍无法生效:
2.在新的会话中生效:
6.2 sighup上下文参数举例
以下将在pg14.13实例上,使用上下文权限为sighup的参数log_hostname
举例,通过ALTER SYSTEM SET
进行设置。
在当前会话设置,在pg_reload_conf前未生效,但pg_reload_conf后可当前会话下立即生效: