微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Psycopg2几百秒后,Postgres在查询期间关闭连接

我正在运行Postgresql 9.6(在Docker中,使用postgres:9.6.13图像)和psycopg2 2.8.2.

我的Postgresql服务器(本地)托管两个数据库.我的目标是在一个数据库中创建物化视图,该数据库使用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_user,
    password=config.db_password,
    host=config.db_host,
    port=config.db_port
)
with db.cursor() as c:
    c.execute("""
        CREATE EXTENSION IF NOT EXISTS postgres_fdw;
        CREATE SERVER fdw FOREIGN DATA WRAPPER postgres_fdw OPTIONS (...);
        CREATE USER MAPPING FOR CURRENT_USER SERVER fdw OPTIONS (...);
        CREATE SCHEMA foreign;
        IMPORT FOREIGN SCHEMA foreign_schema FROM SERVER fdw INTO foreign;
    """)
    c.execute("""
        CREATE MATERIALIZED VIEW IF NOT EXISTS my_view AS (
            SELECT (...)
            FROM foreign.foreign_table
        );
    """)

解决方法:

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

self.db = pg.connect(
            dbname=config.db_name,
            user=config.db_user,
            password=config.db_password,
            host=config.db_host,
            port=config.db_port,
            keepalives=1,
            keepalives_idle=30,
            keepalives_interval=10,
            keepalives_count=5
        )

我仍然不知道为什么这是必要的.我找不到其他描述过在Docker中使用Postgres时必须使用keepalives参数关键字的人,以便能够运行耗时超过4-5分钟的查询,但是很明显,没有人注意到它吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