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_data
比 fund_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" 我的意思是我得到了原始问题中的错误,但查询似乎仍然 运行。至少真空吸尘器是肯定的。
最终,如果我检查我的 vacuum
s,它会在 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 域套接字连接的会话中,此参数将被忽略并始终读取为零。
我收到这个错误:
"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_data
比 fund_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" 我的意思是我得到了原始问题中的错误,但查询似乎仍然 运行。至少真空吸尘器是肯定的。
最终,如果我检查我的 vacuum
s,它会在 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 域套接字连接的会话中,此参数将被忽略并始终读取为零。