You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动