PostgreSQL:如何在不关闭连接的情况下重置会话级配置参数?
如何在不关闭PostgreSQL会话的情况下重置会话参数为配置文件当前值
这个场景我太熟悉了——当你在会话里手动设置参数后,就算重新加载全局配置,会话里的参数依然会保持修改后的值,因为会话级参数的优先级高于全局配置。要在不断开连接的情况下把log_min_duration_statement重置为配置文件的当前值(也就是你修改后的60s),有几个简单的办法:
方法1:使用RESET命令(推荐)
这是最直接且精准的方式,专门用来重置单个会话参数到当前全局配置的值:
RESET log_min_duration_statement;
执行完这条命令后,再执行SELECT current_setting('log_min_duration_statement');,就能看到返回值变成配置文件里的60s了。
方法2:重置所有会话级修改的参数
如果你想要一次性把所有被手动修改过的会话参数都重置为全局值,可以用:
RESET ALL;
不过要注意,这个操作会重置所有会话级的参数变更,所以如果还有其他你想保留的会话设置,就别用这个。
方法3:手动同步全局配置值
你也可以先查询当前的全局配置值,再手动设置到会话里。这里要注意current_setting的第二个参数设为true,这样会返回全局配置的值,而不是当前会话的:
-- 先查全局配置的当前值 SELECT current_setting('log_min_duration_statement', true); -- 再将会话参数设置为这个值 SET log_min_duration_statement = current_setting('log_min_duration_statement', true);
这个方法适合需要做额外逻辑判断的场景,但不如RESET简洁。
补充说明:为什么pg_reload_conf()没用?
因为你用SELECT set_config('log_min_duration_statement', '30000', false);设置的是会话级参数(第三个参数false代表只作用于当前会话)。pg_reload_conf()只是让PostgreSQL重新读取配置文件,更新全局参数值,但不会覆盖已经存在的会话里的参数——会话级参数会一直生效,直到会话关闭或者被手动重置。
内容的提问来源于stack exchange,提问作者ZedZip




