AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

Amazon RDS for PostrgreSQL 또는 Aurora PostgreSQL DB 인스턴스에서 장기 실행 쿼리를 종료하려면 어떻게 해야 합니까?

3분 분량
0

pg_cancel_backend(pid) 및 pg_terminate_backend(pid) 함수를 사용하여 Amazon Relational Database Service(Amazon RDS) for PostgreSQL 또는 Aurora PostgreSQL DB 인스턴스에서 장기 실행 프로세스를 종료하려고 합니다.

간략한 설명

PostgreSQL은 쿼리를 종료하는 두 가지 함수를 제공합니다.

  • pg_cancel_backend(pid): 쿼리를 종료하지만 연결은 활성 상태로 유지합니다.
  • pg_terminate_backend(pid): 쿼리를 종료하고 연결을 닫습니다. 이 함수를 실행하면 전체 연결이 종료되므로 실행 중인 다른 쿼리에 영향을 줄 수 있습니다. 마지막 수단으로 사용하십시오.

이러한 함수를 사용하려면 다음 권한 중 하나가 있어야 합니다.

  • rds_superuser이거나 기본 역할 pg_signal_backend의 멤버입니다.
  • 취소해야 하는 세션의 동일한 데이터베이스 사용자로 데이터베이스에 연결됩니다.

참고:

  • pid는 쿼리를 취소하기 위해 실행하는 백엔드 프로세스의 프로세스 ID입니다. pg_stat_activity 보기의 pid 열을 사용하여 활성 백엔드 프로세스의 프로세스 ID를 찾으십시오. 자세한 내용은 PostgreSQL 웹사이트에서 pg_stat_activity를 참조하십시오.
  • pg_signal_backendpg_terminate_backend는 프로세스 ID로 식별되는 백엔드 프로세스에 신호(각각 SIGINT 또는 SIGTERM)를 보냅니다. 자세한 내용은 PostgreSQL 웹사이트에서 서버 신호 함수를 참조하십시오.

해결 방법

pg_cancel_backend(pid)pg_terminate_backend(pid) 함수에 대한 다음 예제를 검토하십시오.

예: pg_cancel_backend(pid)

다음 명령을 다른 세션에서 실행하면 pid 8121을 사용하여 데이터베이스 백엔드에서 실행된 쿼리가 취소됩니다. 이 함수는 쿼리가 올바르게 취소되면 true를 반환합니다. 쿼리가 더 이상 존재하지 않거나 데이터베이스 연결이 없는 경우 이 함수는 false를 반환합니다.

postgres=> SELECT pg_cancel_backend(8121);
 pg_cancel_backend
------------------------
 t
(1 row)

예: pg_terminate_backend(pid)

다음 명령을 다른 세션에서 실행하면 pid 8121과의 데이터베이스 연결이 종료됩니다. 이 함수는 프로세스가 실제로 취소되었는지 여부에 관계없이 true를 반환합니다. 응답은 SIGTERM 신호가 성공적으로 전송되었다는 것만 나타냅니다. 이 명령은 백엔드 프로세스를 즉시 중단하지 않습니다. 대신 CHECK_FOR_INTERRUPTS를 실행하는 동안 백엔드 프로세스가 정상적으로 중단될 때까지 기다립니다. 이로 인해 프로세스가 취소되지 않아 공유 메모리가 일관되지 않은 상태가 됩니다.

postgres=> SELECT pg_terminate_backend(8121);
 pg_terminate_backend
------------------------
 t
(1 row)

종료되지 않는 장기 실행 프로세스를 취소하는 방법

pg_cancel_backend( )pg_terminate_backend( ) 함수가 쿼리를 취소하지 않는 경우가 있습니다. 이는 함수의 백엔드 프로세스가 중단할 수 없는 섹션에서 실행되기 때문입니다. 예를 들어 프로세스가 네트워크 스토리지 디바이스에 대한 가벼운 잠금 또는 읽기/쓰기 시스템 호출을 획득하기 위해 대기 중일 수 있습니다. 백엔드 프로세스는 신호를 받지 않고 무기한 정지합니다.

데이터베이스 엔진을 재시작하여 프로세스를 종료하십시오.

몇 가지 모범 사례

  • statement_timeout, idle_in_transaction_statement_timeoutidle_session_timeout(PostgreSQL, 버전 14 이상)과 같은 시간 제한 파라미터를 조정합니다. 클라이언트측 시간 제한과 서버측 시간 제한(tcp_keepalives_idle, tcp_keepalives_interval, tcp_keepalives_count)도 적절하게 설정하는 것이 좋습니다.
  • statement_timeout 파라미터는 적절한 수준(명령문, 사용자 수준, 데이터베이스 또는 인스턴스)에서 설정할 수 있습니다.
    참고: 의도적인 장기 실행 쿼리를 취소하므로 인스턴스 수준이나 데이터베이스 수준에서 제한 시간을 짧게 설정하는 것은 좋지 않습니다. log_min_error_statement가 ERROR 이하로 설정된 경우에는 시간 초과된 명령문이 기록됩니다. 자세한 내용은 PostgreSQL 웹사이트에서 명령문 동작을 참조하십시오.

관련 정보

Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL DB 인스턴스의 실행 중인 쿼리를 확인하고 리소스 소비 문제를 진단하려면 어떻게 해야 합니까?

RDS for PostgreSQL 또는 Aurora PostgreSQL 인스턴스에서 성능 문제 및 실행 속도가 느린 쿼리를 식별하고 문제를 해결하려면 어떻게 해야 합니까?

댓글 없음