programing

중단된 쿼리 종료( 트랜잭션의 유휴 상태)

batch 2023. 5. 31. 18:30
반응형

중단된 쿼리 종료( 트랜잭션의 유휴 상태)

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

반응형