使用带有python 2.7的psycopg2包我不断收到标题错误:psycopg2.DatabaseError:SSL SYSCALL错误:检测到EOF
仅当我向pgrouting查询添加WHERE column LIKE ''%X%''
子句时才会发生这种情况。一个例子:
SELECT id1 as node, cost FROM PGR_Driving_Distance(
'SELECT id, source, target, cost
FROM edge_table
WHERE cost IS NOT NULL and column LIKE ''%x%'' ',
1, 10, false, false)
互联网上的线程表明这是SSL直观的问题,但每当我注释掉模式匹配方面的事情时,查询和与数据库的连接都能正常工作。
这是在运行Xubuntu 13.10的本地数据库上。
经过进一步调查:看起来这可能是因为pgrouting扩展程序导致数据库崩溃,因为它是一个错误的查询,并且它们不是具有此模式的链接。
很快会发布答案......
答案 0 :(得分:10)
我在Digital Ocean实例的Droplet中运行慢查询时遇到此问题。所有其他SQL运行正常,它可以在我的笔记本电脑上运行。扩展到1 GB RAM实例而不是512 MB后,它可以正常工作,因此如果进程内存不足,可能会发生此错误。
答案 1 :(得分:5)
当我遇到一些流氓查询导致无限期锁定表时,我遇到了这个问题。我能够通过运行来查看查询:
SELECT * from STV_RECENTS where status='Running' order by starttime desc;
然后用:
杀死他们SELECT pg_terminate_backend(<pid>);
答案 2 :(得分:3)
错误:psycopg2.operationalerror: SSL SYSCALL error: EOF detected
设置:气流 + Redshift + psycopg2
时间:查询执行需要很长的时间(超过300秒)。
在此实例中发生套接字超时。解决此错误的特定形式的方法是在连接字符串中添加keepalive参数。
keepalive_kwargs = {
"keepalives": 1,
"keepalives_idle": 30,
"keepalives_interval": 5,
"keepalives_count": 5,
}
conection = psycopg2.connect(connection_string, **keepalive_kwargs)
Redshift要求keepalives_idle
小于300。对我而言,值为30起作用,您的里程可能会有所不同。 keepalives_idle
参数也可能是您唯一需要设置的参数-但要确保keepalives
设置为1。
答案 3 :(得分:3)
我遇到了同样的错误。通过 CPU、RAM 使用一切正常,@antonagestam 的解决方案对我不起作用。
基本上,问题出在引擎创建步骤上。 pool_pre_ping=True
解决了问题:
engine = sqlalchemy.create_engine(connection_string, pool_pre_ping=True)
它的作用是,每次使用连接时,它都会发送 SELECT 1
查询来检查连接。如果失败,则连接被回收并再次检查。成功后,执行查询。
sqlalchemy docs on pool_pre_ping
就我而言,我在 python 日志中遇到了同样的错误。我查看了 /var/log/postgresql/
中的日志文件,有很多错误信息 could not receive data from client: Connection reset by peer
和 unexpected EOF on client connection with an open transaction
。这可能是由于网络问题造成的。
答案 4 :(得分:2)
您可能需要将%
表达为%%
,因为%
是占位符标记。 http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries
答案 5 :(得分:1)
我在300万行表上运行大型UPDATE语句时遇到此错误。在我的情况下,事实证明磁盘已满。一旦我添加了更多空间,UPDATE工作正常。
答案 6 :(得分:1)
与@ FoxMulder900所做的回答非常相似,除了我无法让他的第一选择起作用。但是,这可以工作:
与long_running AS(
SELECT pid,now()-pg_stat_activity.query_start AS持续时间,查询,状态
来自pg_stat_activity
在哪里(now()-pg_stat_activity.query_start)>间隔'1分钟'
并且状态=“活动”
)
SELECT * from long_running;
如果您想终止 long_running
中的进程,只需注释掉最后一行,然后从long_running中插入 SELECT pg_cancel_backend(long_running.pid);
答案 7 :(得分:0)
在我的情况下,这是OOM的杀手((查询太重了)
检查dmesg:
X_train.groupby(gb,as_index=False).apply(xgb_model_fit)
就我而言:
dmesg | grep -A2 Kill