jueves, 21 de mayo de 2015

Eliminar sesiones en Postgresql

Para un gran número de acciones sobre una base de datos necesitamos que esta no tenga ninguna conexión activa contra ella. Por ejemplo, si queremos lanzar un "drop database"  para eliminar una base de datos que está en uso y por tanto tienen conexiones abiertas, nos dará el siguiente mensaje de error:

[Error] Líneas de script: 1-1 ----------------------
 ERROR: database "ke4" is being accessed by other users
  Detail: There are 3 other session(s) using the database.
 Línea: 1

Para eliminarlas y poder realizar el borrado necesitaremos sacar el listado de conexiones que tenemos. Para ello utilizamos la tabla pg_stat_activity filtrando por el datname con el nombre de nuestra base de datos:

SELECT * FROM pg_stat_activity WHERE datname = 'ke4';

En mi caso el resultado sería este:

datid datname procpid usesysid usename application_name client_addr client_port backend_start xact_start     query_start  waiting current_query        
 530  ke4       2549    188        k                                   20.0.0.2   
55311       20/05/2015    20/05/2015  20/05/2015 false      <IDLE> in transaction 

Para matar esta sesión sin reiniciar el servidor utilizamos la función pg_terminate_backend con el id del campo procpid:

    SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'ke4';

En mi caso sería así:

    SELECT pg_terminate_backend(2549) FROM pg_stat_activity WHERE datname = 'ke4';




No hay comentarios:

Publicar un comentario