2010-08-25 11 views
12

Algunas veces aparecen mensajes comoPostgresql ID de objeto y tuplas

Proceso 12990 esperas para ExclusiveLock sobre tupla (889,66) de relación 17 720 de base de datos de 17.607; bloqueado por el proceso 12992.

Así que, por supuesto, la parte del 'proceso' es bastante clara, pero no sé cómo correlacionar la relación ID con un nombre legible para el ser humano. Tampoco sé realmente qué hacer con la tupla.

¿Alguien sabe cómo leer estos mensajes y cómo recopilar datos útiles de ellos?

Gracias!

Respuesta

13

Puede buscar esto en las tablas del sistema: la de interés aquí es pg_class.

Hacer una consulta como

SELECT OID, relname FROM pg_class 
oid |    relname    
-------+------------------------------------ 
    1247 | pg_type 
11550 | user_mapping_options 
11554 | user_mappings 
11494 | triggered_update_columns 
11497 | triggers 

o más bien

SELECT relname FROM pg_class WHERE OID=17720 

podría arrojar luz sobre las cerraduras.

+0

Gracias! Descubrí el mapeo de relación a relación, pero todavía no estoy seguro de qué hacer con las tuplas ... – user431221

+0

En realidad, debo aclarar: no estoy seguro de cómo leer la notación de tupla (x, y) y cómo puedo usar eso para entender qué causó el interbloqueo – user431221

+0

OK, se encontraron otros datos: los números son identificadores de transacciones que insertaron o eliminaron esa tupla/fila. ¿Hay alguna manera de que pueda tener una idea de qué SQL se estaban ejecutando esas transacciones? – user431221

17

Una "relación" es una tabla y una "tupla" es una fila.

Aquí es a nice shortcut para obtener el nombre de la tabla de la mesa de Identificación (también se puede consultar la tabla pg_class):

=> select 17720::regclass; 
┌──────────┐ 
│ regclass │ 
├──────────┤ 
│ my_table │ 
└──────────┘ 
(1 row) 

Ahora ¿qué hay de la fila? El "bit de tupla" es un tuple identifier, y cada tabla en su base de datos tiene un system column especial llamado ctid donde se almacenan esos identificadores. Ahora que conocemos la tabla en cuestión, podemos hacer:

=> select * from my_table where ctid='(889,66)'; 

¡Sin embargo! Desde los documentos de la columna del sistema (énfasis añadido): "[A] Aunque el ctid se puede usar para localizar la versión de la fila muy rápidamente, el ctid de una fila cambiará si se lo actualiza o lo mueve VACUUM FULL. Por lo tanto, ctid es inútil un identificador de fila a largo plazo ". En otras palabras, si eres lo suficientemente rápido, probablemente puedas confiar en que la fila devuelta es la que está involucrada en el punto muerto, pero esa información no estará disponible para siempre.

+0

gracias por eso, ¡útil y claro! – zeroDivisible