AWS Database Migration Service에서 PostgreSQL 데이터베이스를 대상으로 사용 - AWS Database Migration Service

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS Database Migration Service에서 PostgreSQL 데이터베이스를 대상으로 사용

다른 PostgreSQL 데이터베이스 또는 지원되는 다른 데이터베이스 중 하나를 사용하여 PostgreSQL 데이터베이스로 AWS DMS데이터를 마이그레이션할 수 있습니다.

대상으로 AWS DMS 지원하는 PostgreSQL 버전에 대한 자세한 내용은 을 참조하십시오. 대상: AWS DMS

참고
  • Amazon Aurora 서버리스는 PostgreSQL과 호환되는 Amazon Aurora의 타겟으로 사용할 수 있습니다. Amazon Aurora 서버리스에 대한 자세한 내용은 Amazon Aurora 사용 설명서의 Amazon Aurora 서버리스 v2 사용을 참조하십시오.

  • Aurora Serverless DB 클러스터는 Amazon VPC에서만 액세스할 수 있으며 퍼블릭 IP 주소를 사용할 수 없습니다. 따라서 Aurora PostgreSQL Serverless가 아닌 다른 지역에 복제 인스턴스를 사용하려는 경우, vpc 피어링을 구성해야 합니다. 그렇지 않으면 Aurora PostgreSQL 서버리스 지역의 가용성을 확인하고 Aurora PostgreSQL 서버리스와 복제 인스턴스 모두에 해당 지역 중 하나를 사용하기로 결정하십시오.

  • Babelfish 기능은 Amazon Aurora에 내장되어 있으며 추가 비용이 들지 않습니다. 자세한 내용은 AWS Database Migration Service의 대상으로 Babelfish for Aurora PostgreSQL 사용을 참조하십시오.

AWS DMS 전체 로드 단계에서 소스에서 타겟으로 데이터를 마이그레이션할 때 table-by-table 접근 방식을 취합니다. 전체 로드 단계 시 테이블 순서를 보장할 수 없습니다. 일반적으로 전체 로드 단계가 수행되는 동안과 개별 테이블의 캐시된 트랜잭션이 적용되는 동안 테이블은 동기화되지 않습니다. 결과적으로 활성 참조 무결성 제약으로 인해 전체 로드 단계 중에 작업 실패가 발생합니다.

PostgreSQL에서는 트리거를 사용하여 외래 키(참조 무결성 제약)가 구현됩니다. 전체 로드 단계에서는 각 테이블을 한 번에 하나씩 AWS DMS 로드합니다. 다음 방법 중 하나를 사용하여 전체 로드 동안 외래 키 제약을 비활성화하는 것이 좋습니다.

  • 인스턴스에서 모든 트리거를 임시로 비활성화한 후 전체 로드를 완료합니다.

  • PostgreSQL에서 session_replication_role 파라미터를 사용합니다.

해당 시점에 트리거는 origin, replica, always 또는 disabled 상태 중 하나일 수 있습니다. session_replication_role 파라미터가 replica로 설정되는 경우, replica 상태의 트리거만 활성 상태이며 호출될 때 트리거됩니다. 그렇지 않으면, 트리거가 비활성 상태로 유지됩니다.

PostgreSQL에는 session_replication_role이 설정되었더라도 테이블 잘림을 방지하기 위한 안전 메커니즘이 있습니다. 전체 로드 실행이 완료될 수 있도록 이 메커니즘을 대안으로 사용하여 트리거를 비활성화할 수 있습니다. 이렇게 하려면 대상 테이블 준비 모드를 DO_NOTHING으로 설정합니다. 그렇지 않으면 외래 키 제약이 있는 경우 DROP 및 TRUNCATE 작업이 실패합니다.

Amazon RDS에서는 파라미터 그룹을 사용하여 이 파라미터 설정을 제어할 수 있습니다. Amazon EC2에서 실행 중인 PostgreSQL 인스턴스의 경우, 파라미터를 직접 설정할 수 있습니다.

