Heroku Postgres-중단 된 쿼리 종료 (트랜잭션 유휴)
Crane Postgres 옵션과 함께 Heroku를 사용하고 있으며 로컬 시스템이 충돌했을 때 로컬 시스템에서 데이터베이스에 대한 쿼리를 실행하고있었습니다. 내가 달리면
select * from pg_stat_activity
항목 중 하나가
<IDLE> in transaction
current_query_text 열에 있습니다.
결과적으로 종료 된 쿼리에 의해 작성되고 있던 테이블을 삭제할 수 없습니다. pg_cancel_backend (N) 사용을 시도했지만 True를 반환하지만 아무 일도 일어나지 않는 것 같습니다.
테이블을 삭제할 수 있도록이 프로세스를 종료하려면 어떻게해야합니까?
이것은 일반적인 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);
이것은 "부드러운"방법입니다. 쿼리가 즉시 사라지지 않습니다. 작동하지 않으면 대신 다음을 사용하십시오.
select pg_terminate_backend(1234);
셸 액세스 및 루트 또는 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
.
자세한 내용은 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';
'code' 카테고리의 다른 글
math.h 헤더를 포함 했는데도 왜 "sqrt에 대한 정의되지 않은 참조"오류가 발생합니까? (0) | 2020.09.03 |
---|---|
HQL 오류 : 결합에 필요한 경로 (0) | 2020.09.03 |
Type Dynamic은 어떻게 작동하며 어떻게 사용합니까? (0) | 2020.09.03 |
SDL 렌더러 란 무엇입니까? (0) | 2020.09.03 |
사육사는 Kafka의 필수품입니까? (0) | 2020.09.03 |