Amazon RDS for PostgreSQL DB 인스턴스의 읽기 전용 복제본을 쿼리할 때 "canceling statement due to conflict with recovery" 오류를 해결하려면 어떻게 해야 합니까?

3분 분량
0

Amazon Relational Database Service(Amazon RDS) for PostgreSQL 인스턴스용 읽기 전용 복제본을 설정했습니다. 읽기 전용 복제본을 쿼리할 때 "canceling statement due to conflict with recovery" 오류가 발생합니다.

해결 방법

기본 인스턴스와 읽기 전용 복제본 간에 복제 충돌이 발생하면 cancelling statement 오류가 발생합니다. 변경으로 인해 읽기 전용 복제본에서 발생하는 활동이 차단될 수 있으므로 PostgreSQL은 읽기 전용 복제본에 WAL 정보를 적용할 수 없습니다. 예를 들어, 읽기 전용 복제본의 삭제된 테이블에서 SELECT 문이 실행 중일 때 기본 인스턴스에서 DROP 문을 실행합니다. 읽기 전용 복제본이 WAL 레코드를 적용하고 SELECT 문을 취소하면 cancelling statement 오류가 발생합니다.

cancelling statement 오류를 해결하려면 오류 메시지의 세부 정보를 기반으로 읽기 전용 복제본에 사용자 지정 파라미터를 설정하십시오.

읽기 전용 복제본의 pg_stat_database_conflicts 뷰에서 복구와의 충돌로 인해 취소된 문에 대한 통계를 확인할 수도 있습니다. 자세한 내용은 PostgreSQL 웹사이트의 27.2.18 pg_stat_database_conflicts를 참조하십시오.

오류 메시지 세부 정보: "User was holding a relation lock for too long"

이 문제를 해결하려면 max_standby_streaming_delay 또는 max_standby_archive_delay 파라미터를 변경하여 읽기 전용 복제본이 충돌하는 standby 문을 취소하기 전에 더 많은 시간을 허용하십시오. 읽기 전용 복제본이 스트리밍 복제본에서 WAL 데이터를 읽는 경우 max_standby_streaming_delay 파라미터를 수정하십시오. 읽기 전용 복제본이 Amazon Simple Storage Service(Amazon S3)의 아카이브 위치에서 WAL 데이터를 읽는 경우 max_standby_archive_delay 파라미터를 수정하십시오.

이러한 파라미터에 대한 자세한 내용은 PostgreSQL 웹사이트의 max_standby_streaming_delay (integer)max_standby_archive_delay (integer)를 참조하십시오.

파라미터 값을 0으로 설정하면 읽기 전용 복제본이 충돌하는 쿼리를 취소하고 복제본 인스턴스에 WAL 항목을 적용합니다. 값을 -1로 설정하면 복제본 인스턴스가 충돌하는 쿼리를 영원히 기다리게 되고, 복제 지연이 증가합니다. 이러한 파라미터의 값을 조정하여 사용 사례에 따라 쿼리 취소 또는 복제 지연의 균형을 맞출 수 있습니다.

참고: WAL 아카이브 항목 읽기와 충돌하는 쿼리를 유지하기 위해 max_standby_archive_delay를 늘리는 경우 취소를 방지하기 위해 max_standby_streaming_delay도 늘리는 것이 좋습니다.

오류 메시지 세부 정보: "User query might have needed to see row versions that must be removed"

이 문제는 일반적으로 읽기 전용 복제본의 트랜잭션이 기본 인스턴스에서 삭제하도록 설정된 튜플을 읽을 때 발생합니다. 이 문제를 해결하려면 hot_standby_feedback 파라미터를 활성화해야 할 수 있습니다.

hot_standby_feedback을 활성화하면 읽기 전용 복제본이 기본 인스턴스에 가장 오래된 활성 트랜잭션에 대한 정보가 포함된 피드백 메시지를 보냅니다. 그에 따라 기본 인스턴스는 트랜잭션에 필요할 수 있는 레코드를 제거하지 않습니다. 이 파라미터에 대한 자세한 내용은 PostgreSQL 웹사이트의 hot_standby_feedback (boolean)을 참조하십시오.

중요: hot_standby_feedback 파라미터는 기본적으로 비활성화됩니다. 읽기 전용 복제본에서 hot_standby_feedback을 활성화하면 읽기 전용 복제본의 장기 실행 쿼리로 인해 기본 인스턴스의 테이블 팽창이 발생할 수 있습니다. vacuum 작업은 장기 실행 쿼리에 필요할 수 있는 데드 튜플(팽창)을 제거하지 않습니다. 팽창 위험을 줄이려면 autovacuum_thresholdautovacuum_vacuum_scale_factor를 줄이고 autovacuum_cost_limit를 늘리는 것이 좋습니다.