2012-11-05 11 views
50
1 S postgres 5038 876 0 80 0 - 11962 sk_wai 09:57 ?  00:00:00 postgres: postgres my_app ::1(45035) idle                     
1 S postgres 9796 876 0 80 0 - 11964 sk_wai 11:01 ?  00:00:00 postgres: postgres my_app ::1(43084) idle    

Ne vedo molti. Stiamo cercando di risolvere la nostra perdita di connessione. Ma intanto, vogliamo impostare un timeout per queste connessioni inattive, forse fino a un massimo di 5 minuti.Esiste un timeout per le connessioni PostgreSQL inattive?

+0

come stai ti connetti al DB? socketTimeout potrebbe essere quello che stai cercando. – Doon

+0

Abbiamo questa web app legacy di Pylons, e abbiamo usato SQLAlchemy ma a quanto pare non l'abbiamo usato correttamente. Non ricordo. Stiamo provando a riparare la perdita. 'socketTimeout' dal documento sembra che questo chiuda completamente la connessione al DB. Sto cercando di chiudere ogni inattività e il contatore si avvia non appena viene stabilita la connessione. – user1012451

+4

vedere http://stackoverflow.com/questions/12391174/is-it-possible-to-configure-postgresql-toautomatically-close-idle-connections – Doon

risposta

69

Sembra di avere una connessione perdite nell'applicazione perché non riesce a chiudere le connessioni in pool. Non si verificano problemi solo con le sessioni <idle> in transaction, ma con troppe connessioni in generale.

Le connessioni di uccisione non sono la risposta giusta, ma è una soluzione temporanea OK-ish.

Invece di riavviare PostgreSQL per avviare tutte le altre connessioni da un database PostgreSQL, vedere: How do I detach all other users from a postgres database? e How to drop a PostgreSQL database if there are active connections to it?. Quest'ultimo mostra una query migliore.

Per l'impostazione dei timeout, come suggerito da @Doon, vedere How to close idle connections in PostgreSQL automatically?, che consiglia di utilizzare PgBouncer come proxy per PostgreSQL e gestire le connessioni inattive. Questa è un'ottima idea se hai un'applicazione buggy che perde comunque le connessioni; I molto fortemente consiglia di configurare PgBouncer.

A TCP keepalive non farà il lavoro qui, perché l'app è ancora connessa e viva, semplicemente non dovrebbe essere.

in PostgreSQL 9.2 e versioni successive, è possibile utilizzare la nuova colonna state_change timestamp e la status campo della pg_stat_activity per implementare un mietitore connessione inattiva. Avere un job cron eseguire qualcosa di simile:

SELECT pg_terminate_backend(pid) 
    FROM pg_stat_activity 
    WHERE datname = 'regress' 
     AND pid <> pg_backend_pid() 
     AND state = 'idle' 
     AND state_change < current_timestamp - INTERVAL '5' MINUTE; 

Nelle versioni più vecchie è necessario implementare schemi complicati che tengono traccia di quando la connessione è andato inattiva. Non preoccuparti; basta usare pgbouncer.

+0

Buono, ma ucciderà altri backg PgAdmin. Usa condizioni aggiuntive application_name = '' –

+0

Posso eseguire pg_terminate_backend se sto usando pgbouncer? –

+0

@HenleyChiu Non vedo perché no, anche se non ho controllato in modo specifico. –

15

In PostgreSQL 9.1, le connessioni inattive con la seguente query. Mi ha aiutato a scongiurare la situazione che giustificava il riavvio del database. Ciò accade principalmente con le connessioni JDBC aperte e non chiuse correttamente.

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    current_query = '<IDLE>' 
AND 
    now() - query_start > '00:10:00'; 
+0

pg_terminate_backend è in 8.42 –

+0

Salvato la mia vita !! –

20

in PostgreSQL 9.6, c'è una nuova opzione idle_in_transaction_session_timeout che dovrebbe realizzare ciò che si descrive. È possibile impostare usando il comando SET, ad esempio:

SET SESSION idle_in_transaction_session_timeout = '5min'; 
+0

Fa schifo dover chiedere una cosa così semplice, ma io sono nuovo di zecca per i database in generale - Potresti per favore dare un esempio molto semplice di come usare questa funzione? –

+2

Nessun problema, aggiornato la risposta. – shosti

+0

Qualcosa di simile nelle precedenti versioni di PostgreSQL ?? – sdsc81

0

se si utilizza 9.6+ PostgreSQL, quindi nel vostro postgresql.conf è possibile impostare

idle_in_transaction_session_timeout = 30000(msec)

Problemi correlati