Это общий ответ Postgres, а не специфический для героку
(Простой-глупый ответ на этот вопрос может быть ... просто перезапустите postgresql. Предполагая, что это нежелательно или не вариант ...)
Найдите PID, запустив этот sql:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(Запрос может потребовать исправления в зависимости от версии postgres - в конце концов, просто выберите * из pg_stat_activity). Вы найдете pid в первом (левом) столбце, а первая (верхняя) строка, скорее всего, будет запросом, который вы хотите завершить. Я предполагаю, что pid - 1234 ниже.
Вы можете отменить запрос через SQL (т.е. без доступа к оболочке), если он принадлежит вам или у вас есть права суперпользователя:
select pg_cancel_backend(1234);
Это «дружественный» запрос на отмену 1234-запроса, и, если повезет, через некоторое время он исчезнет. В конце концов, это более эффективно:
select pg_terminate_backend(1234);
Если у вас есть доступ к оболочке и права root или postgres, вы также можете сделать это из оболочки. Чтобы «отменить» можно:
kill -INT 1234
и "завершить" просто:
kill 1234
НЕ:
kill -9 1234
... это часто приводит к сгоранию всего сервера postgres, тогда вы также можете перезапустить postgres. Postgres довольно надежен, поэтому данные не будут повреждены, но я бы не рекомендовал использовать «kill -9» в любом случае :-)
Длительное «бездействие в транзакции» часто означает, что транзакция не была завершена с помощью «фиксации» или «отката», что означает, что приложение содержит ошибки или неправильно спроектировано для работы с транзакционными базами данных. Следует избегать длительного "простоя в транзакции", так как это также может вызвать серьезные проблемы с производительностью.