postgres,服务器通过VBS意外关闭了连接

postgres, server closed the connection unexpectedly via VBS

我收到这个错误:

"server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request."

使用此 VBScript (vbs):

dim cn
set cn = CreateObject("ADODB.Connection")  
cn.ConnectionString= "DSN=dsn_name_here" 
cn.open 
cn.CommandTimeout = 28800

cn.execute("vacuum analyze fund_data;")
cn.execute("vacuum analyze daily_data;") '<-- error here

这一行 运行 没问题: cn.execute("vacuum analyze fund_data;")

但是这行错误: cn.execute("vacuum analyze daily_data;")

我想我知道为什么以及如何预防它,但我想知道是否有更好的解决方案以及如何确定根本原因

我认为原因与资源不足有关。 daily_datafund_data 大得多 table 并且我有另外两个相当大的查询 运行ning 当这个错误时,其中一个也因同样的错误而失败。我在想同时发生的事情太多了,但我该如何确定根本原因呢?是不是缺少磁盘space? (我知道我们没有足够的 RAM,所以我认为查询正在写入磁盘。我们正在讨论升级我们的服务器,但我想了解并能够诊断。)有没有办法确定根目录?

我认为解决方案是对查询进行不同的计时,这样它们就不会 运行 同时出现。问题是,因为我们缺乏资源,所以一切都 运行 缓慢,每天的日程安排已经超额预订,我需要偷偷加入一些 vacuum。有没有更好的方法脚本的立场(或 DBA 的立场)而不深入实际查询的细节?

为什么 postgres 不只是减慢或锁定查询而不是终止它们?还是其他什么不行?

PS - 如果这个问题更合适,我会把这个问题移到 SO DBA 站点,但我想我会先尝试从脚本角度提出这个问题。

EDIT1:我是什么运行宁:

来自 pgadmin:

select version();
PostgreSQL 9.6.2 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16), 64-bit

从安装了 PostgreSQL 的虚拟服务器的终端:

lsb_release -a
LSB Version: n/a
Distributor ID: SUSE LINUX
Description: SUSE Linux Enterprise Server 12
Release: 12
Codename: 12

uname -r
3.12.28-4-default

VBScript 运行 来自 Windows 7 笔记本电脑。

我有什么问题吗?

EDIT2:

我在这里更新了我的 odbc 驱动程序: https://www.postgresql.org/ftp/odbc/versions/msi/

他们现在有(没有注意到我在更新之前有什么):

%WINDIR%\SysWOW64\odbcad32.exe Drivers 选项卡有 PostgreSQL ANSI(x64) 9.06.05.00 和 PostgreSQL Unicode(x64) 9.06.05.00

%WINDIR%\SysWOW64\odbcad32.exe Drivers 选项卡有 PostgreSQL ANSI 9.06.05.00 和 PostgreSQL Unicode 9.06.05.00

用新的驱动程序重新启动笔记本电脑,并通过这个很好但有点不准确的 link 将外部数据 table 设置到我的服务器日志文件中: https://dba.stackexchange.com/questions/153904/pgadmin-4-server-status-view-log-file

...所以我明天可以提供一些服务器日志。

编辑 3:

除了EDIT 2,我重新启动了服务器。

我今天早上成功创建了错误。和以前一样。服务器日志没有显示任何关于 vacuum 查询的内容:

select * from postgres_log 
where query like '%vacuum%'

但是,一如既往,vacuum 和另一个 "errors" 查询同时出现在 pg_stat_activity:

select pid,query,state,wait_event,* from pg_stat_activity where state <> 'idle'

"errors" 我的意思是我得到了原始问题中的错误,但查询似乎仍然 运行。至少真空吸尘器是肯定的。

最终,如果我检查我的 vacuums,它会在 last_vacuum 下完成真空。我可以通过此查询的日期看到这一点:

 select relname,last_vacuum, last_autovacuum, last_analyze, last_autoanalyze from pg_stat_user_tables order by relname;

所以我认为服务器认为查询没问题。对我来说,这似乎是剧本中的内容。顺便说一句,vacuum 现在正在 运行ning,自查询开始以来状态没有变化,但此查询通常会完成。

这会是什么?您还需要什么其他信息?

此外,我认为这并不重要,但在出现错误时我正在 运行同时从 VBA 和 VBS 查询。

编辑 4:

经过时间调查:

 select * from postgres_log where session_start_time > '2017-09-29 06:00:00'

我找到 5 个带有 "using stale statistics instead of current ones because stats collector is not responding" 的服务器日志。

注意:在发生相关错误期间,服务器未记录任何其他内容。

我快速搜索那个错误,我发现了这个: https://www.postgresql.org/message-id/1457523467.24545.43.camel%402ndquadrant.com

听起来像我的 "I/O system is overloaded"?

编辑 5:

我不确定这是否重要,但大约在这个时候我们遇到了一些一般的 LAN slowness/messaging 问题。

具体来说,运行使用与我上面的原始问题相同的 LAN 是一个完全不同的过程。详情: https://serverfault.com/questions/873296/saving-large-excel-files-to-network-drive-locks-on-saving-progress-bar-popup

这有关系吗?

正如 Eelke 在评论中提到的,问题是网络可靠性不足。由于网络中断 interrupted/broken 的连接(在本例中通过 vbs 建立)可能会在程序(在本例中为 vbscript)中导致此类错误,但不会立即产生任何服务器端错误:

"server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request."

解决方案:让网络更可靠

解决这个问题的解决方案对我来说是将 ODBC 连接中的此设置从默认值 1 更改为 0:

UseServerSidePrepare=0

也许设置以下配置参数是一种解决方案

tcp_keepalives_idle(整数)

指定 TCP 应向客户端发送保活消息之前不活动的秒数。值 0 使用系统默认值。此参数仅在支持 TCP_KEEPIDLE 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略并始终读取为零。

tcp_keepalives_interval(整数)

指定在多少秒后应重新传输客户端未确认的 TCP keepalive 消息。值 0 使用系统默认值。此参数仅在支持 TCP_KEEPINTVL 或等效套接字选项的系统以及 Windows 上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略并始终读取为零。

tcp_keepalives_count(整数)

指定在服务器与客户端的连接被视为失效之前可以丢失的 TCP keepalive 数。值 0 使用系统默认值。此参数仅在支持 TCP_KEEPCNT 或等效套接字选项的系统上受支持;在其他系统上,它必须为零。在通过 Unix 域套接字连接的会话中,此参数将被忽略并始终读取为零。