2010-08-25 17 views
12

volte vedo i messaggi comePostgresql ID oggetto e tuple

Processo 12990 aspetta ExclusiveLock su tuple (889,66) di relazione 17720 della base di dati 17607; bloccato da processo 12992.

Quindi ovviamente la parte "processo" è abbastanza chiara, ma non so come correlare tra l'ID della relazione e un nome leggibile dall'uomo. Inoltre, non so davvero cosa fare della parte della tupla.

Qualcuno sa leggere questi messaggi e come raccogliere dati utili da loro?

Grazie!

risposta

13

È possibile consultare le tabelle di sistema: quella di interesse è pg_class.

Facendo una query come

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 meglio

SELECT relname FROM pg_class WHERE OID=17720 

potrebbe far luce sulle serrature.

+0

Grazie! Ho scoperto l'id per relazionare la mappatura, ma non sono ancora sicuro di cosa fare delle tuple ... – user431221

+0

In realtà, dovrei chiarire - non so come leggere la notazione tupla (x, y) e come posso usarla per capire cosa ha causato il deadlock – user431221

+0

OK, un altro bit di dati trovato - i numeri sono ID di transazione che hanno inserito o cancellato quella tupla/riga. C'è un modo per farmi un'idea di quali operazioni SQL sono state eseguite? – user431221

17

Una "relazione" è una tabella e una "tupla" è una riga.

Ecco a nice shortcut per ottenere il nome della tabella dalla tabella id (è possibile anche interrogare la tabella pg_class):

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

Ora come circa la fila? Il "tuple bit" è un tuple identifier e ogni tabella nel database ha uno speciale system column chiamato ctid dove tali identificatori sono memorizzati. Ora che conosciamo la tabella in questione, possiamo fare:

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

Tuttavia! Dalla colonna di sistema doc (enfasi aggiunta): "[A] lthough il ctid può essere utilizzato per individuare la versione di riga molto rapidamente, il ctid di una riga cambierà se viene aggiornato o spostato da VACUUM FULL. Pertanto ctid è inutile come un identificatore di riga a lungo termine. " In altre parole, se sei abbastanza veloce puoi probabilmente credere che la riga restituita sia quella coinvolta nel deadlock, ma quelle informazioni non saranno disponibili per sempre.

+0

grazie per quello - utile e chiaro! – zeroDivisible