jueves, 14 de febrero de 2013

Consultar estado de tablas de una base de datos #postgresql #Tips #Trucos

No voy a entrar en el tema de si es un error de aplicación de base de datos, solo digamos que por algún motivo tienes un abrazo mortal o bloqueo mutuo en una base de datos, y es necesario ver quienes son los interlocutores (probablemente te des cuenta porque al menos uno de ellos te va a llamar) que intervienen en dicho abrazo mortal.

Esto se puede lograr utilizando la siguiente sintaxis:

select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname 
    from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
    where l.relation=t.relid 
    and pid=c.procpid
    order by relation asc;

Esto te mostrará una lista con todas las tablas bloqueadas y quien la está bloqueando. (Posteriormente trataré de ampliar la información mostrando los tipos de bloqueos)

Se pueden agregar variantes, por ejemplo de esta forma podemos limitar a una sola base de datos:

select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname 
    from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
    where l.relation=t.relid 
    and pid=c.procpid
    and datname='basedatos'
    order by relation asc;

Incluso puedes listarlo especificamente para un cliente:

select t.relname,l.locktype,page,virtualtransaction,pid,mode,granted,client_addr,datname 
    from pg_locks l, pg_stat_all_tables t, pg_stat_activity c
    where l.relation=t.relid 
    and pid=c.procpid
    and datname='basedatos'
    and client_addr='dir.ip'
    order by relation asc;

No hay comentarios:

Publicar un comentario