web-dev-qa-db-fra.com

Postgres ferme la connexion lors de la requête après quelques centaines de secondes lors de l'utilisation PSYCOPG2

J'exécute PostgreSQL 9.6 (à Docker, à l'aide de l'image Postgres: 9.6.13) et PSYCOPG2 2.8.2.

Mon serveur PostgreSQL (local) héberge deux bases de données. Mon objectif est de créer des vues matérialisées dans l'une des bases de données utilisant des données de l'autre base de données à l'aide de Wrappers de données étrangères de Postgres. Je fais tout cela à partir d'un Python script utilisant psycopg2.

Cela fonctionne bien tant que la création de la vue matérialisée ne prend pas trop de temps (c'est-à-dire si la quantité de données importée n'est pas trop grande). Toutefois, si le processus prend plus de temps environ ~ 250 secondes, Psycopg2 jette l'exception

psycopg2.OperationalError: server closed the connection unexpectedly
    This probably means the server terminated abnormally
    before or while processing the request.

Aucun message d'erreur (ni message concernant ce que ce soit) se trouve dans les journaux de Postgres.

La création de la vue matérialisée complète avec succès si je le fais à partir d'un client SQL (Posttico).

Ce code illustre à peu près ce que je fais dans le Python script:

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
        );
    """)
15
haroba

Il se peut que PostgreSQL 9.6 tue vos connexions après la nouvelle timeout mentionnée à https://stackoverflow.com/a/45627782/1587329 . Dans ce cas, vous pourriez définir

les statement_timeout dans postgresql.conf

mais c'est non recommandé .

Cela pourrait fonctionner dans Postico car la valeur a été fixée là-bas.

Pour enregistrer une erreur, vous devez définir log_min_error_statement à ERROR ou plus bas pour qu'il montre.

0
serv-inc