|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Доброго времени суток, уважаемые форумчане. Вопрос такой. Старый постгрес 9.6. Периодические возникают блокировки, хотелось бы отследить, какая сессия какой объект блокирует. По форуму поискал - аналогичной темы не нашёл. Находил запросы, которые показывают информацию, аналогичную pgAdmin (время, сессия, блокирующая сессия, запрос), но хотелось бы узнать, какой именно объект заблокирован. Видимо, надо смотреть в pg_locks/relations. Но, может кто имеет готовый запрос, аккуратно показывающий, какая сессия какой объект блокирует? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2021, 11:04 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2021, 16:19 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Перечитал вопрос и понял, что автору нужен другой запрос - какие объекты блокируются. Это не отменяет того, что Виктор Егоров написал хороший запрос показывающий какие сеансы кого блокируют. Мне кажется что именно в таком виде удобно отслеживать периодически возникаемые блокировки. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.03.2021, 22:59 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Павел Лузанов, Там можно на 26-й строчке убрать комментарий и будет видно объект блокировки, в виде ROW(pg_locks.*). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2021, 00:53 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Павел Лузанов, спасибо за ответ. Но, или я что-то не понял, или этот запрос показывает не совсем то, что мне нужно. В первой сессии я создаю таблицу lock1 : create table lock1 (c1 text, c2 numeric) insert into lock1 values ('a', '1'); insert into lock1 values ('b', '2'); И беру строку на update: update lock1 set c1='bbb' where c2='2' Далее, из второй сессии беру эту же строку на изменение (возникает блокировка): update lock1 set c1='ccc' where c2='2' И из третьей сессии запускаю Ваш запрос, с НЕзакомментированной строкой w.obj wait_on_object. Мой результат выглядит как-то так: ts_age change_age datname usename client_addr wait_on_object pid state lvl blocked query 00:02:17 00:02:17 ИМЯ_БАЗЫ ИМЯ_ПОЛЬЗОВАТЕЛЯ IP PID idletx 0 1 update lock1 set c1='bbb' where c2='2'00:01:40 00:01:40 ИМЯ_БАЗЫ ИМЯ_ПОЛЬЗОВАТЕЛЯ IP (transactionid.....137701111...) PID active 1 0 update lock1 set c1='ccc' where c2='2' Я рассчитывал, что столбец wait_on_object покажет мне мою таблицу lock1 . А как-то можно получить имя таблицы или связать эту циферку 137701111 с именем таблицы? Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 13:16 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Oracle is so Oracle, так а мы и не ждём лок на таблицу. Ждём именно завершение транзакции - чтобы понять, если она commit - то берём новую версию строки, если rollback - то берём версию будто той транзакции не было вовсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 13:21 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Запрос select * from pg_locks where transactionid='137701111' выдаёт мне: locktype database relation page tuple virtualxid transationid classid objid objsubid virtualtransatioin pid mode granted fastpathtransactionid 137701111 5/123 14525 ShareLock f ftransactionid 137701111 4/227 14514 ExclusiveLock t f И опять никакой информации об имени таблицы. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 13:22 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Melkij,спасибо за ответ. Ну меня интересует именно на чем висит моя сессия. В первом сообщении я попытался объяснить, что меня интересует именно имя таблицы, которая блокируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 13:24 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Oracle is so Oracle, Блокировки в постгресе устроены достаточно хитро, если хотите узнать подробнее можно начать отсюда . В примере вторая сессия ждет окончания транзакции в первой, как и написал Melkij. А первая сессия в общем случае могла работать (и получить блокировку) с разными объектами. В запросе есть столбец pid, вот по значению этого столбца из блокирующей строки запроса можете поискать в pg_locks все объекты с которыми она работает: Код: sql 1.
Этот запрос наверняка покажем вам lock1 ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 13:46 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Oracle is so Oracle, Сессия, которая что-то сделала и осталась висеть в `idle in transaction` никого не будет блокировать (сюрприз), пока этот кто-то не придёт, не захочет обратиться к объекту блокировки. Просто смотреть список всего в pg_locks, что “придерживает” такая сессия, смысла не имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 19:37 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
Oracle is so Oracle, Когда писал скрипт, пользовался такой комбинацией (во всех сессия явно открыть транзакцию и не завершать!): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Потом открываете седьмую сессию и смотрите на вывод скрипта. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.03.2021, 19:40 |
|
Блокировки. Какой объект(таблицу) держит какая сессия?
|
|||
---|---|---|---|
#18+
UP. Спасибо всем, кто ответил. Но задача не решена. Давайте зайдем с другой стороны. В Oracle, например, если мы создадим подобную блокировку: Код: plsql 1. 2. 3. 4. 5. 6. 7.
На объект, в котором возникла блокировка (только одной строки) можно посмотреть разными способами. Например запросом вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Который покажет что-то такое: owner object_name sid serial# status state blocking_session event osuser machineMY_USER TEST1 139 4440 INACTIVE WAITING SQL*Net message from client MY_OSUSER MY_MACHINEMY_USER TEST1 118 9899 ACTIVE WAITING 139 enq: TX - row lock contention MY_OSUSER MY_MACHINE и сразу всё понятно. Сессия с sid`ом 118 ожидает сессию с sid`ом 139. Объект блокировки - таблица MY_USER.TEST1. Тип блокировки - блокировка строки. Проблема найдена, решение за нами. Можем убить сессию, можем пойти посмотреть на таблицу и т.д. и т.п. Подобную же информацию можно получить и в Enterprise Manager`е. Возвращаемся к нашим слонам, к Postgres`у. В PgAdmin`е, OmniDB, EMS Studio ничего подобного не обнаружил. Пишут, какая сессия заблокирована, про объект ни слова. Запрос, предложенный Павлом Лузановым Код: plsql 1.
Покажет ВСЕ блокировки сессии/транзакции с соответствующим pid`ом. И да, там будет перечень объектов. Но мне нужен объект, на котором эти сессии застряли (как в примере с Oracle`овым запросом). Мне не нужны ВСЕ блокировки, которая использует сессия/транзакция (в моей задаче, кстати, заблокированная и блокирующая сессии имеют > 600 блокировок). Я понимаю, что механизм блокировок немного разный, и что в случае с Oracle`ом исходная строка после незакоммиченного апдейта лежит в undo, а в случае с Postgres`ом - в той же таблице создаётся новая версия строки. Повторный поиск в интернете ничего полезного не выдал. Единственная интересная инфа - вот тут https://stackoverflow.com/questions/62431485/when-and-how-does-postgres-use-transactionid-locks в частности написано, что в Postgres блокировки строк не хранятся в общей памяти постоянно, а в самой строке таблицы. ТАБЛИЦЫ. Но, тем не менее, как же мне найти ОБЪЕКТ Postgres`а, в котором создаётся эта строка, и, соответственно, на котором встали в ожидании транзакции? Хочу объект. По аналогии с Oracle`овым запросом. Я надеюсь, достаточно ясно описал ситуацию. Знает ли кто-нибудь решение проблемы? Пожалуйста, откликнетесь. P.S. Неужели, никто не встречался с подобным? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.03.2021, 15:28 |
|
|
start [/forum/topic.php?fid=53&fpage=14&tid=1994130]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 254ms |
total: | 376ms |
0 / 0 |