参考文档:http://www.postgres.cn/docs/12/config-setting.html
参数作用域
- 全局级参数
- 数据库级参数
- 角色级参数
- 会话级参数
参数优先级
会话级参数 > 角色级参数 > 数据库级参数 > 全局级参数
参数设置方法
全局级参数
方式1
修改postgresql.conf配置文件,并让主服务器进程收到SIGHUP信号(从命令行运行pg_ctl reload或调用 SQL 函数pg_reload_conf()来发送这个信号)
方式2
使用ALTER SYSTEM 更改一个服务器配置参数,并让主服务器进程收到SIGHUP信号(从命令行运行pg_ctl reload或调用 SQL 函数pg_reload_conf()来发送这个信号)
数据库级参数
ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT }
name:要被修改属性的数据库名称
configuration_parameter:属性名
value:属性值
PostgreSQL 数据库修改运行时配置变量的会话默认值。接下来只要一个新的会话在该数据库中开始, 指定的值就会成为该会话的默认值。数据库相关的默认值会覆盖在 postgresql.conf中出现或者从postgres 命令行接收到的设置。只有数据库拥有者或超级用户可以更改一个数据库的会话默认值。 一些变量不能用这种方式设置或者只能由超级用户设置。
角色级参数
ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT }
role_specification:要对其属性进行修改的角色的名称
database_name: 指定的数据库
configuration_parameter:属性名
value:属性值
例子:
为一个角色指定 maintenance_work_mem参数的非默认设置:
ALTER ROLE worker_bee SET maintenance_work_mem = 100000;
为一个角色指定 client_min_messages参数的数据库相关的非 默认设置:
ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;
更改一个角色的配置变量的会话默认值,可以为所有数据库设置,或者 只为IN DATABASE中指定的数据库设置。如果指定的是 ALL而不是一个角色名,将会为所有角色更改该设置。把 ALL和IN DATABASE一起使用实际上和使用命 令ALTER DATABASE ... SET ...相同。
只要改角色后续开始一个新会话,指定的值将会成为该会话的默认值,并且会覆盖 postgresql.conf中存在的值或者从 postgres命令行收到的值。这只在登录时发生,执行 SET ROLE或者 SET SESSION AUTHORIZATION不会导致新的配置值被设置。 对于所有数据库设置的值会被附加到一个角色的数据库相关的设置所覆盖。特定数 据库或角色的设置会覆盖为所有角色所作的设置。
超级用户能够更改任何人的会话默认值。具有CREATEROLE特权的角色 能够更改非超级用户的默认值。普通角色只能为它们自己设置默认值。某些配置变量 不能以这种方式设置,或者只能由一个超级用户发出的命令设置。只有超级用户能够 更改所有角色在所有数据库中的设置
会话级参数
方式1
SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
SESSION :指定该命令对当前会话有效(这是默认值)。
LOCAL :指定该命令只对当前事务有效。在COMMIT或者 ROLLBACK之后,会话级别的设置会再次生效。 在事务块外部发出这个参数会发出一个警告并且不会有效果database_name: 指定的数据库
configuration_parameter:属性名
value:属性值
方式2
select set_config(参数名, 参数值, 是否当时事务有效);
方式3
修改系统视图pg_settings
例子:
UPDATE pg_settings SET setting = 参数值 WHERE name = '参数名';
参数值类型
布尔: 值可以被写成 on, off, true, false, yes, no, 1, 0 (都是大小写不敏感的)或者这些值的任何无歧义前缀。
字符串: 通常值被包括在单引号内,值内部的任何单引号都需要被双写。不过,如果值是一个简单数字或者 标识符,引号通常可以被省略。 (与 SQL 关键字匹配的值需要在某些上下文中引用。)
数字(整数和浮点): 数字参数可以规定为惯用的整数和浮点格式;如果参数为整数类型,则小数值四舍五入到最接近的整数。 证书参数还接受十六进制输入(以0x开头)和十进制输入(以0开头),但是这些格式不能有小数。 不能使用千位分隔符。引号是不是必需的,除了十六进制输入。
带单位的数字: 一些数字参数具有隐含单位,因为它们描述内存或时间量。单位可能是字节、千字节、块(通常是 8KB)、 毫秒、秒或分钟。这些设置之一的一个未修饰的数字值将使用该设置的默认单位,默认单位可以通 过引用pg_settings.unit来找到。为了方便,也可以 显式地指定一个不同的单位,例如时间值可以是'120 ms',并且它们将被转换到参数的实际单位。要使用这个特性,注意值必须被写成一个字符 串(带有引号)。单位名称是大小写敏感的,并且在数字值和单位之间可以有空白。
- 可用的内存单位是B(字节)、kB(千字节)、MB(兆字节)和GB(吉字节)。内存单位的乘数是 1024 而不是 1000。
- 可用的时间单位是 us (微秒), ms (毫秒), s(秒)、min(分钟)、 h(小时)和d(天)。
枚举: 枚举类型的参数以与字符串参数相同的方式指定,但被限制到一组有限的值。 这样一个参数可用的值可以在pg_settings.enumvals 中找到。枚举参数值是大小写无关的。
相关SQL或函数
查看指定参数值
SHOW 参数名;
SELECT current_setting(参数名);
查看所有参数值
SHOW ALL;