python – Redshift SQLAlchemy长查询挂起

我正在做以下几行:

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群集上运行查询.最近,我一直在做维护任务,例如在每天被截断和重新加载的大型表上运行真空重新索引.

问题是上面的命令对于特定的表大约需要7分钟(表格很大,15列中有6000万行),当我使用上面的方法运行它时,它永远不会完成并挂起.我可以在AWS的集群仪表板中看到,vacuum命令的某些部分正在运行大约5分钟,然后它就会停止.没有python错误,集群上没有错误,没有任何错误.

我的猜测是在命令期间连接丢失了.那么,我如何证明我的理论呢?有问题的其他人吗?如何更改连接字符串以使其保持更长时间?

编辑:

我在这里发表评论后改变了我的联系:

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")

它已经工作了一段时间.然而,它决定以更大的表开始相同的行为,其中真空重新索引实际上需要大约45分钟(至少这是我的估计,命令永远不会在Python中运行).

无论查询运行时如何,如何使其工作?

最佳答案 它很可能不是连接丢弃问题.要确认这一点,请尝试将几百万行推入虚拟表(需要超过5分钟的时间)并查看语句是否失败.将查询提交到redshift后,无论您的连接字符串是否关闭,查询都会在后台执行.

现在,问题本身 – 我的猜测是你的内存或磁盘空间不足,请你更详细一点并列出你的redshift设置(dc1 / ds2有多少个节点)?另外,尝试运行一些管理查询,看看你在磁盘上留下了多少空间.有时当集群被加载到边缘时,会抛出磁盘已满错误,但在您的情况下,因为在将错误抛出到您的python shell之前,连接可能会被丢弃.

点赞