2010-08-25 13 views
12

czasem zobaczyć wiadomości jakPostgresql ID i krotki

Sposób 12990 czeka na ExclusiveLock na krotki (889,66) w stosunku 17720 bazy danych 17607; zablokowany przez proces 12992.

Oczywiście część "procesowa" jest całkiem jasna, ale nie wiem, jak skorelować między identyfikatorem relacji a ludzką czytelną nazwą. Tak naprawdę nie wiem, co zrobić z krotką.

Ktoś wie, jak odczytać te wiadomości i jak zbierać od nich użyteczne dane?

Dzięki!

Odpowiedz

13

Możesz zajrzeć do tabel systemowych: jednym z interesujących tutaj jest pg_class.

Doing zapytanie jak

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

czy raczej

SELECT relname FROM pg_class WHERE OID=17720 

może rzucić światło na zamki.

+0

Dzięki! Wymyśliłem mapowanie id do relacji, ale nadal nie jestem pewien, co zrobić z krotkami ... – user431221

+0

Właściwie powinienem wyjaśnić - nie jestem pewien, jak czytać notację krotką (x, y) i jak mogę to wykorzystać, aby zrozumieć co spowodowało impas – user431221

+0

OK, znaleziono inny bit danych - liczby są identyfikatorami transakcji, które wstawiły lub usunęły tę krotkę/wiersz. Czy jest jakiś sposób, aby dowiedzieć się, w którym SQL były uruchomione te transakcje? – user431221

17

"Relacja" to tabela, a "krotka" to wiersz.

Oto a nice shortcut uzyskania nazwy tabeli z identyfikatorem tabeli (można również kwerendy tabeli pg_class):

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

Teraz jak o tym wierszu? "Bit krotki" to tuple identifier, a każda tabela w bazie danych ma specjalne system column o nazwie ctid, w którym przechowywane są te identyfikatory. Teraz, gdy znamy tę tabelę, możemy zrobić:

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

Jednak! Z dokumentacji kolumn systemowych (podkreślenie dodane): "[A] chociaż ctid może być użyty do szybkiego zlokalizowania wersji wiersza, ctid wiersza zmieni się, jeśli zostanie zaktualizowany lub przeniesiony przez VACUUM FULL. Dlatego ctid jest bezużyteczny jak długoterminowy identyfikator rzędu. " Innymi słowy, jeśli jesteś wystarczająco szybki, prawdopodobnie możesz ufać, że wiersz, który powrócił, jest związany z impasem, ale informacje te nie będą dostępne na zawsze.

+0

dzięki za to - przydatne i jasne! – zeroDivisible