

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

# PostgreSQL 데이터베이스를의 대상으로 사용 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL"></a>

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

가 대상으로 AWS DMS 지원하는 PostgreSQL 버전에 대한 자세한 내용은 섹션을 참조하세요[의 대상 AWS DMS](CHAP_Introduction.Targets.md).

**참고**  
Amazon Aurora Serverless는 PostgreSQL과 호환되는 Amazon Aurora의 대상으로 사용할 수 있습니다. Amazon Aurora Serverless에 관한 자세한 내용을 알아보려면 *Amazon Aurora 사용 설명서*의 [Amazon Aurora Serverless v2 사용](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)을 참조하세요.
Aurora Serverless DB 클러스터는 Amazon VPC에서만 액세스할 수 있으며 [퍼블릭 IP 주소](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.requirements.html)를 사용할 수 없습니다. 따라서 Aurora PostgreSQL Serverless가 아닌 다른 지역에 복제 인스턴스를 사용하려는 경우, [vpc 피어링](https://docs.aws.amazon.com//dms/latest/userguide/CHAP_ReplicationInstance.VPC.html#CHAP_ReplicationInstance.VPC.Configurations.ScenarioVPCPeer)을 구성해야 합니다. 그렇지 않으면 Aurora PostgreSQL 서버리스 [지역](https://docs.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/Concepts.AuroraFeaturesRegionsDBEngines.grids.html#Concepts.Aurora_Fea_Regions_DB-eng.Feature.Serverless)의 가용성을 확인하고 Aurora PostgreSQL 서버리스와 복제 인스턴스 모두에 해당 지역 중 하나를 사용하기로 결정하세요.
Babelfish 기능은 Amazon Aurora에 내장되어 있으며 추가 비용이 들지 않습니다. 자세한 내용은 [AWS Database Migration Service의 대상으로 Babelfish for Aurora PostgreSQL 사용](#CHAP_Target.PostgreSQL.Babelfish)을 참조하세요.

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참조하세요.

**Topics**
+ [PostgreSQL을의 대상으로 사용할 때의 제한 사항 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Limitations)
+ [Amazon Aurora PostgreSQL Limitless를의 대상으로 사용할 때의 제한 사항 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Aurora.Limitations)
+ [PostgreSQL 데이터베이스를의 대상으로 사용할 때의 보안 요구 사항 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Security)
+ [PostgreSQL을의 대상으로 사용할 때 엔드포인트 설정 및 추가 연결 속성(ECAs) AWS DMS](#CHAP_Target.PostgreSQL.ConnectionAttrib)
+ [PostgreSQL용 대상 데이터 형식](#CHAP_Target.PostgreSQL.DataTypes)
+ [Babelfish for Aurora PostgreSQL을의 대상으로 사용 AWS Database Migration Service](#CHAP_Target.PostgreSQL.Babelfish)

## PostgreSQL을의 대상으로 사용할 때의 제한 사항 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Limitations"></a>

다음 제한 사항은 AWS DMS에서 PostgreSQL 데이터베이스를 대상으로서 사용할 때 적용됩니다.
+ 이기종 마이그레이션의 경우 내부적으로 JSON 데이터 형식이 네이티브 CLOB 데이터 형식으로 변환됩니다.
+ Oracle에서 PostgreSQL로 마이그레이션할 때 Oracle의 열에 NULL 문자(16진수 값 U\$10000)가 포함된 경우는 NULL 문자를 공백(16진수 값 U\$10020)으로 AWS DMS 변환합니다. 이는 PostgreSQL 제한 사항 때문입니다.
+ AWS DMS 는 coalesce 함수로 생성된 고유 인덱스가 있는 테이블에 대한 복제를 지원하지 않습니다.
+ 테이블이 시퀀스를 사용하는 경우 소스 데이터베이스에서 복제를 중지한 후 대상 데이터베이스의 각 시퀀스에 `NEXTVAL` 대한 값을 업데이트합니다.는 소스 데이터베이스의 데이터를 AWS DMS 복사하지만, 지속적 복제 중에는 시퀀스를 대상으로 마이그레이션하지 않습니다.

## Amazon Aurora PostgreSQL Limitless를의 대상으로 사용할 때의 제한 사항 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Aurora.Limitations"></a>

Amazon Aurora PostgreSQL Limitless를 대상으로 사용할 때는 AWS DMS다음과 같은 제한 사항이 적용됩니다.
+ AWS DMS 데이터 검증은 Amazon Aurora PostgreSQL Limitless를 지원하지 않습니다.
+ AWS DMS 는 소스 테이블을 분산되지 않는 표준 테이블로 마이그레이션합니다. 마이그레이션 후 공식 변환 가이드에 따라 이러한 표준 테이블을 Limitless 테이블로 변환할 수 있습니다.

## PostgreSQL 데이터베이스를의 대상으로 사용할 때의 보안 요구 사항 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Security"></a>

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

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

```
    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을의 대상으로 사용할 때 엔드포인트 설정 및 추가 연결 속성(ECAs) AWS DMS
<a name="CHAP_Target.PostgreSQL.ConnectionAttrib"></a>

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

 AWS DMS 콘솔을 사용하거나의 `create-endpoint` 명령을 `--postgre-sql-settings '{"EndpointSetting": "value", ...}'` JSON 구문과 [AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/dms/index.html)함께 사용하여 대상 엔드포인트를 생성할 때 설정을 지정합니다.

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/dms/latest/userguide/CHAP_Target.PostgreSQL.html)

## PostgreSQL용 대상 데이터 형식
<a name="CHAP_Target.PostgreSQL.DataTypes"></a>

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

 AWS DMS 데이터 형식에 대한 자세한 내용은 섹션을 참조하세요[AWS Database Migration Service에서 사용되는 데이터 형식](CHAP_Reference.DataTypes.md).


|  AWS DMS 데이터 유형  |  PostgreSQL 데이터 형식  | 
| --- | --- | 
|  BOOLEAN  |  BOOLEAN  | 
|  BLOB  |  BYTEA  | 
|  BYTES  |  BYTEA  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  DATETIME  |  크기 범위가 0\$16인 경우, TIMESTAMP를 사용합니다. 크기 범위가 7\$19인 경우, VARCHAR(37)을 사용합니다.  | 
|  INT1  |  SMALLINT  | 
|  INT2  |  SMALLINT  | 
|  INT4  |  INTEGER  | 
|  INT8  |  BIGINT  | 
|  NUMERIC   |  DECIMAL (P,S)  | 
|  REAL4  |  FLOAT4  | 
|  REAL8  |  FLOAT8  | 
|  STRING  |  길이가 1\$121,845인 경우, VARCHAR(바이트 단위의 길이)을 사용합니다. 길이가 21,846\$12,147,483,647인 경우, VARCHAR(65535)을 사용합니다.  | 
|  UINT1  |  SMALLINT  | 
|  UINT2  |  INTEGER  | 
|  UINT4  |  BIGINT  | 
|  UINT8  |  BIGINT  | 
|  WSTRING  |  길이가 1\$121,845인 경우, VARCHAR(바이트 단위의 길이)을 사용합니다. 길이가 21,846\$12,147,483,647인 경우, VARCHAR(65535)을 사용합니다.  | 
|  NCLOB  |  TEXT  | 
|  CLOB  |  TEXT  | 

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

## Babelfish for Aurora PostgreSQL을의 대상으로 사용 AWS Database Migration Service
<a name="CHAP_Target.PostgreSQL.Babelfish"></a>

 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\$1db**로 지정합니다. **엔드포인트 설정** 섹션에서 `DatabaseMode` 설정을 `Babelfish`에 추가하고 대상 Babelfish T-SQL 데이터베이스의 이름에 `BabelfishDatabaseName`을 추가합니다.

### 마이그레이션 작업에 변환 규칙 추가
<a name="CHAP_Target.PostgreSQL.Babelfish.transform"></a>

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\$1dbo로 바꾸세요.

**참고**  
Babelfish for Aurora PostgreSQL 16 이상을 사용하는 경우 기본 마이그레이션 모드는 "mutidatabase"입니다. DMS 마이그레이션 작업을 실행할 때는 마이그레이션 모드 파라미터를 검토하고 필요한 경우 변환 규칙을 업데이트해야 합니다.

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

다음 샘플 변환 규칙은 모든 테이블 이름을 소문자로 만들고 원래 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 테이블과 함께 사용할 때 적용되는 제한 사항
<a name="CHAP_Target.PostgreSQL.Babelfish.limitations"></a>

PostgreSQL 대상 엔드포인트를 Babelfish 테이블과 함께 사용할 때 적용되는 제한 사항은 다음과 같습니다.
+ **대상 테이블 준비** 모드의 경우, **아무것도 안 함** 또는 **잘라내기** 모드만 사용하세요. **대상에서 테이블 삭제** 모드를 사용하지 마세요. 이 모드에서 DMS는 T-SQL이 인식하지 못할 수도 있는 PostgreSQL 테이블로 테이블을 생성합니다.
+ AWS DMS 는 sql\$1variant 데이터 형식을 지원하지 않습니다.
+ Postgres 엔드포인트의 Babelfish는 `HEIRARCHYID`, `GEOMETRY` (3.5.4 이전) 및 `GEOGRAPHY` (3.5.4 이전) 데이터 형식을 지원하지 않습니다. 이러한 데이터 형식을 마이그레이션하려면 변환 규칙을 추가하여 데이터 형식을 wstring(250)으로 변환할 수 있습니다.
+ Babelfish는 해당 `BYTEA` 데이터 형식을 사용하여 `BINARY`, `VARBINARY` 및 `IMAGE` 데이터 형식의 마이그레이션만 지원합니다. Aurora PostgreSQL의 이전 버전에서는 DMS를 사용하여 이러한 테이블을 [Babelfish 대상 엔드포인트](CHAP_Target.Babelfish.md)로 마이그레이션할 수 있습니다. 다음 예제와 같이 `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 섹션에서 [시리얼 사용](https://docs.aws.amazon.com/dms/latest/sql-server-to-aurora-postgresql-migration-playbook/chap-sql-server-aurora-pg.tsql.sequences..html)을 참조하세요. 그런 다음, 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"
       }
  ```