Amazon Relational Database Service(Amazon RDS) for PostgreSQL 또는 Amazon Aurora PostgreSQL 호환 버전 데이터베이스(DB) 인스턴스에서 장기 실행 프로세스를 종료하려고 합니다.
간략한 설명
사용 사례에 따라 pg_cacnel_backend(pid) 또는 pg_terminate_backend(pid) 함수를 사용할 수 있습니다.
pg_cancel_backend(pid) 함수를 사용하여 SIGINT 신호를 특정 백엔드 프로세스에 보내고 현재 장기 실행 쿼리를 취소합니다. 이 프로세스 동안 데이터베이스 연결은 활성 상태로 유지됩니다. 함수가 현재 쿼리를 정상적으로 종료한 후 백엔드는 다른 쿼리나 트랜잭션을 계속 처리할 수 있습니다.
pg_terminate_backend(pid) 함수를 사용하여 쿼리를 종료하고 연결을 닫습니다. 이 함수를 사용하여 SIGTERM 신호를 특정 백엔드 프로세스로 보내고 프로세스와 관련된 연결을 강제로 종료합니다. 이 프로세스는 연결 내에서 열린 트랜잭션 또는 보류된 잠금을 롤백하고 해제합니다.
자세한 내용은 PostgreSQL 웹 사이트에서 서버 신호 함수를 참조하십시오.
참고: 일부 Aurora PostgreSQL 호환 버전은 모든 시스템 요구 사항을 충족하더라도 autovacuum 프로세스를 종료할 수 없습니다. 이러한 버전에서 autovacuum 프로세스를 종료하려고 하면 다음과 같은 오류 메시지가 표시될 수 있습니다.
"ERROR: 42501: must be a superuser to terminate superuser process LOCATION: pg_terminate_backend, signalfuncs.c:227."
일부 마이너 버전에서는 rds_superuser가 역할과 명시적으로 연결되지 않은 autovacuum 프로세스를 종료할 수 있습니다. 사용 중인 버전에서 rds_superuser를 통해 autovacuum 프로세스를 종료할 수 있는지 확인하려면 Amazon Aurora PostgreSQL 업데이트를 참조하십시오.
해결 방법
pg_cacnel_backend(pid) 또는 **pg_terminate_backend(pid)**를 사용하려면 다음 사용자 중 하나여야 합니다.
- rds_superuser이거나 기본 역할 pg_signal_backend의 구성원입니다.
- 취소하려는 세션의 동일한 데이터베이스 사용자로 데이터베이스에 연결되어 있습니다.
장기 실행 쿼리를 종료하려면 트랜잭션의 프로세스 ID(PID)가 있어야 합니다. PID를 찾으려면 pg_stat_activity 쿼리를 실행하고 pid 열을 확인하십시오. 자세한 내용은 PostgreSQL 웹 사이트에서 pg_stat_activity를 참조하십시오.
pg_cancel_backend(pid) 함수 사용
다른 세션에서 다음 명령을 실행하면 함수가 장기 실행 쿼리의 PID를 사용하여 데이터베이스 백엔드에서 쿼리를 취소합니다.
SELECT pg_cancel_backend(8121);
참고: 위 명령에서 쿼리의 PID는 8121입니다.
예상 출력:
pg_cancel_backend
------------------------
t
위 출력에서 ‘true’에 해당하는 t 값은 함수가 쿼리를 취소했음을 보여줍니다. 쿼리가 더 이상 존재하지 않거나 활성 데이터베이스 연결이 없는 경우 출력에는 ‘false’에 해당하는 f 값이 표시됩니다.
pg_terminate_backend(pid) 함수 사용
다른 세션에서 다음 명령을 실행하면 함수가 pid 8121을 사용하여 데이터베이스 연결을 종료합니다.
SELECT pg_terminate_backend(8121);
예상 출력:
pg_terminate_backend
------------------------
t
위 출력에서는 함수가 쿼리를 취소하지 않았더라도 t가 표시됩니다. 응답은 함수가 SIGTERM 신호를 성공적으로 전송했음을 보여줍니다. 이 함수는 백엔드 프로세스를 즉시 중단하지 않습니다. 공유 메모리를 일관된 상태로 유지하기 위해 명령은 CHECK_FOR_INTERRUPTS 중에 정상 종료 프로세스를 시작합니다.
종료되지 않는 장기 실행 프로세스 취소
인터럽트 가능한 섹션에서 pg_cancel_backend(pid) 또는 **pg_terminate_backend(pid)**를 실행하면 함수가 쿼리를 취소할 수 없습니다. 예를 들어, 프로세스는 경량 잠금을 획득하려고 시도합니다. 또는 프로세스에서 스토리지의 읽기 또는 쓰기 시스템 호출이 완료되기를 기다리고 있습니다. 이러한 경우 백엔드 프로세스가 취소 신호를 받지 못하고 프로세스가 무기한 중단됩니다.
프로세스가 취소 메서드에 응답하지 않는 경우 전체 데이터베이스 엔진을 다시 시작하고 멈춘 프로세스를 강제로 종료합니다.
PostgreSQL 버전 14 이상에서는 statement_timeout, idle_in_transaction_session_timeout 및 idle_session_timeout 등과 같은 제한 시간 파라미터를 조정하는 것이 모범 사례입니다. 또한 tcp_keepalives_idle, tcp_keepalives_interval, tcp_keepalives_count 등과 같은 클라이언트 쪽 제한 시간과 서버 쪽 제한 시간을 구성하는 것이 모범 사례입니다.
참고: 이러한 제한 시간 파라미터는 동적이므로 변경 사항을 적용하기 위해 데이터베이스를 재부팅할 필요가 없습니다.
요구 사항에 따라 파라미터를 구성합니다. 예를 들어 다음과 같은 수준에서 파라미터를 설정할 수 있습니다.
- 특정 쿼리에 대한 개별 명령문 수준
- 특정 사용자의 모든 쿼리에 대한 사용자 수준
- 전체 데이터베이스의 동작을 제어하기 위한 데이터베이스 수준
- 전역 설정을 수립하기 위한 인스턴스 파라미터 그룹 수준
참고: 제한 시간이 짧으면 의도적인 장기 실행 쿼리가 취소되므로 인스턴스 또는 데이터베이스 수준에서 짧은 제한 시간을 설정하지 마십시오. log_min_error_statement를 ERROR 이하로 설정하면 Amazon RDS는 제한 시간이 초과된 명령문을 로깅합니다. 자세한 내용은 PostgreSQL 웹 사이트에서 명령문 동작을 참조하십시오.
관련 정보
Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL DB 인스턴스의 실행 중인 쿼리를 확인하고 리소스 사용 문제를 진단하려면 어떻게 해야 합니까?
Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 DB 인스턴스에서 성능 문제 및 실행 속도가 느린 쿼리를 파악하고 문제를 해결하려면 어떻게 해야 합니까?