joa*_*olo 5 postgresql client pgadmin network connectivity
当使用 pgAdmin 4(实际上是其他几个充当数据库客户端的程序)时,与服务器的连接在闲置 10 或 15 分钟后断开。一杯咖啡和一个电话,您会收到一条类似于“抱歉,与数据库的连接已丢失。您希望我尝试重新连接吗?”的消息。
而且pgAdmin重新连接总是需要多次尝试,并且已经展开的对象树被折叠了......所以,这有点烦人。
pgAdmin 似乎没有与该行为相关的任何参数。(似乎有一些方法可以更改某些连接超时,但它们与 pgAdmin 在服务器连接时间过长时的行为方式有关)。
可以做些什么来避免 pgAdmin 与数据库断开连接?
披露:这实际上是一个“伪问题”。它是另一个的衍生产品,最终与失去连接无关......鉴于我已经有了一个答案,我(不是很谦虚地)认为值得“问”,以防万一回答对某人有帮助。
pgAdmin 每隔 10 分钟左右就会抛出一个连接超时。
我认为问题可能与pgAdmin 客户端和 PostgreSQL 服务器之间的路由器(或在某些情况下,有状态防火墙)有关。
当您在家(或在办公室)并且您的路由器正在执行 NAT(网络地址转换)时,这很常见。经过一段空闲时间后,连接被路由器关闭。这不是 pgAdmin 或 PostgreSQL 所做的事情,这取决于路由器上的设置,
如果是这种情况,您有三个选择:
如果可行并且您有适当的文档,请更改路由器中的connection_timeout设置。以下是 Cisco 路由器的示例。
让路由器相信连接永远不会空闲足够长的时间。要做到这一点:更改一个服务器参数,称为tcp_keep_alives
:
根据关于 Connections的PostgreSQL 文档:
tcp_keepalives_idle(整数)
指定 TCP 应向客户端发送 keepalive 消息之前的非活动秒数。值 0 使用系统默认值。此参数仅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号的系统和 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数被忽略并始终读取为零。
keepalive 消息应该避免 NAT 连接开始被丢弃。
请记住文档中的注释:
此参数仅在支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号的系统上以及 Windows 上受支持
我真的不知道哪些系统“支持 TCP_KEEPIDLE 或 TCP_KEEPALIVE 符号”,但我猜 Linux 和 Mac应该支持它们,根据文档,Windows 也是如此。
如果您的系统每 10 分钟断开一次连接,则将此设置设为大约 9 * 60 = 540 秒或更短应该是明智之举。
此设置应postgresql.conf
在您的服务器上完成。您还可以使用以下命令在服务器中进行更改之前进行测试:
SET tcp_keepalives_idle = 480 ;
Run Code Online (Sandbox Code Playgroud)
这会改变您当前连接的设置,或
ALTER ROLE (the-one-you-use) tcp_keepalives_idle = 480 ;
Run Code Online (Sandbox Code Playgroud)
这只会更改此角色的设置。
关于 keep-alives 的参考:此视频讨论了如何保持 SSH 会话活动。虽然这不是完全相同的场景,但它是等效的(用 pgAdmin 代替 SSH)。
归档时间: |
|
查看次数: |
16451 次 |
最近记录: |