PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Il client Postgres si blocca durante la creazione di una nuova tabella

Se il riavvio di Postgres è un'opzione, molto probabilmente risolverà il problema e ti eviterà di perdere tempo a leggere il resto di questa risposta :-)

Controlla il pg_stat_activity vista, probabilmente c'è qualche altra transazione che blocca la modifica dello schema.

select * from pg_stat_activity 
where 
wait_event_type is NULL and xact_start is not NULL order by xact_start;

(la pg_stat_activity è leggermente cambiata in ogni versione principale di pg, prova questo per le versioni precedenti):

select * from pg_stat_activity 
where 
not waiting and xact_start is not NULL order by xact_start;

La prima riga a comparire è probabilmente quella che causa problemi. È spesso una "transazione inattiva" - questo potrebbe benissimo contenere blocchi e, se si tratta di una vecchia transazione, potrebbe anche compromettere le prestazioni. Probabilmente il programmatore ha dimenticato di assicurarsi di terminare la transazione con "commit" o "rollback", o forse qualche sessione db si è bloccata a causa di problemi di rete.

Per terminare la transazione con pid 1234, usa select pg_cancel_backend(1234); , se fallisce, select pg_terminate_backend(1234) . Con l'accesso alla shell, i comandi equivalenti sono kill -INT 1234 e kill 1234 . (tieni presente che kill -9 1234 è davvero una pessima idea).

C'è anche una vista pg_locks che può fornire alcune informazioni, anche se probabilmente non è così facile ottenere informazioni utili da esso. Se granted è vero, il blocco è mantenuto, quando granted è false significa che la query è in attesa del blocco. Qui ci sono altri suggerimenti su come estrarre informazioni utili da pg_locks:http://wiki.postgresql. org/wiki/Lock_Monitoring

Se tutto il resto fallisce, probabilmente è il momento di optare per la soluzione semplice, riavvia il server di database.