Идентификатор объекта Postgresql и кортежи
Иногда я вижу сообщения типа
Процесс 12990 ожидает ExclusiveLock по кортежу (889,66) отношения 17720 базы данных 17607; заблокирован процессом 12992.
Итак, конечно, часть "процесса" совершенно ясна, но я не знаю, как соотнести между идентификатором отношения и понятным для человека именем. Я также не знаю, что делать с битом кортежа.
Кто-нибудь знает, как читать эти сообщения и как извлекать из них полезные данные?
Спасибо!
Ответы
Ответ 1
Вы можете посмотреть это на системные таблицы: здесь интересен pg_class
.
Выполнение запроса типа
SELECT OID, relname FROM pg_class
oid | relname
-------+------------------------------------
1247 | pg_type
11550 | user_mapping_options
11554 | user_mappings
11494 | triggered_update_columns
11497 | triggers
или скорее
SELECT relname FROM pg_class WHERE OID=17720
может пролить свет на блокировки.
Ответ 2
"Отношение" - это таблица, а "кортеж" - это строка.
Здесь красивый ярлык для получения имени таблицы из идентификатора таблицы (вы также можете запросить таблицу pg_class
):
=> select 17720::regclass;
┌──────────┐
│ regclass │
├──────────┤
│ my_table │
└──────────┘
(1 row)
Теперь как насчет строки? "Кортежный бит" является идентификатором кортежа, и каждая таблица в вашей базе данных имеет специальный столбец ctid
, где хранятся эти идентификаторы. Теперь, когда мы знаем эту таблицу, мы можем сделать:
=> select * from my_table where ctid='(889,66)';
Однако! Из документов системного столбца (выделено мной): "[A], хотя ctid можно использовать для быстрого поиска версии строки, строка ctid изменит, если она обновлена или перемещена VACUUM FULL. Поэтому ctid бесполезен как идентификатор долгосрочной строки." Другими словами, если вы достаточно быстр, вы, вероятно, можете доверять тому, что возвращаемая строка является той, которая задействована в тупике, но эта информация не будет доступна навсегда.