【发布时间】:2017-09-21 12:03:09
【问题描述】:
我正在做一些事情:
conn_string = "postgresql+pg8000://%s:%s@%s:%d/%s" % (db_user, db_pass, host, port, schema)
conn = sqlalchemy.engine.create_engine(conn_string,execution_options={'autocommit':True},encoding='utf-8',isolation_level="AUTOCOMMIT")
rows = cur.execute(sql_query)
在 Redshift 集群上运行查询。最近,我一直在执行维护任务,例如在每天都会被截断和重新加载的大型表上运行 vacuum reindex。
问题是,对于一个特定的表,上面的命令大约需要 7 分钟(表很大,15 列有 6000 万行),当我使用上面的方法运行它时,它永远不会完成并挂起。我可以在 AWS 的集群仪表板中看到,vacuum 命令的某些部分正在运行大约 5 分钟,然后它就停止了。没有python错误,集群上没有错误,什么都没有。
我的猜测是在命令期间连接丢失。那么,如何证明我的理论呢?还有其他人有这个问题吗?如何更改连接字符串以使其存活更长时间?
编辑:
我在这里的 cmets 之后更改了我的连接:
conn = sqlalchemy.engine.create_engine(conn_string,
execution_options={'autocommit': True},
encoding='utf-8',
connect_args={"keepalives": 1, "keepalives_idle": 60,
"keepalives_interval": 60},
isolation_level="AUTOCOMMIT")
它已经工作了一段时间。但是,它决定从更大的表开始相同的行为,其中vacuum reindex 实际上需要大约 45 分钟(至少这是我的估计,该命令永远不会在 Python 中完成运行)。
无论查询运行时如何,我如何才能使这项工作?
【问题讨论】:
-
根据我的经验,这样的连接断开(如果确实是连接断开)是由于 NAT 在中间某处静默断开连接。顺便说一下,AWS NAT 网关的超时时间为 5 分钟。棘手的是,psycopg2/libpq 显然默认开启了 TCP keepalive,这应该解决问题。您可以尝试显式设置:
create_engine(connect_args={"keepalives": 1, "keepalives_idle": 60, "keepalives_interval": 60});可能是默认的keepalive间隔太长了。 -
@univerio 那些保持活力的论点使这项工作在今天完全没有问题。如果明天有效,我会再次在这里发表评论,要求您将此作为实际答案。这只是让我想知道为什么如果它默认打开我仍然必须手动添加它......
-
@rodrigocf 该解决方案是否始终如一地工作?我也面临同样的问题..
-
@rdeboo 是的。自申请以来一直没有失败。
-
我在使用气流和 Redshift 时遇到了同样的问题。 @univerio 的评论解决了它,应该是这里接受的答案
标签: python python-3.x sqlalchemy amazon-redshift