当使用 pgAdmin 4(实际上还有其他几个充当数据库客户端的程序)时,与服务器的连接会在 10 或 15 分钟不活动后断开。一杯咖啡和一个电话,您会收到类似于“对不起,与数据库的连接丢失。您要我尝试重新连接吗?”的消息。
并且 pgAdmin 重新连接总是需要不止一次的尝试,并且已经扩展的对象树会崩溃......所以,这有点烦人。
pgAdmin 似乎没有与该行为相关的任何参数。(似乎有一些方法可以更改某些连接超时,但它们与 pgAdmin 在服务器连接时间过长时的行为方式有关)。
可以做些什么来避免 pgAdmin 与数据库断开连接?
披露:这实际上是一个“伪问题”。它是另一个的衍生产品,最终与失去连接无关......鉴于我已经有了一个答案,我(不是很谦虚)认为值得“询问”,以防万一答案对某人有帮助。
我认为问题可能与您的 pgAdmin 客户端和 PostgreSQL 服务器之间的路由器(或者,在某些情况下,状态防火墙)有关。
当您在家(或在办公室)并且您的路由器正在执行 NAT(网络地址转换)时,这很常见。经过一段空闲时间后,路由器将关闭连接。这不是 pgAdmin 和 PostgreSQL 都没有做的事情,这取决于路由器上的设置,
如果是这种情况,您有三个选择:
如果可行并且您有适当的文档,请更改路由器中的connection_timeout设置。这是 Cisco 路由器的示例。
让路由器相信连接永远不会空闲足够长的时间。为此:更改一个服务器参数,称为
tcp_keep_alives
:根据关于 Connections 的 PostgreSQL 文档:
keepalive 消息应避免 NAT 连接开始断开。
请记住文档中的注释:
我真的不知道哪些系统“支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号”,但我猜 Linux 和 Mac应该支持它们,根据文档,Windows 也是如此。
如果您的系统每 10 分钟断开一次连接,则应谨慎将此设置设置为 9 * 60 = 540 秒或更少。
此设置应
postgresql.conf
在您的服务器上完成。您还可以使用以下命令在服务器中进行更改之前进行测试:这将改变您当前连接的设置,或者
这将仅更改此角色的设置。
关于 keep-alives 的参考:该视频讨论了如何保持 SSH 会话保持活跃。虽然这不是完全相同的场景,但它是等效的(用 pgAdmin 代替 SSH)。
只需在数据库上执行以下命令即可。
ALTER ROLE user_name_here IN DATABASE database_name_here SET tcp_keepalives_idle TO '30';