将 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 扩展导致数据库崩溃造成的,因为这是一个错误的查询,并且它们不是具有此模式的链接。
很快就会发布答案...
错误:
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。
我遇到了同样的错误。通过 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
。这可能是由于网络问题而发生的。
我在 Digital Ocean 实例上的 Droplet 中运行缓慢查询时遇到了这个问题。所有其他 SQL 都可以正常运行,并且可以在我的笔记本电脑上运行。在扩展到 1 GB RAM 实例而不是 512 MB 后,它工作正常,因此如果进程内存不足,似乎可能会发生此错误。
当我运行一些恶意查询导致表无限期锁定时,就会出现此问题。我可以通过运行看到查询:
SELECT * from STV_RECENTS where status='Running' order by starttime desc;
然后用以下方法杀死他们:
SELECT pg_terminate_backend(<pid>);
与 @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 ;
就我而言,这是 OOM 杀手(查询太重)
检查 dmesg:
dmesg | grep -A2 Kill
就我而言:
Out of memory: Kill process 28715 (postgres) score 150 or sacrifice child
我在 300 万行表上运行大型 UPDATE 语句时遇到此错误。就我而言,结果发现磁盘已满。一旦我添加了更多空间,更新就可以正常工作。
您可能需要将
%
表示为 %%
,因为 %
是占位符标记。 http://initd.org/psycopg/docs/usage.html#passing-parameters-to-sql-queries
在增加 Flask 服务器的 CPU 核心后为我修复了。