중단된 쿼리 종료( 트랜잭션의 유휴 상태)
Heroku를 Crane Postgres 옵션과 함께 사용하고 있으며 로컬 컴퓨터에서 데이터베이스에 대한 쿼리를 실행하고 있을 때 로컬 컴퓨터가 충돌했습니다.내가 뛰면,
select * from pg_stat_activity
출품작 중 하나가
<IDLE> in transaction
current_message_text 열에 있습니다.
결과적으로 종료된 쿼리에 의해 작성된 테이블을 삭제할 수 없습니다.pg_cancel_backend(N)를 사용해봤는데 True가 반환되지만 아무 일도 일어나지 않는 것 같습니다.
테이블을 삭제할 수 있도록 이 프로세스를 종료하려면 어떻게 해야 합니까?
이것은 일반적인 Postgre입니다.Heroku에만 국한되지 않는 SQL 응답
(이 질문에 대한 단순한 바보 같은 대답은 ...일 수 있습니다.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);
셸 액세스 권한과 루트 또는 포스트그레스 권한이 있는 경우 셸에서도 이 권한을 수행할 수 있습니다."취소"하기 위해 할 수 있는 일:
kill -INT 1234
간단히 말해, 다음과 같습니다.
kill 1234
하지 말 것:
kill -9 1234
이는 종종 전체 포스트그레스 서버가 화염에 휩싸이는 결과를 초래할 수 있으며, 그런 다음 포스트그레스를 다시 시작하는 것이 좋습니다.포스트그레스는 꽤 강력해서 데이터가 손상되지는 않겠지만, 어떤 경우에도 "kill-9"를 사용하지 않는 것이 좋습니다 :-)
트랜잭션 유휴 상태가 오래 지속되면 트랜잭션이 "커밋" 또는 "롤백"으로 종료되지 않은 경우가 많습니다. 이는 애플리케이션이 트랜잭션 데이터베이스와 함께 작동하도록 버그가 있거나 제대로 설계되지 않았음을 의미합니다.장기간 지속되는 "거래 유휴"는 큰 성능 문제를 야기할 수 있기 때문에 피해야 합니다.
사용해 보십시오.
select pg_terminate_backend(pid int)
자세한 내용은 여기에서 확인할 수 있습니다.이것은 시스템에 의한 살인 과정보다 이 문제의 '깨끗한' 해결책이 되어야 합니다.
추가 기능을 설치하고 다음 명령을 실행하여 PID를 가져올 수 있습니다.
heroku pg:locks --app <your-app>
그럼 그냥 하세요.
heroku pg:kill <pid> --app <your-app>
참고:--force
옵션을 사용하여 해당 쿼리에 대한 전체 연결을 삭제하는 pg_details_details를 실행할 수 없습니다.
한다면heroku pg:locks
에 아무것도. 를 사용해 보십시오. 시도하십시오.heroku pg:ps
.
자세한 내용은 다음을 확인하십시오.
https://devcenter.heroku.com/articles/heroku-postgresql#://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
실행 중인 모든 쿼리를 종료하는 방법
SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE state = 'active';
언급URL : https://stackoverflow.com/questions/11291456/terminate-hung-query-idle-in-transaction
'programing' 카테고리의 다른 글
루비의 더블콜론::는? (0) | 2023.05.31 |
---|---|
Excel 문제 "excel 4.0 함수가 정의된 이름으로 저장됨" (0) | 2023.05.31 |
부울을 정수로 캐스팅하면 -1이 참입니까? (0) | 2023.05.21 |
예외.메시지 대 예외.문자열로() (0) | 2023.05.21 |
Android ADT 제거 (0) | 2023.05.21 |