Перечислите и уничтожьте все запросы на блокировку в PostgresSQL - PullRequest
0 голосов
/ 03 марта 2019

Я хочу очистить процессы моей БД в PostgreSQL, потому что несколько запросов находятся в тупиковой ситуации, и в результате вся база данных замедляется.

Поэтому я хочу знать, как лучше всего перечислить все запросы взаимной блокировки и очиститьони регулярно.

Я получил это представление от PgAdmin.

enter image description here

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Как прокомментировал a_horse_with_no_name , то, что вы видите в pgadmin, это обычные блокировки, а не взаимоблокировки .

Из документации Postgres :

PostgreSQL предоставляет различные режимы блокировки для управления одновременным доступом к данным в таблицах.Эти режимы могут использоваться для управляемой приложением блокировки в ситуациях, когда MVCC не дает желаемого поведения.Кроме того, большинство команд PostgreSQL автоматически получают блокировки соответствующих режимов, чтобы гарантировать, что ссылочные таблицы не будут удалены или изменены несовместимыми способами во время выполнения команды.

Экран в pgadmin, вероятно, основан на pg_lock системный вид .

Блокировки происходят в обычном процессе любой базы данных.Вы не хотите регулярно прерывать сеансы, которые генерируют блокировки, потому что это может по-разному повлиять на ваше приложение и базу данных.Вместо этого вы, вероятно, захотите идентифицировать (возможно, используя pg_lock представление), проанализировать и оптимизировать запросы, которые вызывают проблемы.


Когда речь идет о концепции deadlock :это специфическая ненормальная ситуация, которая может возникнуть при использовании блокировки, когда два сеанса взаимно ожидают другого.Они обычно указывают на проблемы в логике приложения.

Большинство СУБД автоматически идентифицируют и разрешают такую ​​ситуацию блокировки, и Postgres не является исключением :

PostgreSQL автоматически обнаруживает тупиковые ситуации и разрешает их, отменяя одну изтранзакции, позволяющие другим (их) завершить.(Точно, какая транзакция будет прервана, трудно предсказать, и на нее не следует полагаться.)

0 голосов
/ 03 марта 2019

Вот несколько запросов, которые должны вам помочь: https://wiki.postgresql.org/wiki/Lock_Monitoring

Для работы запросов может потребоваться небольшая настройка.Запросы немного длинные, поэтому я не буду вставлять их здесь, но просто знаю, что информация о блокировке и состоянии запроса доступна в таблицах БД pg_catalog.pg_locks и pg_catalog.pg_stat_activity.

. Вы можете запрашивать и присоединятьсяони как обычная таблица для построения того, что вы ищете.

Обратите внимание, что в лучшем случае эта информация используется для диагностики и отслеживания источника «тупиков», а не принудительной отменызапросы из базы данных.

...