PostgreSQL 데이터베이스를 대상으로 사용하는 방법에 AWS DMS대한 자세한 내용은 다음 섹션을 참조하십시오.

PostgreSQL을 타겟으로 사용할 때의 제한 사항 AWS Database Migration Service

다음 제한 사항은 AWS DMS에서 PostgreSQL 데이터베이스를 대상으로서 사용할 때 적용됩니다.

  • 이기종 마이그레이션의 경우 내부적으로 JSON 데이터 형식이 네이티브 CLOB 데이터 형식으로 변환됩니다.

  • Oracle에서 PostgreSQL로 마이그레이션할 때 Oracle의 열에 NULL 문자 (16진수 값 U+0000) 가 포함된 경우 NULL 문자를 공백 (16진수 값 U+0020) AWS DMS 으로 변환합니다. 이는 PostgreSQL 제한 사항 때문입니다.

  • AWS DMS coalesce 함수로 생성된 고유 인덱스가 있는 테이블로의 복제를 지원하지 않습니다.

  • 테이블에서 시퀀스를 사용하는 경우 원본 데이터베이스에서 복제를 중지한 후 대상 데이터베이스의 각 시퀀스에 NEXTVAL 대한 값을 업데이트하십시오. AWS DMS 원본 데이터베이스의 데이터를 복사하지만 복제가 진행 중인 동안에는 시퀀스를 대상으로 마이그레이션하지 않습니다.

PostgreSQL 데이터베이스를 대상으로 사용할 때의 보안 요구 사항 AWS Database Migration Service

보안상의 목적으로 데이터 마이그레이션에 사용되는 사용자 계정은 대상으로 사용하는 모든 PostgreSQL 데이터베이스에서 등록된 사용자여야 합니다.

PostgreSQL 대상 엔드포인트에는 마이그레이션을 AWS DMS 실행하려면 최소 사용자 권한이 필요합니다. 다음 예를 참조하십시오.

CREATE USER newuser WITH PASSWORD 'your-password'; ALTER SCHEMA schema_name OWNER TO newuser;

또는

GRANT USAGE ON SCHEMA schema_name TO myuser; GRANT CONNECT ON DATABASE postgres to myuser; GRANT CREATE ON DATABASE postgres TO myuser; GRANT CREATE ON SCHEMA schema_name TO myuser; GRANT UPDATE, INSERT, SELECT, DELETE, TRUNCATE ON ALL TABLES IN SCHEMA schema_name TO myuser; GRANT TRUNCATE ON schema_name."BasicFeed" TO myuser;

PostgreSQL을 대상으로 사용할 때의 엔드포인트 설정 및 추가 연결 속성 (ECA) AWS DMS

엔드포인트 설정 및 추가 연결 속성 (ECA) 을 사용하여 PostgreSQL 대상 데이터베이스를 구성할 수 있습니다.

AWS DMS 콘솔을 사용하거나 에서 JSON 구문을 사용하여 create-endpoint 명령을 사용하여 대상 엔드포인트를 생성할 때 설정을 지정합니다. AWS CLI--postgre-sql-settings '{"EndpointSetting": "value", ...}'

엔드포인트의 ExtraConnectionAttributes 파라미터를 사용하여 ECA를 지정합니다.

PostgreSQL을 대상으로 사용할 수 있는 엔드포인트 설정이 다음 테이블에 나와 있습니다.

명칭 설명

MaxFileSize

데이터를 PostgreSQL로 전송할 때 사용되는 .csv 파일의 최대 크기(단위: KB)를 지정합니다.

기본값: 32,768KB(32MB)

유효값: 1~1,048,576KB(최대 1.1GB)

예제: --postgre-sql-settings '{"MaxFileSize": 512}'

ExecuteTimeout

PostgreSQL 인스턴스의 클라이언트 문 제한 시간을 초 단위로 설정합니다. 기본값은 60초입니다.

