Heroku Postgres-завершить зависший запрос (простоя в транзакции)



Я использую Heroku с опцией Crane Postgres, и я запускал запрос к базе данных с моей локальной машины, когда моя локальная машина разбилась. Если я бегу



select * from pg_stat_activity


одна из записей имеет



<IDLE> in transaction


в столбце current_query_text.



в результате я не могу удалить таблицу, в которую был записан запрос, который был завершен. Я попытался использовать pg_cancel_backend (N), и он возвращает True, но ничего не происходит.



Как могу ли я завершить этот процесс, чтобы я мог удалить таблицу?

749   4  

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

    Ничего не найдено.