이것은 일반적인 Postgres 답변이며 heroku에만 국한되지 않습니다.
(이 질문에 대한 간단하고 어리석은 대답은 ... postgresql을 다시 시작하십시오. 바람직하지 않거나 옵션이 아니라고 가정하면 ...)
이 SQL을 실행하여 PID를 찾으십시오.
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);
셸 액세스와 루트 또는 postgres 권한이있는 경우 셸에서도 수행 할 수 있습니다. "취소"하려면 다음을 수행하십시오.
kill -INT 1234
"종료"하려면 간단히 :
kill 1234
하지 마라:
kill -9 1234
... 그것은 종종 전체 postgres 서버가 불타 오르는 결과를 낳을 것입니다. 그러면 postgres를 다시 시작할 수도 있습니다. Postgres는 매우 강력하므로 데이터가 손상되지는 않지만 어떤 경우에도 "kill -9"를 사용하지 않는 것이 좋습니다. :-)
오래 지속되는 "트랜잭션 유휴"는 종종 트랜잭션이 "커밋"또는 "롤백"으로 종료되지 않았 음을 의미합니다. 즉, 응용 프로그램이 버그가 있거나 트랜잭션 데이터베이스에서 작동하도록 제대로 설계되지 않았 음을 의미합니다. 장기적인 "트랜잭션 유휴"는 주요 성능 문제를 일으킬 수 있으므로 피해야합니다.