예제: --postgre-sql-settings '{"ExecuteTimeout": 100}'

AfterConnectScript= SET session_replication_role = replica

이 속성에는 AWS DMS 데이터를 대량으로 로드하는 데 걸리는 시간을 줄이기 위한 우회 외부 키와 사용자 트리거가 있습니다.

MapUnboundedNumericAsString

이 파라미터는 숫자 값의 정밀도를 유지하면서 성공적으로 마이그레이션할 수 있도록 제한이 없는 숫자 데이터 형식의 열을 문자열로 취급합니다. 이 파라미터는 PostgreSQL 소스에서 PostgreSQL 대상 또는 PostgreSQL과 호환되는 데이터베이스로 복제하는 경우에만 사용하십시오.

기본값: false

유효값: false/true

예제: --postgre-sql-settings '{"MapUnboundedNumericAsString": "true"}

이 파라미터를 사용하면 숫자에서 문자열로, 다시 숫자로 변환되므로 복제 성능이 일부 저하될 수 있습니다. 이 파라미터는 DMS 버전 3.4.4 이상에서 사용할 수 있습니다.

참고

단지 MapUnboundedNumericAsString을 PostgreSQL 소스 및 대상 엔드포인트에서 함께 사용해야 합니다.

소스 PostgreSQL 엔드포인트에서 MapUnboundedNumericAsString을 사용하면 CDC 중에 정밀도가 28로 제한됩니다. 대상 엔드포인트에서 MapUnboundedNumericAsString을 사용하면 정밀도 28, 스케일 6으로 데이터를 마이그레이션할 수 있습니다.

PostgreSQL이 아닌 대상에 MapUnboundedNumericAsString을 사용하지 마세요.

loadUsingCSV

이 추가 연결 속성 (ECA) 을 사용하면\ COPY 명령을 사용하여 전체 로드 작업에 필요한 데이터를 전송할 수 있습니다.

기본 값: true

유효값: true/false

ECA 예제: loadUsingCSV=true;

참고: 이 ECA를 false로 설정하면 INSERT가 직접 실행되기 때문에 복제 성능이 일부 저하될 수 있습니다.

DatabaseMode

이 속성을 사용하면 Babelfish 엔드포인트와 같이 일부 추가 구성이 필요한 PostgreSQL 호환 엔드포인트에 대한 복제 처리의 기본 동작을 변경할 수 있습니다.

기본 값: DEFAULT

유효값: DEFAULT, BABELFISH

예제: DatabaseMode=default;

BabelfishDatabaseName

이 속성을 사용하여 마이그레이션할 대상 Babelfish T-SQL 데이터베이스의 이름을 지정할 수 있습니다. DatabaseModeBabelfish로 설정된 경우 이 데이터베이스는 필수입니다. 이는 예약된 babelfish_db 데이터베이스가 아닙니다.

예제: BabelfishDatabaseName=TargetDb;

PostgreSQL용 대상 데이터 형식

에 대한 PostgreSQL 데이터베이스 엔드포인트는 대부분의 PostgreSQL 데이터베이스 데이터 AWS DMS 유형을 지원합니다. 다음 표에는 을 AWS DMS 사용할 때 지원되는 PostgreSQL 데이터베이스 대상 데이터 유형과 데이터 유형으로부터의 기본 매핑이 나와 있습니다. AWS DMS

AWS DMS 데이터 유형에 대한 자세한 내용은 을 참조하십시오. AWS Database Migration Service에서 사용되는 데이터 형식

AWS DMS 데이터 유형

PostgreSQL 데이터 형식

BOOLEAN

BOOLEAN

BLOB

BYTEA

BYTES

BYTEA

날짜

날짜

TIME

TIME

DATETIME

크기 범위가 0~6인 경우, TIMESTAMP를 사용합니다.

