Я использую Heroku с опцией Crane Postgres, и я выполнял запрос к базе данных с моего локального компьютера, когда мой локальный компьютер вышел из строя. Если я сбегу
select * from pg_stat_activity
одна из записей
<IDLE> in transaction
в столбце current_query_text.
В результате я не могу отбросить таблицу, в которую выполнялась запись прерванным запросом. Я пробовал использовать pg_cancel_backend (N), и он возвращает True, но ничего не происходит.
Как я могу прервать этот процесс и отбросить стол?
postgresql
heroku
Алан
источник
источник
Ответы:
Это общий ответ Postgres, а не специфический для героку
(Простой-глупый ответ на этот вопрос может быть ... просто перезапустите postgresql. Предполагая, что это нежелательно или не вариант ...)
Найдите PID, запустив этот sql:
(Запрос может потребовать исправления в зависимости от версии postgres - в конце концов, просто выберите * из pg_stat_activity). Вы найдете pid в первом (левом) столбце, а первая (верхняя) строка, скорее всего, будет запросом, который вы хотите завершить. Я предполагаю, что pid - 1234 ниже.
Вы можете отменить запрос через SQL (т.е. без доступа к оболочке), если он принадлежит вам или у вас есть права суперпользователя:
Это «дружественный» запрос на отмену 1234-запроса, и, если повезет, через некоторое время он исчезнет. В конце концов, это более эффективно:
Если у вас есть доступ к оболочке и права root или postgres, вы также можете сделать это из оболочки. Чтобы «отменить» можно:
и "завершить" просто:
НЕ:
... это часто приводит к сгоранию всего сервера postgres, тогда вы также можете перезапустить postgres. Postgres довольно надежен, поэтому данные не будут повреждены, но я бы не рекомендовал использовать «kill -9» в любом случае :-)
Длительное «бездействие в транзакции» часто означает, что транзакция не была завершена с помощью «фиксации» или «отката», что означает, что приложение содержит ошибки или неправильно спроектировано для работы с транзакционными базами данных. Следует избегать длительного "простоя в транзакции", так как это также может вызвать серьезные проблемы с производительностью.
источник
select version()
. Вы получаете сообщения об ошибках при использованииpg_cancel_backend
?Попробуй это:
Подробнее об этом можно прочитать здесь . Это должно быть «более чистое» решение этой проблемы, чем уничтожение процесса системой.
источник
Вы можете установить
heroku-pg-extras
надстройку и выполнить следующую команду, чтобы получить PID:Тогда просто сделайте:
НОТА :
--force
параметр может использоваться для выдачи pg_terminate_backend, который удаляет все соединение для этого запроса.Если
heroku pg:locks
ничего не перечисляет, попробуйтеheroku pg:ps
.Для получения дополнительной информации посетите:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
источник
Мы можем использовать следующее, чтобы добиться этого в одном запросе:
источник
SELECT pid, pg_cancel_backend(pid) FROM pg_stat_activity WHERE state != 'idle' AND (now() - query_start) > interval '5 minutes';