2013-07-03 7 views
54

Ogni volta che provo a cadere banca dati ottengo:PostgreSQL - in grado di eliminare database a causa di alcuni collegamenti auto per DB

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

Quando uso:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

ho interrotto la connessione da quel DB , ma se provo a rilasciare il database dopo che in qualche modo qualcuno si connette automaticamente a quel database e dà questo errore. Cosa potrebbe fare? Nessuno usa questo database, tranne me.

risposta

54

È possibile evitare che le connessioni future:

REVOKE CONNECT ON DATABASE thedb FROM public; 

(ed eventualmente altri utenti/ruoli, vedi \l+ in psql)

si può quindi interrompere tutte le connessioni a questo db, tranne il proprio:

SELECT pid, pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = current_database() AND pid <> pg_backend_pid(); 

Nelle versioni precedenti pid è stato chiamato procpid quindi dovrai gestirlo.

Dato che hai revocato i diritti, qualsiasi cosa stavi cercando di connettere automaticamente non dovrebbe più essere in grado di farlo.

Ora è possibile rilasciare il DB.

Questo non funzionerà se si utilizzano connessioni di superutente per le normali operazioni, ma se lo si fa è necessario risolvere il problema prima.

+2

Se si importa un altro database con lo stesso nome in un secondo momento, concedere il collegamento capab il potere al pubblico: 'GRANT CONNECT ON DATABASE thedb TO public;' – Mike

18

Basta controllare qual è la connessione da cui proviene. Puoi vedere tutto questo in:

select * from pg_stat_activity where datname = 'TARGET_DB'; 

Forse è la tua connessione?

+4

sudo kill -9 PID nel terminale dopo aver visto il risultato –

42

Ogni volta che provo a cadere banca dati ottengo:

ERROR: database "pilot" is being accessed by other users 
DETAIL: There is 1 other session using the database. 

Prima di tutto bisogna revocare

REVOKE CONNECT ON DATABASE TARGET_DB FROM public; 

Quindi utilizzare:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'TARGET_DB'; 

Sarà sicuramente funzionerà.

4

Se nessun potenziale impatto su altri servizi sulla vostra macchina, semplicemente service postgresql restart

5

ho trovato una soluzione per questo problema provare a eseguire questo comando nel terminale

ps -ef | grep postgres 

processo di uccidere da questo comando

sudo kill -9 PID 
Problemi correlati