Postgres SSL SYSCALL错误:使用python和psycopg检测到EOF

时间:2014-06-09 22:53:30

标签: python postgresql ssl psycopg2 pgrouting

使用带有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扩展程序导致数据库崩溃,因为它是一个错误的查询,并且它们不是具有此模式的链接。

很快会发布答案......

8 个答案:

答案 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。

Link to docs on postgres keepalives

Link to airflow doc advising on 300 timeout

答案 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 peerunexpected 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