pgsql 잠 금 표 후 kill 프로 세 스 작업
3013 단어 pgsql자물쇠 시계kill 프로 세 스
select * from pg_stat_activity
시스템 프로 세 스 조회어떤 시계 가 잠 겼 는 지 의심 되면 다음 sql 을 실행 할 수 있 습 니 다.
select oid from pg_class where relname='table_name'
그리고 받 은 oid 를 다음 sql 에 넣 고 실행 합 니 다:
select pg_cancel_backend('oid ');;
해결!이 sql 은 kill 역할 입 니 다.
추가:PostgreSQL-잠 긴 프로 세 스 를 어떻게 죽 입 니까?
머리말
한 번 의 시스템 교체 후 사용 자 는 시스템 에 성공 적 으로 로그 인 할 수 없다 고 신고 했다.테스트 를 통 해 재현 과 로그 포 지 셔 닝 을 한 결과 사용자 가 ui 에서 일부 조작 을 한 후에 스 택 에 이상 이 발생 하여 데이터 베이스 에 있 는 사용자 로그 인 정보 표 의 데이터 가 잠 겨 있어 서 방출 할 수 없 음 을 발견 했다.이 표 에 저 장 된 것 은 사용자 의 session 정보 입 니 다.
나중에 문 제 를 해 결 했 지만 데이터베이스 에 있 는 이 사용자 로그 인 정보 표 에 잠 겨 있 는 데 이 터 를 풀 수 없 기 때문에 사용자 가 로그 인 에 성공 하지 못 할 것 입 니 다.SQL 을 수 동 으로 뛰 어서 자 물 쇠 를 제거 해 야 합 니 다.
지정 한 프로 세 스 죽 이기
PostgreSQL 은 두 가지 함 수 를 제공 합 니 다:pgcancel_backend()와 pgterminate_backend(),이 두 함수 의 입력 매개 변 수 는 프로 세 스 PID 입 니 다.현재 프로 세 스 PID 를 20407 프로 세 스 로 죽 이려 고 한다 고 가정 하면 사용 방법 은 다음 과 같 습 니 다.
select pg_cancel_backend(20407);
--혹은 이 함 수 를 실행 해도 된다.
select pg_terminate_backend(20407);
이 두 함수 의 차 이 는 다음 과 같다.
pg_cancel_backend()
현재 사용자 의 배경 프로 세 스 만 닫 을 수 있 습 니 다.배경 에 SIGINT 신 호 를 보 내 서 업 무 를 닫 는 데 사용 합 니 다.이때 session 이 있 고 업무 가 다시 굴 러 갑 니 다.
pg_terminate_backend()
슈퍼 유저 권한 이 필요 합 니 다.모든 배경 프로 세 스 를 닫 을 수 있 습 니 다.배경 에 SIGTERM 신 호 를 보 내 사 무 를 닫 는 데 사용 합 니 다.이때 session 도 닫 히 고 트 랜 잭 션 이 다시 굴 러 갑 니 다.
그렇다면 어떤 시계,어떤 프로 세 스 가 잠 겨 있 는 지 어떻게 압 니까?다음 SQL 에서 찾 을 수 있 습 니 다:
select * from pg_locks a
join pg_class b on a.relation = b.oid
join pg_stat_activity c on a.pid = c.pid
where a.mode like '%ExclusiveLock%';
여기 서 찾 은 것 은 그것 의 자 물 쇠 를 배열 하거나 자 물 쇠 를 공유 하 는 것 과 같은 것 이다.여기 몇 가지 중요 한 column:a.pid 는 프로 세 스 id 이 고 b.relname 은 표 이름,제약 이름 또는 색인 이름 이 며 a.mode 는 잠 금 형식 입 니 다.지정 한 테이블 의 잠 금 프로 세 스 를 죽 입 니 다.
select pg_cancel_backend(a.pid) from pg_locks a
join pg_class b on a.relation = b.oid
join pg_stat_activity c on a.pid = c.pid
where b.relname ilike ' '
and a.mode like '%ExclusiveLock%';
--혹은 더 포악 한 pg 사용terminate_backend():
select pg_terminate_backend(a.pid) from pg_locks a
join pg_class b on a.relation = b.oid
join pg_stat_activity c on a.pid = c.pid
where b.relname ilike ' '
and a.mode like '%ExclusiveLock%';
그리고 주의해 야 할 것 은 pgterminate_backend()는 session 도 닫 습 니 다.이때 session Id 는 효력 을 잃 고 시스템 계 정 이 로그 인 을 종료 할 수 있 습 니 다.브 라 우 저의 캐 시 쿠키 를 제거 해 야 합 니 다(적어도 우리 시스템 이 만 나 는 상황 은 이 렇 습 니 다).이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.