크기 범위가 7~9인 경우, VARCHAR(37)을 사용합니다.

INT1

SMALLINT

INT2

SMALLINT

INT4

INTEGER

INT8

BIGINT

NUMERIC

DECIMAL (P,S)

REAL4

FLOAT4

REAL8

FLOAT8

STRING

길이가 1~21,845인 경우, VARCHAR(바이트 단위의 길이)을 사용합니다.

길이가 21,846~2,147,483,647인 경우, VARCHAR(65535)을 사용합니다.

UINT1

SMALLINT

UINT2

INTEGER

UINT4

BIGINT

UINT8

BIGINT

WSTRING

길이가 1~21,845인 경우, VARCHAR(바이트 단위의 길이)을 사용합니다.

길이가 21,846~2,147,483,647인 경우, VARCHAR(65535)을 사용합니다.

NCLOB

TEXT

CLOB

TEXT

참고

PostgreSQL AWS DMS 소스에서 복제하는 경우 사용자 정의 데이터 유형의 열을 제외하고 모든 열에 대해 동일한 데이터 유형을 사용하여 대상 테이블을 만듭니다. 그러한 경우에 데이터 형식은 대상에서 ‘character varying’으로 생성됩니다.

Aurora용 Babelfish를 PostgreSQL의 타겟으로 사용 AWS Database Migration Service

AWS Database Migration Service을 사용하여 SQL Server 소스 테이블을 Babelfish for Amazon Aurora PostgreSQL 대상으로 마이그레이션할 수 있습니다. Aurora PostgreSQL은 Babelfish를 사용하여 Microsoft SQL Server의 전용 SQL 방언인 T-SQL을 이해하며 동일한 통신 프로토콜을 지원합니다. 따라서 이제 SQL Server용으로 작성된 애플리케이션은 코드 변경 횟수를 줄이면서 Aurora와 연동할 수 있습니다. Babelfish 기능은 Amazon Aurora에 내장되어 있으며 추가 비용이 들지 않습니다. Amazon RDS 콘솔에서 Amazon Aurora 클러스터의 Babelfish를 활성화할 수 있습니다.

AWS DMS 콘솔, API 또는 CLI 명령을 사용하여 AWS DMS 대상 엔드포인트를 생성할 때는 대상 엔진을 Amazon Aurora PostgreSQL로 지정하고 데이터베이스 이름을 babelfish_db로 지정합니다. 엔드포인트 설정 섹션에서 DatabaseMode 설정을 Babelfish에 추가하고 대상 Babelfish T-SQL 데이터베이스의 이름에 BabelfishDatabaseName을 추가합니다.

마이그레이션 작업에 변환 규칙 추가

Babelfish 대상에 대한 마이그레이션 작업을 정의할 때는 DMS가 대상 데이터베이스의 사전 생성된 T-SQL Babelfish 테이블을 사용하도록 하는 변환 규칙을 포함해야 합니다.

먼저 모든 테이블 이름을 소문자로 만드는 변환 규칙을 마이그레이션 작업에 추가하십시오. Babelfish는 T-SQL을 사용하여 생성한 테이블 이름을 PostgreSQL pg_class 카탈로그에 소문자로 저장합니다. 하지만 SQL Server 테이블에 대소문자가 혼합된 이름이 있는 경우, DMS는 T-SQL 호환 데이터 형식 대신 PostgreSQL 네이티브 데이터 형식을 사용하여 테이블을 생성합니다. 따라서 모든 테이블 이름을 소문자로 만드는 변환 규칙을 추가해야 합니다. 단, 열 이름은 소문자로 변환해서는 안 됩니다.

다음으로 클러스터를 정의할 때 다중 데이터베이스 마이그레이션 모드를 사용한 경우, 원본 SQL Server 스키마의 이름을 바꾸는 변환 규칙을 추가하십시오. T-SQL 데이터베이스의 이름을 포함하도록 SQL Server 스키마의 이름을 바꿔야 합니다. 예를 들어 원래 SQL Server 스키마 이름이 dbo이고 T-SQL 데이터베이스 이름이 mydb인 경우, 변환 규칙을 사용하여 스키마 이름을 mydb_dbo로 바꾸십시오.

