Amazon Relational Database Service(Amazon RDS) for PostgreSQL 또는 Amazon Aurora PostgreSQL 호환 버전 DB 인스턴스에서 장기 실행 프로세스를 종료하려고 합니다.
간략한 설명
쿼리를 종료하지만 연결은 그대로 유지하려면 **pg_cancel_backend(pid)**를 사용하십시오. 쿼리를 종료하고 연결을 닫으려면 **pg_terminate_backend(pid)**를 사용하십시오. 이 함수는 전체 연결을 종료하므로 진행 중인 다른 쿼리에 영향을 줄 수 있습니다. 필요한 경우에만 **pg_terminate_backend(pid)**를 사용하십시오.
함수를 사용하려면 다음 권한 중 하나가 있어야 합니다.
- rds_superuser이거나 기본 역할 pg_signal_backend의 구성원입니다.
- 취소하려는 세션의 동일한 데이터베이스 사용자로 데이터베이스에 연결되어 있습니다.
참고:
- pg_stat_activity 보기의 pid 열을 사용하여 활성 백엔드 프로세스의 프로세스 ID(PID)를 찾으십시오. 자세한 내용은 PostgreSQL 웹사이트에서 pg_stat_activity를 참조하십시오.
- pg_signal_backend는 SIGINT 신호를, pg_terminate_backend는 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_cancel_backend(pid) 및 pg_terminate_backend(pid) 함수의 예입니다.
pg_cancel_backend(pid)
다른 세션에서 다음 함수를 실행하면 pid 8121을 사용하여 데이터베이스 백엔드에서 실행되는 쿼리가 취소됩니다.
postgres=> SELECT pg_cancel_backend(8121);
예상 출력:
pg_cancel_backend
------------------------
t
(1 row)
다음을 실행하면 쿼리가 올바르게 취소되고 함수는 true(t)를 반환합니다. 쿼리가 더 이상 존재하지 않거나 데이터베이스 연결이 존재하지 않으면 함수는 false(f)를 반환합니다.
pg_terminate_backend(pid)
다음 함수를 다른 세션에서 실행하면 pid 8121과의 데이터베이스 연결이 종료됩니다.
postgres=> SELECT pg_terminate_backend(8121);
예상 출력:
pg_terminate_backend
------------------------
t
(1 row)
이 함수는 프로세스가 아직 취소되지 않은 경우에도 true**(t)**를 반환합니다. 응답은 SIGTERM 신호가 성공적으로 전송되었다는 것만 보여줍니다. 이 명령은 백엔드 프로세스를 즉시 중단하지 않습니다. 공유 메모리를 일관되지 않은 상태로 유지하기 위해 명령은 CHECK_FOR_INTERRUPTS 중에 발생하는 정상 종료 프로세스를 시작합니다.
종료되지 않는 장기 실행 프로세스 취소
인터럽트 가능한 섹션에서 pg_cancel_backend(pid) 및 **pg_terminate_backend(pid)**를 실행하면 함수가 쿼리를 성공적으로 취소하지 못합니다. 예를 들어 프로세스가 네트워크 스토리지 디바이스에 대한 가벼운 잠금이나 읽기 또는 쓰기 시스템 호출을 획득하기 위해 대기 중일 수 있습니다. 백엔드 프로세스는 신호를 받지 않고 무기한 정지합니다.
프로세스를 종료하려면 데이터베이스 엔진을 재시작합니다.
PostgreSQL 버전 14 이상에서는 statement_timeout, idle_in_transaction_statement_timeout 및 idle_session_timeout 등과 같은 시간 제한 파라미터를 조정하는 것이 좋습니다. 또한 tcp_keepalives_idle, tcp_keepalives_interval, tcp_keepalives_count 등과 같은 클라이언트측 시간 제한과 서버측 시간 제한도 설정하는 것이 좋습니다.
statement_timeout 파라미터를 명령문, 사용자 수준, 데이터베이스 또는 인스턴스 등과 같은 적절한 수준에서 설정할 수 있습니다.
참고: 짧은 제한 시간은 의도적인 장기 실행 쿼리를 취소하므로 인스턴스 수준이나 데이터베이스 수준에서 제한 시간을 짧게 설정하는 것은 좋지 않습니다. log_min_error_statement가 ERROR 이하로 설정된 경우에는 시간 초과된 명령문이 기록됩니다. 자세한 내용은 PostgreSQL 웹사이트에서 명령문 동작을 참조하십시오.
관련 정보
Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL DB 인스턴스의 실행 중인 쿼리를 확인하고 리소스 소비 문제를 진단하려면 어떻게 해야 합니까?
Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 DB 인스턴스에서 성능 문제 및 실행 속도가 느린 쿼리를 파악하고 문제를 해결하려면 어떻게 해야 합니까?