Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 버전에서 메이저 버전 업그레이드 문제를 해결하려면 어떻게 해야 합니까?
Amazon Relational Database Service(Amazon RDS) for PostgreSQL 또는 Amazon Aurora PostgreSQL 호환 에디션의 엔진 버전 업그레이드가 중단되었거나 실패했습니다.
간략한 설명
메이저 버전 업그레이드에는 기존 애플리케이션과 하위 호환되지 않는 데이터베이스 변경 사항이 포함됩니다. 업그레이드로 인해 시스템 테이블, 데이터 파일 및 데이터 스토리지의 내부 형식이 변경될 수 있습니다. Amazon RDS는 pg_upgrade를 사용하여 메이저 버전 업그레이드를 수행합니다. 자세한 내용은 PostgreSQL 웹사이트의 pg_upgrade를 참조하십시오.
Amazon RDS는 메이저 버전 업그레이드 중에 사전 검사 절차를 실행하여 업그레이드 실패를 초래할 수 있는 문제를 파악합니다. 모든 데이터베이스에서 잠재적인 비호환 조건이 있는지 검사합니다. Amazon RDS에서 사전 검사 프로세스 중에 문제를 확인하면 실패한 사전 검사에 대한 로그 이벤트를 만듭니다. 로그 이벤트에는 파일 이름, 타임스탬프, 업그레이드 실패 이유가 포함됩니다. 모든 데이터베이스의 사전 검사 프로세스에 관한 자세한 내용은 pg_upgrade_precheck.log 로그를 참조하십시오. 엔진 관련 문제의 경우, Amazon RDS for PostgreSQL 또는 Aurora PostgreSQL 호환 버전의 데이터베이스 로그 파일을 확인해야 합니다.
해결 방법
AWS Command Line Interface(AWS CLI)를 실행할 때 오류가 발생하면 AWS CLI 오류 해결을 참조하십시오. 또한, AWS CLI 최신 버전을 사용 중이어야 합니다.
메이저 버전 업그레이드를 수행하는 pg_upgrade 유틸리티는 pg_upgrade_internal.log 로그 및 pg_upgrade_server.log 로그를 생성합니다. Amazon RDS는 로그의 파일 이름에 타임스탬프를 추가합니다. 업그레이드 중에 발생하는 문제 및 오류에 관한 자세한 정보를 얻으려면 로그를 검토하십시오. 자세한 내용은 Amazon RDS 로그 파일 모니터링 또는 Amazon Aurora 로그 파일 모니터링을 참조하십시오.
장기 실행 업그레이드
보류 중인 유지 관리 활동 확인
Amazon RDS는 자동으로 엔진 버전 업그레이드를 사용하여 Amazon RDS 인스턴스의 운영 체제(OS) 패치와 같은 보류 중인 유지 관리 활동을 적용합니다. Amazon RDS는 보류 중인 활동부터 적용한 다음, 엔진 버전을 업그레이드합니다. Amazon RDS가 유지 관리 활동을 수행해야 하는 경우, 업그레이드 시간이 더 오래 걸립니다.
Amazon RDS 인스턴스가 다중 AZ 배포인 경우, OS 유지 관리를 실행하면 장애 조치가 발생합니다. 다중 AZ 환경에서 인스턴스를 설정할 때 Amazon RDS는 일반적으로 보조 인스턴스에 인스턴스의 백업을 만듭니다. 장애 조치 시 Amazon RDS는 업그레이드 후 새 보조 인스턴스에 백업을 만듭니다. 새 보조 인스턴스에 만든 이 백업이 최신 백업이 아닐 수 있으므로 Amazon RDS는 증분 백업 대신 전체 백업을 완료합니다. 전체 백업은(특히 데이터베이스가 큰 경우) 시간이 오래 걸릴 수 있습니다.
이 문제를 방지하려면 RDS DB 인스턴스 또는 Aurora DB 인스턴스에 보류 중인 유지 관리 활동이 있는지 검색하십시오. 또는 인스턴스에서 다음과 같은 describe-pending-maintenance-actions AWS CLI 명령을 실행합니다.
aws rds describe-pending-maintenance-actions --resource-identifier example-arn
참고: example-arn을 DB 인스턴스 ARN으로 바꾸십시오.
데이터베이스 엔진 버전 업그레이드를 수행하기 전에 보류 중인 유지 관리 활동을 완료하십시오.
업그레이드 전에 스냅샷 만들기
버전을 업그레이드하기 전에 RDS DB 인스턴스 또는 Aurora DB 클러스터의 스냅샷을 만드는 것이 좋습니다. 인스턴스의 백업을 이미 활성화한 경우 Amazon RDS는 업그레이드 프로세스의 일부로 스냅샷을 자동으로 만듭니다. 스냅샷이 있으면 Amazon RDS가 업그레이드 시 증분 백업만 만들면 되기 때문에 업그레이드 프로세스 시간이 단축됩니다.
읽기 복제본이 업그레이드될 때까지 대기
기본 DB 인스턴스의 메이저 버전 업그레이드를 수행하면, Amazon RDS가 같은 AWS 리전의 모든 읽기 복제본을 자동으로 업그레이드합니다. 업그레이드 워크플로가 시작된 후, 읽기 복제본은 기본 DB 인스턴스에서 pg_upgrade가 성공적으로 완료될 때까지 대기합니다. 그런 다음 기본 DB 인스턴스 업그레이드는 읽기 복제본 업그레이드가 완료될 때까지 기다립니다. DB 인스턴스는 모든 업그레이드가 완료될 때까지 종료 상태로 유지됩니다. 업그레이드를 위한 가동 중지 시간이 짧은 경우, 복제본 인스턴스를 승격하거나 삭제하십시오. 그런 다음, 업그레이드가 완료된 뒤에 읽기 복제본을 다시 만듭니다.
Aurora DB 클러스터의 경우, pg_upgrade는 라이터 인스턴스부터 업그레이드합니다. 그런 다음, pg_upgrade가 새 메이저 버전으로 업그레이드할 때 각 리더 DB 인스턴스가 종료됩니다.
참고: Aurora 글로벌 데이터베이스를 업그레이드하는 경우, 추가적인 요구 사항 및 프로세스를 따라야 합니다.
업그레이드 전에 장기 실행 트랜잭션 또는 높은 워크로드 해결
장기 실행 트랜잭션이나 높은 워크로드가 있으면 Amazon RDS가 데이터베이스를 종료하고 데이터베이스 엔진을 업그레이드하는 데 걸리는 시간이 늘어날 수 있습니다.
장기 실행 트랜잭션이 있는지 확인하려면 다음 쿼리를 실행하십시오.
SQL>SELECT pid, datname, application_name, state, age(query_start, clock_timestamp()), usename, query FROM pg_stat_activity WHERE query NOT ILIKE '%pg_stat_activity%' AND usename!='rdsadmin' ORDER BY query_start desc;
장기 실행 트랜잭션이 확인되면 pg_cancel_backend 또는 pg_terminate_backend를 사용하여 해당 트랜잭션을 종료하십시오. pg_cancel_backend 및 pg_terminate_backend에 대한 자세한 내용은 PostgreSQL 웹 사이트의 서버 신호 함수를 참조하십시오.
컴퓨팅 용량이 충분한지 확인
pg_upgrade 유틸리티는 컴퓨팅 집약적일 수 있습니다. 컴퓨팅, 메모리 및 스토리지 여유 공간을 확인하려면 프로덕션 데이터베이스를 업그레이드하기 전에 테스트 업그레이드를 수행하는 것이 좋습니다. 테스트 업그레이드를 통해 사전 검사 또는 업그레이드 오류가 발생할지 여부도 확인할 수 있습니다. 프로덕션 인스턴스의 스냅샷을 복원하고, 프로덕션 데이터베이스의 인스턴스 클래스와 동일한 인스턴스 클래스를 사용해 테스트를 수행할 수 있습니다.
업그레이드 실패
지원되지 않는 DB 인스턴스 클래스 및 엔진 버전 확인
DB 인스턴스의 인스턴스 클래스가 업그레이드 목표인 PostgreSQL 버전과 호환되지 않으면 업그레이드가 실패합니다. 엔진 버전이 Amazon RDS 또는 Aurora의 인스턴스 클래스와 호환되는지 확인하십시오.
엔진 버전 업그레이드와 호환되는 엔진 버전을 확인하려면, 다음 describe-db-engine-versions 명령 실행:
aws rds describe-db-engine-versions --engine postgres --engine-version your-version --query "DBEngineVersions[].ValidUpgradeTarget[].{EngineVersion:EngineVersion}" --output text
참고: your-version을 엔진 버전으로 바꾸십시오.
현재 버전이 호환되지 않는 경우, 최신 마이너 버전으로 업그레이드하는 것이 좋습니다. 또는 다른 사용 가능한 업그레이드 버전 중 하나로 업그레이드할 수 있습니다. 엔진 버전 업그레이드에 대한 자세한 내용은 RDS for PostgreSQL 업그레이드에 대한 메이저 버전 선택을 참조하십시오.
진행 중인 준비된 트랜잭션 확인
데이터베이스에 진행 중인 준비된 트랜잭션이 있으면 업그레이드가 실패합니다. pg_upgrade.log 파일에 "There are uncommitted prepared transactions" 오류가 발생합니다. 업그레이드를 시작하기 전에 모든 진행 중인 준비된 트랜잭션을 커밋하거나 롤백하십시오.
인스턴스에 진행 중인 준비된 트랜잭션이 있는지 확인하려면 다음 쿼리를 실행하십시오.
SELECT count(*) FROM pg_catalog.pg_prepared_xacts;
지원되는 데이터 유형 사용
regclass, regrole 및 regtype 데이터 유형에 대해서만 버전을 업그레이드할 수 있습니다. pg_upgrade 유틸리티는 reg* OID(객체 식별자) 참조 유형을 사용하는 테이블 열이 포함된 데이터베이스는 업그레이드할 수 없습니다. regcollation, regconfig, regdictionary, regnamespace, regoper, regoperator, regproc 또는 regprocedure 데이터 유형을 사용하는 경우, 업그레이드가 실패합니다.
이 문제를 해결하려면 데이터 엔진을 업그레이드하기 전에 regclass, regrole, regtype을 뺀 reg* 데이터 유형 사용을 모두 제거하십시오. 테이블에 지원되지 않는 reg* 데이터 유형이 있는지 확인하려면 다음 쿼리를 실행합니다.
SELECT count(*) FROM pg_catalog.pg_class c, pg_catalog.pg_namespace n, pg_catalog.pg_attribute a WHERE c.oid = a.attrelid AND NOT a.attisdropped AND a.atttypid IN ('pg_catalog.regproc'::pg_catalog.regtype, 'pg_catalog.regprocedure'::pg_catalog.regtype, 'pg_catalog.regoper'::pg_catalog.regtype, 'pg_catalog.regoperator'::pg_catalog.regtype, 'pg_catalog.regconfig'::pg_catalog.regtype, 'pg_catalog.regdictionary'::pg_catalog.regtype) AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema');
논리적 복제 슬롯 확인
인스턴스에 논리적 복제 슬롯이 있으면 해당 인스턴스는 업그레이드할 수 없고, pg_upgrade.log 파일에 다음 오류 메시지가 표시됩니다.
"The instance could not be upgraded because one or more databases have logical replication slots. Please drop all logical replication slots and try again."
일반적으로 AWS Database Migration Service(AWS DMS) 마이그레이션에 논리적 복제 슬롯을 사용합니다. 또한 데이터베이스에서 데이터 레이크, 비즈니스 인텔리전스 도구 및 기타 대상으로 테이블을 복제하는 데에도 이러한 슬롯을 사용할 수 있습니다. 삭제할 수 있는지 판단하려면 사용하는 논리적 복제 슬롯의 목적을 이해해야 합니다. 논리적 복제 슬롯이 사용 중인 경우, 삭제하지 마십시오. 논리적 복제 슬롯을 삭제할 수 있기 전에는 버전 업그레이드를 기다려야 합니다.
논리적 복제 슬롯이 필요하지 않은 경우, 다음 명령을 실행하여 슬롯을 삭제합니다.
SELECT * FROM pg_replication_slots; SELECT pg_drop_replication_slot(slot_name);
참고: slot_name을 논리적 복제 슬롯 이름으로 바꾸십시오.
스토리지 문제 확인
pg_upgrade 스크립트를 실행하면 인스턴스에 공간이 소진되는 경우, 업그레이드가 실패하고 다음과 같은 오류 메시지가 표시됩니다.
"pg_restore: [archiver (db)] Error while PROCESSING TOC: pg_restore: [archiver (db)] could not execute query: ERROR: could not create file "base/12345/12345678": No space keyword" left on device"
이 문제를 해결하려면 업그레이드를 시작하기 전에 인스턴스에 스토리지 여유 공간이 충분한지 확인해야 합니다.
unknown 데이터 유형 확인
PostgreSQL 버전 10 이상에서는 unknown 데이터 유형을 사용할 수 없습니다. 예를 들어 PostgreSQL 버전 9.6 데이터베이스가 unknown 데이터 유형을 사용하는 경우, 버전 10으로 업그레이드하면 다음과 같은 오류 메시지가 표시됩니다.
"The instance could not be upgraded because the 'unknown' data type is used in user tables. Please remove all usages of the 'unknown' data type and try again."
이 문제를 해결하려면 unknown 데이터 유형을 사용하는 열을 수동으로 제거하거나, 지원되는 데이터 유형으로 수정하십시오.
데이터베이스에서 unknown 데이터 유형을 사용하는 열을 찾으려면 다음 쿼리를 실행합니다.
SELECT DISTINCT data_type FROM information_schema.columns WHERE data_type ILIKE 'unknown';
(RDS for PostgreSQL에만 해당) 읽기 복제본 업그레이드 실패 확인
PostgreSQl 인스턴스에 읽기 복제본이 있으면 읽기 복제본 업그레이드 실패로 인해 기본 인스턴스 업그레이드가 중단되거나 실패할 수 있습니다. Amazon RDS는 실패한 읽기 복제본을 incompatible-restore 상태로 설정하고, DB 인스턴스에서 복제를 중지합니다.
다음 이유 중 하나로 인해 읽기 복제본 업그레이드가 실패할 수 있습니다.
- 대기 시간이 지난 뒤에도 읽기 복제본이 기본 DB 인스턴스를 따라잡을 수 없습니다.
- 읽기 복제본의 상태가 storage-full 또는 incompatible-restore와 같은 종료 상태이거나 호환되지 않는 수명 주기 상태입니다.
- 기본 DB 인스턴스 업그레이드가 시작될 때 읽기 복제본에서 별도의 마이너 버전 업그레이드를 실행 중입니다.
- 읽기 복제본이 호환되지 않는 파라미터를 사용합니다.
- 읽기 복제본이 기본 DB 인스턴스와 통신하여 데이터 폴더를 동기화할 수 없습니다.
이 문제를 해결하려면 읽기 복제본을 삭제하십시오. 그런 다음, 업그레이드 이후에 업그레이드된 기본 인스턴스에 기반하여 새 읽기 복제본을 만듭니다.
기본 사용자 이름이 정확해야 함
기본 사용자 이름이 pg_로 시작하는 경우, 업그레이드가 실패하고 다음과 같은 오류 메시지가 표시됩니다.
"PreUpgrade checks failed: The instance could not be upgraded because one or more role names start with 'pg_'. Please rename all roles with names that start with 'pg_' and try again."
이 문제를 해결하려면 pg_로 시작하지 않는 rds_superuser 역할을 가진 사용자를 하나 더 만드십시오.
호환되지 않는 파라미터 확인
shared_buffer 또는 work_memory와 같은 메모리 관련 파라미터 값이 구성에 비해 너무 크면 "incompatible parameters" 오류가 발생합니다. 이 오류로 인해 업그레이드 스크립트가 실패합니다. 이 문제를 해결하려면 파라미터 값을 줄인 다음 업그레이드를 다시 수행하십시오.
업그레이드 전에 확장 프로그램 업데이트
메이저 버전 업그레이드는 PostgreSQL 확장 프로그램을 업그레이드하지 않습니다. 메이저 버전 업그레이드 전에 확장 프로그램을 업데이트하지 않으면 pg_upgrade.log 파일에 다음과 같은 오류 메시지가 표시될 수 있습니다.
"The Logs indicates that the RDS instance ''abcd'' has older version of PostGIS extension or its dependent extensions (address_standardizer,address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology, postgis_raster) installed as against the current version required for the upgrade."
위의 예시 오류 메시지는 PostGIS 확장 프로그램에 문제가 있음을 보여줍니다. 이 문제를 해결하려면 다음 쿼리를 실행해 PostGIS 및 그에 종속된 확장 프로그램의 기본 및 설치된 버전을 확인하십시오.
SELECT name, default_version, installed_versionFROM pg_available_extensions WHERE installed_version IS NOT NULL ANDname LIKE 'postgis%' OR name LIKE 'address%';
참고: **postgis%**를 확장 프로그램으로 바꾸십시오.
installed_version 값이 default_version 값보다 작으면 PostGIS를 기본 버전으로 업데이트해야 합니다. 확장 프로그램을 업그레이드하려면 다음 명령 실행:
ALTER EXTENSION extension_name UPDATE TO 'default_version_number';
참고: default_version_number를 default_version 값으로 바꾸십시오.
자세한 내용은 RDS for PostgreSQL DB 엔진 업그레이드 또는 Amazon Aurora PostgreSQL 호환 DB 클러스터 업그레이드를 참조하십시오.
뷰에서 문제를 일으키는 버전의 시스템 카탈로그 변경 사항 확인
특정 뷰에 표시되는 열은 PostgreSQL 버전마다 다릅니다. 예를 들어 다음과 유사한 오류 메시지가 표시될 수 있습니다.
"pg_restore: error: could not execute query: ERROR: column reference 'backend_type' is ambiguous"
이 오류는 데이터베이스를 버전 12.x에서 13.x로 업그레이드하려고 하며 pg_stat_activity 구조가 버전 12.x와 13.x에서 서로 다른 경우 발생합니다.
이 문제를 해결하려면 다음 단계를 완료하십시오.
-
다음 명령을 실행하여 뷰 정의를 쿼리합니다.
SELECT pg_get_viewdef('pg_stat_activity_allusers', true); -
다음 명령을 실행하여 뷰를 삭제합니다.
DROP VIEW pg_stat_activity_allusers; -
엔진 버전을 업그레이드합니다.
-
다음 명령을 실행하여 뷰를 다시 만듭니다.
CREATE VIEW pg_stat_activity_allusers AS SELECT * FROM get_sa(); GRANT SELECT ON pg_stat_activity_allusers TO public;
또는 다음과 유사한 오류 메시지가 표시될 수 있습니다.
"pg_restore: from TOC entry abc; abc abcd VIEW sys_user_constraints art pg_restore: error: could not execute query: ERROR: column c.consrc does not exist LINE 18: 'c'.'consrc' AS 'search_condition', ^ HINT: Perhaps you meant to reference the column 'c.conkey' or the column 'c.conbin'."
이 오류는 PostgreSQL 버전 12에서 pg_constraint 카탈로그 구조가 변경되는 경우 발생합니다.
이 문제를 해결하려면 대상 버전의 시스템 카탈로그에 따라 뷰를 삭제하십시오.
중요: 뷰를 삭제하기 전에 pgdump를 사용해 뷰를 백업하거나 뷰의 정의를 캡처하는 것이 좋습니다. 뷰를 삭제하면 사용자나 데이터베이스 관리자가 버전 업그레이드 이후 뷰를 수동으로 다시 만들어야 합니다.
prefetch 값이 있는 외래 테이블 확인
oracle_fdw 확장 프로그램을 사용해 Oracle 데이터베이스의 0~10,240개 사이의 행을 미리 가져옵니다. 외래 테이블의 OPTIONS 절에서 prefetch 파라미터를 설정합니다. 값이 클수록 성능이 개선되지만 PostgreSQL 서버에서 더 많은 메모리를 사용하게 됩니다. 메모리 사용량을 줄이려면 메이저 버전 업그레이드 사전 검사 단계에서 prefetch를 설정하는 것이 좋습니다.
prefetch 값이 1,000보다 크면 다음과 같은 오류 메시지가 표시될 수 있습니다.
"pg_restore: error: could not execute query: ERROR: invalid value for option 'prefetch'"
참고: 이 컨텍스트에서 유효한 값은 0~1,000 사이의 정수입니다.
이 문제를 해결하려면 모든 외래 테이블에서 prefetch 값을 1~1,000으로 설정한 다음 업그레이드를 다시 시도하십시오.
외래 테이블을 변경하려면 다음 명령을 실행합니다.
ALTER FOREIGN TABLE dwh_ddl_sync.fdw_all_tab_cols OPTIONS (SET prefetch '999');
모든 외래 테이블을 나열하려면 다음 명령을 실행합니다.
SELECT * from information_schema.foreign_tables;
테이블의 prefetch 값을 확인하려면 다음 명령을 실행합니다.
SELECT * FROM pg_foreign_table;
Babelfish for Aurora PostgreSQL 호환 클러스터를 업그레이드했는지 확인
Babelfish for Aurora PostgreSQL 호환 클러스터에서 메이저 엔진 버전 업그레이드를 수행할 때, 다음과 유사한 오류 메시지가 표시될 수 있습니다.
"You can't perform a multi major version upgrade on a Babelfish for Aurora PostgreSQL DB cluster 13.20 and lower versions."
이 문제를 해결하려면 클러스터를 메이저 버전 업그레이드가 지원되는 버전으로 업그레이드하고, 다음 메이저 버전으로 업그레이드하십시오.
업그레이드 완료 이후
업그레이드가 완료된 이후 모든 사용자 데이터베이스에서 ANALYZE 명령을 실행해 pg_statistics 테이블을 업데이트하십시오. 메이저 버전 업그레이드는 pg_statistics 테이블 내용을 새 버전으로 마이그레이션하지 않습니다. 이 내용을 마이그레이션하지 않으면 쿼리 실행 속도가 느려질 수 있습니다.