단일 데이터베이스 모드를 사용하는 경우, 스키마 이름을 바꾸는 변환 규칙은 필요하지 않습니다. 스키마 이름은 Babelfish의 대상 T-SQL 데이터베이스와 매핑됩니다 one-to-one .

다음 샘플 변환 규칙은 모든 테이블 이름을 소문자로 만들고 원래 SQL Server 스키마 이름을 dbo에서 mydb_dbo로 바꿉니다.

{ "rules": [ { "rule-type": "transformation", "rule-id": "566251737", "rule-name": "566251737", "rule-target": "schema", "object-locator": { "schema-name": "dbo" }, "rule-action": "rename", "value": "mydb_dbo", "old-value": null }, { "rule-type": "transformation", "rule-id": "566139410", "rule-name": "566139410", "rule-target": "table", "object-locator": { "schema-name": "%", "table-name": "%" }, "rule-action": "convert-lowercase", "value": null, "old-value": null }, { "rule-type": "selection", "rule-id": "566111704", "rule-name": "566111704", "object-locator": { "schema-name": "dbo", "table-name": "%" }, "rule-action": "include", "filters": [] } ] }

PostgreSQL 대상 엔드포인트를 Babelfish 테이블과 함께 사용할 때 적용되는 제한 사항

PostgreSQL 대상 엔드포인트를 Babelfish 테이블과 함께 사용할 때 적용되는 제한 사항은 다음과 같습니다.

  • 대상 테이블 준비 모드의 경우, 아무것도 안 함 또는 잘라내기 모드만 사용하십시오. 대상에서 테이블 삭제 모드를 사용하지 마세요. 이 모드에서 DMS는 T-SQL이 인식하지 못할 수도 있는 PostgreSQL 테이블로 테이블을 생성합니다.

  • AWS DMS sql_variant 데이터 유형을 지원하지 않습니다.

  • Babelfish는 HEIRARCHYID, GEOMETRYGEOGRAPHY 데이터 형식을 지원하지 않습니다. 이러한 데이터 형식을 마이그레이션하려면 변환 규칙을 추가하여 데이터 형식을 wstring(250)으로 변환할 수 있습니다.

  • Babelfish는 해당 BYTEA 데이터 형식을 사용하여 BINARY, VARBINARYIMAGE 데이터 형식의 마이그레이션만 지원합니다. Aurora PostgreSQL의 이전 버전에서는 DMS를 사용하여 이러한 테이블을 Babelfish 대상 엔드포인트로 마이그레이션할 수 있습니다. 다음 예제와 같이 BYTEA 데이터 형식에 길이를 지정할 필요가 없습니다.

    [Picture] [VARBINARY](max) NULL

    이전 T-SQL 데이터 형식을 T-SQL 지원 BYTEA 데이터 형식으로 변경합니다.

    [Picture] BYTEA NULL
  • 이전 버전의 Aurora PostgreSQL Babelfish에서 PostgreSQL 대상 엔드포인트를 사용하여 SQL Server에서 Babelfish로 지속적인 복제를 위한 마이그레이션 작업을 생성하는 경우, IDENTITY 열을 사용하는 모든 테이블에 SERIAL 데이터 형식을 할당해야 합니다. Aurora PostgreSQL(버전 15.3/14.8 및 이후 버전)과 Babelfish(버전 3.2.0 및 이후 버전)부터 ID 열이 지원되므로 시리얼 데이터 형식을 더 이상 할당할 필요가 없습니다. 자세한 내용은 SQL Server에서 Aurora PostgreSQL로의 마이그레이션 플레이북의 시퀀스 및 ID 섹션에서 시리얼 사용을 참조하십시오. 그런 다음, Babelfish에서 테이블을 생성할 때 다음의 열 정의를 변경하십시오.

    [IDCol] [INT] IDENTITY(1,1) NOT NULL PRIMARY KEY

    이전 정의를 다음과 같이 변경하세요.

    [IDCol] SERIAL PRIMARY KEY

    Babelfish와 호환되는 Aurora PostgreSQL은 기본 구성을 사용하여 하나의 시퀀스를 생성하고 해당 열에 NOT NULL 제약 조건을 추가합니다. 새로 만든 시퀀스는 (1씩 증가하는) 일반 시퀀스처럼 동작하며 복합 SERIAL 옵션이 없습니다.

  • IDENTITY 열 또는 SERIAL 데이터 형식을 사용하는 테이블로 데이터를 마이그레이션한 후, 해당 열의 최대값을 기준으로 PostgreSQL 기반 시퀀스 객체를 재설정합니다. 테이블을 완전히 로드한 후 다음 T-SQL 쿼리를 사용하여 연결된 시퀀스 객체를 시드하는 문을 생성합니다.

    DECLARE @schema_prefix NVARCHAR(200) = '' IF current_setting('babelfishpg_tsql.migration_mode') = 'multi-db' SET @schema_prefix = db_name() + '_' SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + schema_name(tables.schema_id) + '.' + tables.name + ''', ''' + columns.name + ''') ,(select max(' + columns.name + ') from ' + schema_name(tables.schema_id) + '.' + tables.name + '));' FROM sys.tables tables JOIN sys.columns columns ON tables.object_id = columns.object_id WHERE columns.is_identity = 1 UNION ALL SELECT 'SELECT setval(pg_get_serial_sequence(''' + @schema_prefix + table_schema + '.' + table_name + ''', ''' + column_name + '''),(select max(' + column_name + ') from ' + table_schema + '.' + table_name + '));' FROM information_schema.columns WHERE column_default LIKE 'nextval(%';

    쿼리는 최대 IDENTITY 및 SERIAL 값을 업데이트하기 위해 실행하는 일련의 SELECT 문을 생성합니다.

  • Babelfish 3.2 이전 버전의 경우 전체 LOB 모드에서 테이블 오류가 발생할 수 있습니다. 이 경우 로드에 실패한 테이블에 대해 별도의 작업을 생성하십시오. 그런 다음 제한된 LOB 모드를 사용하여 최대 LOB 크기(KB)에 적합한 값을 지정합니다. 또 다른 옵션은 SQL Server 엔드포인트 연결 속성 설정을 ForceFullLob=True로 설정하는 것입니다.

  • Babelfish 3.2 이전 버전의 경우, 정수 기반 기본 키를 사용하지 않는 Babelfish 테이블로 데이터 유효성 검사를 수행하면 적절한 고유 키를 찾을 수 없다는 메시지가 생성됩니다. Aurora PostgreSQL(버전 15.3/14.8 및 이후 버전) 및 Babelfish(버전 3.2.0 및 이후 버전)를 시작으로 정수가 아닌 기본 키에 대한 데이터 검증이 지원됩니다.

  • 초 단위 소수점 자릿수의 정밀도 차이 때문에 DMS는 DATETIME 데이터 형식을 사용하는 Babelfish 테이블에 대한 데이터 검증 실패를 보고합니다. 이러한 실패를 억제하기 위해 DATETIME 데이터 형식에 대해 다음과 같은 유효성 검사 규칙 유형을 추가할 수 있습니다.

    { "rule-type": "validation", "rule-id": "3", "rule-name": "3", "rule-target": "column", "object-locator": { "schema-name": "dbo", "table-name": "%", "column-name": "%", "data-type": "datetime" }, "rule-action": "override-validation-function", "source-function": "case when ${column-name} is NULL then NULL else 0 end", "target-function": "case when ${column-name} is NULL then NULL else 0 end" }