Python 使用Psycopg2时,Postgres在查询过程中会在几百秒后关闭连接

Python 使用Psycopg2时,Postgres在查询过程中会在几百秒后关闭连接,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在Docker中运行PostgreSQL 9.6,使用postgres:9.6.13映像和psycopg2 2.8.2 我的PostgreSQL server本地托管两个数据库。我的目标是在其中一个数据库中创建物化视图,该数据库使用Postgres的外部数据包装器使用来自另一个数据库的数据。我从一个使用psycopg2的Python脚本中完成了所有这些 只要创建物化视图不会花费太长时间(即,如果导入的数据量不是太大),这种方法就可以很好地工作。但是,如果该过程花费的时间超过大约250秒,ps

我正在Docker中运行PostgreSQL 9.6,使用postgres:9.6.13映像和psycopg2 2.8.2

我的PostgreSQL server本地托管两个数据库。我的目标是在其中一个数据库中创建物化视图,该数据库使用Postgres的外部数据包装器使用来自另一个数据库的数据。我从一个使用psycopg2的Python脚本中完成了所有这些

只要创建物化视图不会花费太长时间(即,如果导入的数据量不是太大),这种方法就可以很好地工作。但是,如果该过程花费的时间超过大约250秒,psycopg2将抛出异常

psycopg2.OperationalError: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.
在Postgres的日志中找不到任何错误消息或与此相关的任何消息

如果我从SQL客户机Postico创建物化视图,则它将成功完成

这段代码大致说明了我在Python脚本中所做的工作:

db=pg.connect dbname=config.db_name, user=config.db\u user, password=config.db\u密码, host=config.db\u主机, port=config.db\u端口 将db.cursor设置为c: c、 执行 如果不存在postgres_fdw,则创建扩展名; 创建服务器fdw外部数据包装postgres_fdw选项。。。; 为当前用户服务器fdw选项创建用户映射。。。; 创建外部模式; 将外部模式从服务器fdw导入外部模式; c、 执行 创建物化视图(如果不存在我的视图) 选择 从foreign.foreign\u表 ;
可能是PostgreSQL 9.6在中提到的新超时后终止了您的连接。在这种情况下,您可以设置

postgresql.conf中的语句\u超时

但事实确实如此

它可能在Postco中工作,因为该值已在那里设置

要记录错误,您需要将log\U min\U error\U语句设置为error或lower以显示错误。

将keepalive参数添加到psycopg2.connect调用似乎解决了问题:

self.db=pg.connect dbname=config.db_name, user=config.db\u user, password=config.db\u密码, host=config.db\u主机, port=config.db\u端口, keepalives=1, 保持空闲=30, keepalives_间隔=10, keepalives\u计数=5
我仍然不知道为什么这是必要的。我找不到任何人描述过在Docker中使用Postgres时必须使用keepalives参数关键字才能运行耗时超过4-5分钟的查询,但很明显,没有人注意到这一点?

嗨,idle\u in\u transaction\u session\u timeout已经设置为0,其他所有超时也都设置为0。log\U min\U error\U语句已设置为error。请确保:语句\U timeout也为0?这似乎是在9.6中引入的。是的,语句\u timeout为零。您是否尝试设置中提到的连接\u超时?是的,但我不知道为什么这样做会有所帮助。根据keepalives的默认值,它已经是1。因此,连接应该保持活动状态。但对于我的连接,它已被一个操作错误关闭。您也可以使用其他参数,可以设置为0以使用系统默认值。但是,我不确定在哪里可以找到默认参数。也许它们是特定于操作系统的。我在使用FDW表创建多个物化视图的相同设置中遇到了完全相同的问题。但5分钟后,FDW连接关闭。我试过keepalives,但似乎对我不起作用。我的postgres日志显示psycopg2正在中止事务,因为与fwd服务器的连接已断开。