使用服务端连接池后设置数据库参数不生效

更新时间:
复制 MD 格式

通过控制台或ALTER DATABASE设置数据库参数后,使用服务端连接池(PgBouncer)连接时参数未生效。本文介绍该问题的原因和解决方法。

问题现象

通过控制台修改实例参数或执行ALTER DATABASE设置数据库级别参数后,使用SHOW命令查询参数值时仍显示旧值,参数修改未生效。

可能原因

AnalyticDB PostgreSQL版支持服务端连接池(PgBouncer)功能,实例连接地址分为两种:

  • 直连地址:客户端直接连接到数据库后端进程。

  • 连接池地址:客户端连接到PgBouncer,由PgBouncer维护与数据库后端的长连接。

数据库级别参数(通过ALTER DATABASE或控制台设置)在连接建立时加载生效。当您使用连接池地址时,PgBouncer与数据库后端之间的连接是长连接,不会因为参数变更而自动重建。因此,即使参数已经修改成功,通过连接池建立的会话仍然使用旧的参数值。

确认方法

执行以下SQL确认当前连接是否来自PgBouncer:

SELECT client_addr, client_port, backend_start 
FROM pg_stat_activity 
WHERE pid = pg_backend_pid();

如果client_addr显示为127.0.0.1(本地回环地址),说明当前连接来自服务端连接池。

您也可以查看连接的建立时间(backend_start),如果远早于参数修改时间,说明该连接未加载新参数。

解决方案

终止PgBouncer维护的后端连接,使其重新建立连接并加载新参数。

方法一:终止所有连接池后端连接

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE client_addr = '127.0.0.1';

方法二:仅终止指定数据库的连接池后端连接

SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE client_addr = '127.0.0.1' 
  AND datname = '目标数据库名';

执行完成后,PgBouncer会自动重新建立与数据库后端的连接,新连接将加载最新的参数配置。

注意事项

  • 权限要求:执行pg_terminate_backend需要超级用户权限或目标会话的所属用户权限。

  • 业务影响:终止连接会中断当前正在执行的查询和事务。建议在业务低峰期操作,或确认业务应用具备自动重连机制。

  • 验证方式:操作完成后,重新建立连接并执行SHOW 参数名确认参数已生效。

  • 替代方案:如果不希望中断现有连接,也可以等待连接池中的空闲连接自然超时回收后重建(取决于PgBouncer的server_idle_timeout配置,默认较长)。