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

问题描述 投票:0回答:9

将 psycopg2 包与 python 2.7 一起使用,我不断收到标题错误: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 扩展导致数据库崩溃造成的,因为这是一个错误的查询,并且它们不是具有此模式的链接。

很快就会发布答案...

python postgresql ssl psycopg2 pgrouting
9个回答
48
投票

错误:

psycopg2.operationalerror: SSL SYSCALL error: EOF detected

设置:Airflow + Redshift + psycopg2

何时:执行查询需要时间(超过 300 秒)。

本例中发生socket超时。解决该错误的特定变体的方法是将 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。

有关 postgres keepalives 的文档链接

链接到气流文档,建议 300 超时


24
投票

我遇到了同样的错误。通过 CPU、RAM 使用一切正常,@antonagestam 的解决方案对我不起作用。

基本上,问题出在引擎创建的步骤上。

pool_pre_ping=True
解决了问题:

engine = sqlalchemy.create_engine(connection_string, pool_pre_ping=True)

它的作用是,每次使用连接时,它都会发送

SELECT 1
查询来检查连接。如果失败,则回收连接并再次检查。成功后,将执行查询。

pool_pre_ping 上的 sqlalchemy 文档

就我而言,我在 python 日志中遇到了同样的错误。我检查了

/var/log/postgresql/
中的日志文件,有很多错误信息
could not receive data from client: Connection reset by peer
unexpected EOF on client connection with an open transaction
。这可能是由于网络问题而发生的。


20
投票

我在 Digital Ocean 实例上的 Droplet 中运行缓慢查询时遇到了这个问题。所有其他 SQL 都可以正常运行,并且可以在我的笔记本电脑上运行。在扩展到 1 GB RAM 实例而不是 512 MB 后,它工作正常,因此如果进程内存不足,似乎可能会发生此错误。


10
投票

当我运行一些恶意查询导致表无限期锁定时,就会出现此问题。我可以通过运行看到查询:

SELECT * from STV_RECENTS where status='Running' order by starttime desc;

然后用以下方法杀死他们:

SELECT pg_terminate_backend(<pid>);

10
投票

与 @FoxMulder900 所做的非常相似的答案,除了我无法让他的第一个选择工作。但这是有效的:

WITH long_running AS (
    SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
    FROM pg_stat_activity
    WHERE (now() - pg_stat_activity.query_start) > interval '1 minutes'
      and state = 'active'
)
SELECT * from long_running;

如果您想终止

long_running
中的进程,只需注释掉最后一行并插入
SELECT pg_cancel_backend(long_running.pid) from long_running ;


8
投票

就我而言,这是 OOM 杀手(查询太重)

检查 dmesg:

dmesg | grep -A2 Kill

就我而言:

Out of memory: Kill process 28715 (postgres) score 150 or sacrifice child

3
投票

我在 300 万行表上运行大型 UPDATE 语句时遇到此错误。就我而言,结果发现磁盘已满。一旦我添加了更多空间,更新就可以正常工作。


2
投票

您可能需要将

%
表示为
%%
,因为
%
是占位符标记。 http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries


0
投票

在增加 Flask 服务器的 CPU 核心后为我修复了。

© www.soinside.com 2019 - 2024. All rights reserved.