Heroku Postgres-завершить зависший запрос (простоя в транзакции)
Я использую Heroku с опцией Crane Postgres, и я запускал запрос к базе данных с моей локальной машины, когда моя локальная машина разбилась. Если я бегу
select * from pg_stat_activity
одна из записей имеет
<IDLE> in transaction
в столбце current_query_text.
в результате я не могу удалить таблицу, в которую был записан запрос, который был завершен. Я попытался использовать pg_cancel_backend (N), и он возвращает True, но ничего не происходит.
Как могу ли я завершить этот процесс, чтобы я мог удалить таблицу?
4 ответов:
это общий ответ Postgres, а не специфический для heroku
найдите PID, запустив этот sql:
SELECT pid , query, * from pg_stat_activity WHERE state != 'idle' ORDER BY xact_start;(старые версии Postgres используют procpid, а не pid). Вы найдете pid в первом (левом) столбце, А первая (верхняя) строка, скорее всего, будет запросом, который вы хотите завершить. Я предполагаю, что pid-это 1234 ниже.
вы можете отменить запрос через SQL (т. е. без доступа к оболочке), пока он ваш или у вас есть суперпользовательский доступ:
select pg_cancel_backend(1234);это "мягкий" способ ... запрос не исчезнет сразу. Если вы торопитесь, попробуйте вместо этого:
select pg_terminate_backend(1234);если у вас есть доступ к оболочке и права root или postgres, вы также можете сделать это из оболочки:
kill -INT 1234если это не помогает, используйте:
kill 1234НЕ НАДО:
kill -9 1234... это часто приводит к тому, что весь сервер postgres падает пламя, тогда вы можете также перезапустить postgres. Postgres довольно надежен, поэтому данные не будут повреждены, но я бы рекомендовал не использовать "kill -9" в любом случае ; -)
длительное " бездействие в транзакции "часто означает, что транзакция не была завершена с помощью" фиксации "или" отката", что означает, что приложение является ошибочным или неправильно разработанным для работы с транзакционными базами данных. Следует избегать длительного "простоя в транзакции", так как это также может привести к серьезным последствиям проблема с производительностью.
попробуйте это:
select pg_terminate_backend(pid int)подробнее об этом вы можете найти здесь. Это должно быть "более чистое" решение этой проблемы, чем процесс убийства системой.
вы можете установить
heroku-pg-extrasнадстройка и выполните следующую команду, чтобы получить PID:heroku pg:locks --app <your-app>тогда просто сделайте:
heroku pg:kill <pid> --app <your-app>Примечание:
--forceопция может быть использована для выдачи pg_terminate_backend, который отбрасывает все соединение для этого запроса.если
heroku pg:locksничего не перечисляет, попробуйтеheroku pg:ps.для получения дополнительной информации out:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
мы можем использовать следующее Для достижения этого в одном запросе:
SELECT pg_cancel_backend(pid), pg_terminate_backend(pid) FROM pg_stat_activity WHERE state != 'idle';
Comments