

# Amazon RDS for PostgreSQL에서 지원되는 PostgreSQL 기능 작업
<a name="PostgreSQL.Concepts.General.FeatureSupport"></a>

Amazon RDS for PostgreSQL 가장 일반적인 기타 기능을 많이 지원합니다. 예를 들어 PostgreSQL에는 데이터베이스에서 일상적인 유지 관리를 수행하는 자동 autovacuum 기능이 있습니다. 자동 정리 실행 기능은 기본적으로 활성화되어 있습니다. 이 기능을 끌 수 있지만 계속 사용하는 것이 좋습니다. 이 기능을 이해하고 제대로 작동하는지 확인하기 위해 수행할 수 있는 작업은 모든 DBA의 기본 작업입니다. autovacuum에 대한 자세한 내용은 [Amazon RDS for PostgreSQL에서 PostgreSQL 자동 정리 사용](Appendix.PostgreSQL.CommonDBATasks.Autovacuum.md) 섹션을 참조하세요. 기타 일반적인 DBA 작업에 대해 자세히 알아보려면 [Amazon RDS for PostgreSQL의 일반적인 DBA 태스크](Appendix.PostgreSQL.CommonDBATasks.md) 섹션을 참조하세요.

RDS for PostgreSQL은 DB 인스턴스에 중요한 기능을 추가하는 확장도 지원합니다. 예를 들어 PostGIS 확장을 사용하여 공간 데이터로 작업하거나 pg\$1cron 확장을 사용하여 인스턴스 내에서 유지 관리를 예약할 수 있습니다. PostgreSQL 확장에 대한 자세한 내용은 [Amazon RDS for PostgreSQL로 PostgreSQL 확장 사용](Appendix.PostgreSQL.CommonDBATasks.Extensions.md) 섹션을 참조하세요.

외부 데이터 래퍼는 RDS for PostgreSQL DB 인스턴스가 다른 상용 데이터베이스 또는 데이터 유형과 함께 작동하도록 설계된 특정 유형의 확장입니다. RDS for PostgreSQL에서 지원되는 외부 데이터 래퍼에 대한 자세한 내용은 [Amazon RDS for PostgreSQL용 지원되는 외부 데이터 래퍼 작업](Appendix.PostgreSQL.CommonDBATasks.Extensions.foreign-data-wrappers.md) 섹션을 참조하세요.

다음에서 RDS for PostgreSQL이 지원하는 일부 다른 기능에 대한 정보를 확인할 수 있습니다.

**Topics**
+ [RDS for PostgreSQL을 사용한 사용자 지정 데이터 유형 및 열거](PostgreSQL.Concepts.General.FeatureSupport.AlterEnum.md)
+ [RDS for PostgreSQL용 이벤트 트리거](PostgreSQL.Concepts.General.FeatureSupport.EventTriggers.md)
+ [RDS for PostgreSQL용 방대한 페이지](PostgreSQL.Concepts.General.FeatureSupport.HugePages.md)
+ [Amazon RDS for PostgreSQL에 대한 논리적 복제 수행](PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.md)
+ [논리적 복제 연결을 위한 IAM 인증 구성](PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.md)
+ [stats\$1temp\$1directory에 대한 RAM 디스크](PostgreSQL.Concepts.General.FeatureSupport.RamDisk.md)
+ [RDS for PostgreSQL용 테이블스페이스](PostgreSQL.Concepts.General.FeatureSupport.Tablespaces.md)
+ [EBCDIC 및 기타 메인프레임 마이그레이션을 위한 RDS for PostgreSQL 데이터 정렬](PostgreSQL.Collations.mainframe.migration.md)
+ [RDS for PostgreSQL에 대한 논리적 슬롯 동기화 관리](Appendix.PostgreSQL.CommonDBATasks.pglogical.slot.synchronization.md)

# RDS for PostgreSQL을 사용한 사용자 지정 데이터 유형 및 열거
<a name="PostgreSQL.Concepts.General.FeatureSupport.AlterEnum"></a>

PostgreSQL은 사용자 지정 데이터 형식을 만들고 열거형 작업을 지원합니다. 열거형 및 기타 데이터 유형을 생성하고 사용하는 방법에 대한 자세한 내용은 PostgreSQL 문서의 [열거 형식](https://www.postgresql.org/docs/14/datatype-enum.html)을 참조하세요.

다음은 유형을 열거형으로 만든 다음 테이블에 값을 삽입하는 예입니다.

```
CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple');
CREATE TYPE
CREATE TABLE t1 (colors rainbow);
CREATE TABLE
INSERT INTO t1 VALUES ('red'), ( 'orange');
INSERT 0 2
SELECT * from t1;
colors
--------
red
orange
(2 rows)
postgres=> ALTER TYPE rainbow RENAME VALUE 'red' TO 'crimson';
ALTER TYPE
postgres=> SELECT * from t1;
colors
---------
crimson
orange
(2 rows)
```

# RDS for PostgreSQL용 이벤트 트리거
<a name="PostgreSQL.Concepts.General.FeatureSupport.EventTriggers"></a>

현재 모든 PostgreSQL 버전은 이벤트 트리거를 지원하며 사용 가능한 모든 RDS for PostgreSQL 버전도 지원합니다. 기본 사용자 계정(기본값, `postgres`)을 사용하여 이벤트 트리거를 생성, 수정, 이름 변경 및 삭제할 수 있습니다. 이벤트 트리거는 DB 인스턴스 레벨에서 수행되므로 인스턴스에 대한 모든 데이터베이스에 적용될 수 있습니다.

예를 들어 다음 코드는 모든 데이터 정의 언어(DDL) 명령의 끝에 현재 사용자를 인쇄하는 이벤트 트리거를 생성합니다.

```
CREATE OR REPLACE FUNCTION raise_notice_func()
    RETURNS event_trigger
    LANGUAGE plpgsql AS
$$
BEGIN
    RAISE NOTICE 'In trigger function: %', current_user;
END;
$$;

CREATE EVENT TRIGGER event_trigger_1 
    ON ddl_command_end
EXECUTE PROCEDURE raise_notice_func();
```

PostgreSQL 이벤트 트리거에 대한 자세한 내용은 PostgreSQL 문서의 [Event Triggers](https://www.postgresql.org/docs/current/static/event-triggers.html) 단원을 참조하세요.

Amazon RDS에서 PostgreSQL 이벤트 트리거를 사용하는 데 대한 몇 가지 제한 사항이 있습니다. 여기에는 다음이 포함됩니다.
+ 읽기 전용 복제본에 대한 이벤트 트리거를 생성할 수 없지만, 읽기 전용 복제 원본에 대한 이벤트 트리거는 생성할 수 있습니다. 그러면 이벤트 트리거가 읽기 전용 복제본으로 복사됩니다. 읽기 전용 복제본으로 복사된 이벤트 트리거는 변경 내용이 원본에서 푸시되더라도 읽기 전용 복제본에서 발생하지 않습니다. 하지만 읽기 전용 복제본이 승격되면 데이터베이스 작업이 있을 때 기존 이벤트 트리거가 발생합니다.
+ 이벤트 트리거를 사용하는 PostgreSQL DB 인스턴스로의 메이저 버전 업그레이드를 수행하려면 인스턴스를 업그레이드하기 전에 이벤트 트리거를 삭제해야 합니다.

# RDS for PostgreSQL용 방대한 페이지
<a name="PostgreSQL.Concepts.General.FeatureSupport.HugePages"></a>

*방대한 페이지*는 DB 인스턴스가 공유 버퍼에서 사용하는 것과 같은 대규모 연속 메모리 청크로 작업할 때 오버헤드를 줄이는 메모리 관리 기능입니다. 이 PostgreSQL 기능은 현재 사용 가능한 모든 RDS for PostgreSQL 버전에서 지원됩니다. 애플리케이션에 방대한 페이지를 할당하려면 `mmap` 또는 `SYSV` 공유 메모리 호출을 사용합니다. RDS for PostgreSQL은 4KB 페이지 크기와 2MB 페이지 크기를 모두 지원합니다.

`huge_pages` 파라미터의 값을 변경하여 방대한 페이지를 활성화하거나 비활성화할 수 있습니다. 이 기능은 마이크로, 스몰, 미디엄 DB 인스턴스 클래스를 제외한 모든 DB 인스턴스 클래스에 대해 기본적으로 사용 설정되어 있습니다.

RDS for PostgreSQL는 사용 가능한 공유 메모리를 기반으로 방대한 페이지를 사용합니다. DB 인스턴스가 공유 메모리 제약 때문에 방대한 페이지를 사용할 수 없을 경우 Amazon RDS는 DB 인스턴스 시작을 금지합니다. 이 경우 Amazon RDS는 DB 인스턴스 상태를 파라미터 호환 불가 상태로 설정합니다. 이렇게 되면 `huge_pages` 파라미터를 `off`로 설정하여 Amazon RDS가 DB 인스턴스를 시작하도록 허용할 수 있습니다.

`shared_buffers` 파라미터가 방대한 페이지를 사용하는 데 필요한 공유 메모리 풀을 설정하는 관건입니다. `shared_buffers` 파라미터의 기본값은 데이터베이스 파라미터 매크로를 사용합니다. 이 매크로는 DB 인스턴스 메모리에서 사용 가능한 총 8KB 페이지 중 백분율을 설정합니다. 방대한 페이지를 사용할 때 이러한 페이지는 방대한 페이지에 할당됩니다. 공유 메모리 파라미터를 DB 인스턴스 메모리의 90% 이상을 요구하도록 설정할 경우 Amazon RDS가 DB 인스턴스를 파라미터 호환 장애 상태로 설정하므로 유의해야 합니다.

PostgreSQL 메모리 관리에 대한 자세한 내용은 PostgreSQL 설명서의 [Resource Consumption](https://www.postgresql.org/docs/current/static/runtime-config-resource.html)(리소스 소비)을 참조하세요.

# Amazon RDS for PostgreSQL에 대한 논리적 복제 수행
<a name="PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication"></a>

버전 10.4부터 RDS for PostgreSQL는 PostgreSQL 10에 도입된 게시 및 구독 SQL 구문을 지원합니다. 자세한 내용은 PostgreSQL의 [논리적 복제](https://www.postgresql.org/docs/current/logical-replication.html) 문서를 참조하세요.

**참고**  
RDS for PostgreSQL은 PostgreSQL 10에 도입된 기본 PostgreSQL 논리적 복제 기능 외에 `pglogical` 확장도 지원합니다. 자세한 내용은 [pglogical을 사용하여 인스턴스 간 데이터 동기화](Appendix.PostgreSQL.CommonDBATasks.pglogical.md) 섹션을 참조하세요.

다음에서 RDS for PostgreSQL DB 인스턴스의 논리적 복제 설정에 관한 정보를 확인할 수 있습니다.

**Topics**
+ [논리적 복제 및 논리적 디코딩 이해](#PostgreSQL.Concepts.General.FeatureSupport.LogicalDecoding)
+ [논리적 복제 슬롯 작업](#PostgreSQL.Concepts.General.FeatureSupport.LogicalReplicationSlots)
+ [논리적 복제를 사용하여 테이블 수준 데이터 복제](#PostgreSQL.Concepts.LogicalReplication.Tables)

## 논리적 복제 및 논리적 디코딩 이해
<a name="PostgreSQL.Concepts.General.FeatureSupport.LogicalDecoding"></a>

RDS for PostgreSQL은 PostgreSQL의 논리적 복제 슬롯을 사용하여 미리 쓰기 로그(WAL) 변경 사항 스트리밍을 지원합니다. 또한 논리적 디코딩 사용을 지원합니다. 인스턴스에 대한 논리적 복제 슬롯을 설정하고 해당 슬롯을 통해 데이터베이스 변경을 클라이언트(예: `pg_recvlogical`)에 스트리밍할 수 있습니다. 논리적 복제 슬롯은 데이터베이스 수준에서 생성되며 단일 데이터베이스에 대한 복제 연결을 지원합니다.

가장 일반적인 PostgreSQL 논리적 복제용 클라이언트는 Amazon EC2 인스턴스의 사용자 지정 관리형 호스트 또는 AWS Database Migration Service입니다. 논리적 복제 슬롯에는 스트림 수신기에 대한 정보가 없습니다. 또한 대상이 복제본 데이터베이스일 필요는 없습니다. 논리적 복제 슬롯을 설정하고 슬롯에서 데이터를 읽지 않을 경우 데이터가 DB 인스턴스의 스토리지에 기록되고 빠르게 가득 찰 수 있습니다.

Amazon RDS의 PostgreSQL 논리적 복제 및 논리적 디코딩은 파라미터, 복제 연결 유형 및 보안 역할에 의해 활성화됩니다. PostgreSQL DB 인스턴스의 데이터베이스에 대한 복제 연결을 설정할 수 있는 모든 클라이언트는 논리적 디코딩용 클라이언트가 될 수 있습니다.

**RDS for PostgreSQL DB 인스턴스에 논리적 디코딩 사용 설정**

1. 사용 중인 사용자 계정에 다음과 같은 역할이 있는지 확인합니다.
   + 논리 복제를 설정할 수 있는 `rds_superuser` 역할 
   + 논리적 슬롯을 관리하고 논리적 슬롯을 사용하여 데이터를 스트리밍할 수 있는 권한을 부여하는 `rds_replication` 역할

1. `rds.logical_replication` 정적 파라미터를 1로 설정합니다. 이 파라미터를 적용하는 중에 `wal_level`, `max_wal_senders`, `max_replication_slots`, `max_connections` 파라미터 또한 설정합니다. 이러한 파라미터 변경은 WAL 생성을 강화하므로 논리적 슬롯을 사용할 때 `rds.logical_replication` 파라미터만 설정하면 됩니다.

1. 정적 `rds.logical_replication` 파라미터가 적용되도록 DB 인스턴스를 재부팅합니다.

1. 다음 섹션에 설명된 대로 논리적 복제 슬롯을 생성합니다. 이 프로세스에서는 디코딩 플러그인을 지정해야 합니다. 현재 RDS for PostgreSQL은 PostgreSQL과 함께 배송되는 test\$1decoding 및 wal2json 출력 플러그 인을 지원합니다.

PostgreSQL 논리적 디코딩에 대한 자세한 내용은 [ PostgreSQL 설명서](https://www.postgresql.org/docs/current/static/logicaldecoding-explanation.html)를 참조하세요.

## 논리적 복제 슬롯 작업
<a name="PostgreSQL.Concepts.General.FeatureSupport.LogicalReplicationSlots"></a>

SQL 명령을 사용하여 논리적 슬롯 작업을 수행할 수 있습니다. 예를 들어 다음 명령은 기본 PostgreSQL 출력 플러그인인 `test_slot`을 사용하여 `test_decoding` 논리적 슬롯을 생성합니다.

```
SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');
slot_name    | xlog_position
-----------------+---------------
regression_slot | 0/16B1970
(1 row)
```

논리적 슬롯 목록을 보려면 다음 명령을 사용합니다.

```
SELECT * FROM pg_replication_slots;
```

논리적 슬롯을 삭제하려면 다음 명령을 사용합니다.

```
SELECT pg_drop_replication_slot('test_slot');
pg_drop_replication_slot
-----------------------
(1 row)
```

논리적 복제 슬롯 작업에 대한 더 많은 예제는 PostgreSQL 문서의 [Logical Decoding Examples](https://www.postgresql.org/docs/9.5/static/logicaldecoding-example.html)를 참조하세요.

논리적 복제 슬롯을 생성한 후 스트리밍을 시작할 수 있습니다. 다음 예에서는 스트리밍 복제 프로토콜을 통해 논리적 디코딩을 제어하는 방법을 보여 줍니다. 이 예에서는 PostgreSQL 배포판에 포함된 pg\$1recvlogical 프로그램을 사용합니다. 이렇게 하려면 복제 연결을 허용하도록 클라이언트 인증을 설정해야 합니다.

```
pg_recvlogical -d postgres --slot test_slot -U postgres
    --host -instance-name.111122223333.aws-region.rds.amazonaws.com 
    -f -  --start
```

`pg_replication_origin_status` 보기의 내용을 보려면 `pg_show_replication_origin_status` 함수를 쿼리합니다.

```
SELECT * FROM pg_show_replication_origin_status();
local_id | external_id | remote_lsn | local_lsn
----------+-------------+------------+-----------
(0 rows)
```

## 논리적 복제를 사용하여 테이블 수준 데이터 복제
<a name="PostgreSQL.Concepts.LogicalReplication.Tables"></a>

RDS for PostgreSQL에서 논리적 복제를 사용하여 소스 테이블의 데이터를 대상 테이블로 복제할 수 있습니다. 논리적 복제는 먼저 소스 테이블에서 기존 데이터의 초기 로드를 수행한 후 진행 중인 변경 사항을 계속 복제합니다.

1. 

**소스 테이블 생성**

   RDS for PostgreSQL DB 인스턴스의 소스 데이터베이스에 연결합니다.

   ```
   source=> CREATE TABLE testtab (slno int primary key);
   CREATE TABLE
   ```

1. 

**소스 테이블에 데이터 삽입**

   ```
   source=> INSERT INTO testtab VALUES (generate_series(1,1000));
   INSERT 0 1000
   ```

1. 

**소스 테이블에 대한 게시 생성**
   + 소스 테이블에 대한 게시를 생성합니다.

     ```
     source=> CREATE PUBLICATION testpub FOR TABLE testtab;
     CREATE PUBLICATION
     ```
   + SELECT 쿼리를 사용하여 생성된 게시의 세부 정보를 확인합니다.

     ```
     source=> SELECT * FROM pg_publication;
       oid   | pubname | pubowner | puballtables | pubinsert | pubupdate | pubdelete | pubtruncate | pubviaroot
     --------+---------+----------+--------------+-----------+-----------+-----------+-------------+------------
      115069 | testpub |    16395 | f            | t         | t         | t         | t           | f
     (1 row)
     ```
   + 소스 테이블이 게시에 추가되었는지 확인합니다.

     ```
     source=> SELECT * FROM pg_publication_tables; 
     pubname | schemaname | tablename
     ---------+------------+-----------
      testpub | public     | testtab
     (1 rows)
     ```
   + 데이터베이스의 모든 테이블을 복제하려면 다음을 사용합니다.

     ```
     CREATE PUBLICATION testpub FOR ALL TABLES;
     ```
   + 개별 테이블에 대한 게시가 이미 생성되어 있고 새 테이블을 추가해야 하는 경우 아래 쿼리를 실행하여 기존 게시에 새 테이블을 추가할 수 있습니다.

     ```
     ALTER PUBLICATION <publication_name> add table <new_table_name>;
     ```

1. 

**대상 데이터베이스에 연결 및 대상 테이블 생성**
   + 대상 DB 인스턴스의 대상 데이터베이스에 연결합니다. 소스 테이블과 이름이 동일한 대상 테이블을 생성합니다.

     ```
     target=> CREATE TABLE testtab (slno int primary key);
     CREATE TABLE
     ```
   + 대상 테이블에서 SELECT 쿼리를 실행하여 대상 테이블에 데이터가 없는지 확인합니다.

     ```
         
     target=> SELECT count(*) FROM testtab;
      count
     -------
          0
     (1 row)
     ```

1. 

**대상 데이터베이스에서 구독 생성 및 확인**
   + 대상 데이터베이스에서 구독을 생성합니다.

     ```
     target=> CREATE SUBSCRIPTION testsub 
     CONNECTION 'host=<source RDS/host endpoint> port=5432 dbname=<source_db_name> user=<user> password=<password>' 
     PUBLICATION testpub;
     NOTICE:  Created replication slot "testsub" on publisher
     CREATE SUBSCRIPTION
     ```
   + SELECT 쿼리를 사용하여 구독이 활성화되어 있는지 확인합니다.

     ```
     target=> SELECT oid, subname, subenabled, subslotname, subpublications FROM pg_subscription;
       oid  | subname | subenabled | subslotname | subpublications
     -------+---------+------------+-------------+-----------------
      16434 | testsub | t          | testsub     | {testpub}
     (1 row)
     ```
   + 구독이 생성되면 소스 테이블의 모든 데이터가 대상 테이블로 로드됩니다. 대상 테이블에서 SELECT 쿼리를 실행하여 초기 데이터가 로드되는지 확인합니다.

     ```
     target=> SELECT count(*) FROM testtab;
      count
     -------
       1000
     (1 row)
     ```

1. 

**소스 데이터베이스의 복제 슬롯 확인**

   대상 데이터베이스에서 구독을 생성하면 소스 데이터베이스에 복제 슬롯이 생성됩니다. 소스 데이터베이스에서 다음 SELECT 쿼리를 실행하여 복제 슬롯 세부 정보를 확인합니다.

   ```
   source=> SELECT * FROM pg_replication_slots;
    
   slot_name |  plugin  | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size
   ----------+----------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+---------------
   testsub   | pgoutput | logical   | 115048 | source   | f         | t      |        846 |      |         6945 | 58/B4000568 | 58/B40005A0         | reserved   |
   (1 row)
   ```

1. 

**복제 테스트**
   + 소스 테이블에 행을 삽입하여 소스 테이블의 데이터 변경 사항이 대상 테이블에 복제되는지 테스트합니다.

     ```
     source=> INSERT INTO testtab VALUES(generate_series(1001,2000));
     INSERT 0 1000
     
     source=> SELECT count(*) FROM testtab; 
      count
     -------
       2000
     (1 row)
     ```
   + 대상 테이블의 행 수를 확인하여 새 삽입 항목이 복제되는지 확인합니다.

     ```
     target=> SELECT count(*) FROM testtab;
      count
     -------
       2000
     (1 row)
     ```

1. 

**테이블 추가 후 구독 새로 고침**
   + 기존 게시에 새 테이블을 추가할 때 변경 사항을 적용하려면 구독을 새로 고쳐야 합니다.

     ```
     ALTER SUBSCRIPTION <subscription_name> REFRESH PUBLICATION;
     ```
   + 이 명령은 게시자에서 누락된 테이블 정보를 가져오고 구독이 생성되거나 마지막으로 새로 고쳐진 이후 구독 대상 게시에 추가된 테이블에 대한 복제를 시작합니다.

# 논리적 복제 연결을 위한 IAM 인증 구성
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication"></a>

PostgreSQL용 RDS 버전 11 이상부터는 복제 연결에 AWS Identity and Access Management(IAM) 인증을 사용할 수 있습니다. 이 기능을 사용하면 암호 대신 IAM 역할을 사용하여 데이터베이스 액세스를 관리할 수 있으므로 보안이 강화됩니다. 이 기능은 클러스터 및 인스턴스 수준 모두에서 작동하며 표준 IAM 인증과 동일한 보안 모델을 따릅니다.

복제 연결을 위한 IAM 인증은 옵트인 기능입니다. 활성화하려면 DB 클러스터 또는 DB 파라미터 그룹의 `rds.iam_auth_for_replication` 파라미터를 1로 설정합니다. 동적 파라미터이므로 DB 클러스터 또는 인스턴스를 다시 시작할 필요가 없으므로, 가동 중지 시간 없이 기존 워크로드에서 IAM 인증을 활용할 수 있습니다. 이 기능을 활성화하기 전에 아래 나열된 사전 조건을 충족해야 합니다.

**Topics**
+ [사전 조건](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Prerequisites)
+ [복제 연결에 대한 IAM 인증 활성화](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Enabling)
+ [복제 연결에 대한 IAM 인증 비활성화](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Disabling)
+ [제한 사항 및 고려 사항](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Limitations)

## 사전 조건
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Prerequisites"></a>

복제 연결에 IAM 인증을 사용하려면 다음 요구 사항을 모두 충족해야 합니다.
+ RDS for PostgreSQL DB 인스턴스는 버전 11 이상이어야 합니다.
+ 게시자 RDS for PostgreSQL DB 인스턴스에서:
  + IAM 데이터베이스 인증을 활성화합니다. 자세한 내용은 [IAM 데이터베이스 인증의 활성화 및 비활성화](UsingWithRDS.IAMDBAuth.Enabling.md) 섹션을 참조하세요.
  + `rds.logical_replication` 파라미터를 1로 설정하여 논리적 복제를 활성화합니다.

논리적 복제에서 게시자는 구독자 데이터베이스로 데이터를 전송하는 소스 RDS for PostgreSQL 데이터베이스입니다. 자세한 내용은 [Amazon RDS for PostgreSQL에 대한 논리적 복제 수행](PostgreSQL.Concepts.General.FeatureSupport.LogicalReplication.md) 섹션을 참조하세요.

**참고**  
게시자 RDS for PostgreSQL DB 인스턴스에서 IAM 인증과 논리적 복제가 모두 활성화되어 있어야 합니다. 둘 중 하나가 활성화되지 않은 경우 복제 연결에 IAM 인증을 사용할 수 없습니다.

## 복제 연결에 대한 IAM 인증 활성화
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Enabling"></a>

다음 단계를 완료하여 복제 연결에 대한 IAM 인증을 활성화합니다.

**복제 연결에 대한 IAM 인증 활성화**

1. RDS for PostgreSQL DB 클러스터 또는 인스턴스가 복제 연결을 사용한 IAM 인증에 필요한 모든 필수 조건을 충족하는지 확인합니다. 자세한 내용은 [사전 조건](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Prerequisites)을 참조하세요.

1. RDS for PostgreSQL 설정을 기반으로 `rds.iam_auth_for_replication` 파라미터를 구성합니다.
   + RDS for PostgreSQL DB 인스턴스의 경우: DB 파라미터 그룹을 수정합니다.
   + 다중 AZ 클러스터의 경우: DB 클러스터 파라미터 그룹을 수정합니다.

   `rds.iam_auth_for_replication`을 1로 설정합니다. 재부팅할 필요 없이 즉시 적용되는 동적 파라미터입니다.
**참고**  
다중 AZ 클러스터는 DB 클러스터 파라미터 그룹만 사용합니다. 다중 AZ 클러스터에서는 개별 인스턴스 파라미터 그룹을 수정할 수 없습니다.

1. 데이터베이스에 연결하고 복제 사용자에게 필요한 역할을 부여합니다.

   다음 SQL 명령은 복제 연결에 대한 IAM 인증을 활성화하는 데 필요한 역할을 부여합니다.

   ```
   -- Grant IAM authentication role
   GRANT rds_iam TO replication_user_name;
   
   -- Grant replication privileges
   ALTER USER replication_user_name WITH REPLICATION;
   ```

   이 단계를 완료한 후, 지정된 사용자는 복제 연결에 IAM 인증을 사용해야 합니다.
**중요**  
기능을 활성화할 때 `rds_iam` 및 `rds_replication` 역할이 모두 있는 사용자는 복제 연결에 IAM 인증을 사용해야 합니다. 이는 역할이 사용자에게 직접 할당되는지 아니면 다른 역할을 통해 상속되는지에 관계없이 적용됩니다.

## 복제 연결에 대한 IAM 인증 비활성화
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Disabling"></a>

다음 방법 중 하나를 사용하여 복제 연결에 대한 IAM 인증을 비활성화할 수 있습니다.
+ DB 인스턴스의 경우 DB 파라미터 그룹에서 `rds.iam_auth_for_replication` 파라미터를 0으로 설정하고 다중 AZ 클러스터의 경우 DB 클러스터 파라미터 그룹에서 파라미터를 0으로 설정합니다.
+ 또는 RDS for PostgreSQL DB 클러스터 또는 인스턴스에서 이러한 기능 중 하나를 비활성화할 수도 있습니다.
  + `rds.logical_replication` 파라미터를 0으로 설정하여 논리적 복제 비활성화
  + IAM 인증 비활성화

기능을 비활성화하면 복제 연결이 인증에 데이터베이스 암호를 사용할 수 있습니다.

**참고**  
`rds_iam` 역할이 없는 사용자의 복제 연결은 기능이 활성화된 경우에도 암호 인증을 사용할 수 있습니다.

## 제한 사항 및 고려 사항
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Limitations"></a>

논리적 복제 연결에 IAM 인증을 사용할 때 다음과 같은 제한 사항 및 고려 사항을 염두에 둡니다.
+ 이 기능은 RDS for PostgreSQL 버전 11 이상에서만 사용할 수 있습니다.
+ 게시자는 복제 연결에 대한 IAM 인증을 지원해야 합니다.
+ IAM 인증 토큰은 기본적으로 15분 후에 만료됩니다. 토큰이 만료되기 전에 장기 실행 복제 연결을 새로 고쳐야 할 수 있습니다.

# stats\$1temp\$1directory에 대한 RAM 디스크
<a name="PostgreSQL.Concepts.General.FeatureSupport.RamDisk"></a>

RDS for PostgreSQL의 파라미터 `rds.pg_stat_ramdisk_size`를 사용하여 PostgreSQL `stats_temp_directory` 저장용 RAM 디스크에 할당되는 시스템 메모리를 지정할 수 있습니다. RAM 디스크 파라미터는 RDS for PostgreSQL 버전 14 이하에서만 사용할 수 있습니다.

특정 워크로드에서 이 파라미터를 설정하면 성능이 향상되고 I/O 요구 사항이 감소될 수 있습니다. `stats_temp_directory`에 대한 자세한 내용은 [PostgreSQL 문서](https://www.postgresql.org/docs/current/static/runtime-config-statistics.html#GUC-STATS-TEMP-DIRECTORY) 단원을 참조하세요.

`stats_temp_directory`에 대한 RAM 디스크를 설정하려면 DB 인스턴스에 사용되는 파라미터 그룹에서 `rds.pg_stat_ramdisk_size` 파라미터를 정수 리터럴 값으로 설정합니다. 이 파라미터는 MB를 나타내므로 정수 값을 사용해야 합니다. 표현식, 공식 및 함수는 `rds.pg_stat_ramdisk_size` 파라미터에 유효하지 않습니다. 변경 사항을 적용하려면 DB 인스턴스를 재부팅해야 합니다. 파라미터 설정에 대한 자세한 내용은 [Amazon RDS의 파라미터 그룹](USER_WorkingWithParamGroups.md)을 참조하세요.

예를 들어 다음 AWS CLI 명령은 RAM 디스크 파라미터를 256MB로 설정합니다.

```
aws rds modify-db-parameter-group \
    --db-parameter-group-name pg-95-ramdisk-testing \
    --parameters "ParameterName=rds.pg_stat_ramdisk_size, ParameterValue=256, ApplyMethod=pending-reboot"
```

재부팅 후 다음 명령을 실행하여 `stats_temp_directory`의 상태를 확인합니다.

```
postgres=> SHOW stats_temp_directory;
```

 명령은 다음을 반환합니다.

```
stats_temp_directory
---------------------------
/rdsdbramdisk/pg_stat_tmp
(1 row)
```

# RDS for PostgreSQL용 테이블스페이스
<a name="PostgreSQL.Concepts.General.FeatureSupport.Tablespaces"></a>

RDS for PostgreSQL은 호환성을 위해 테이블스페이스를 지원합니다. 모든 스토리지가 단일 논리 볼륨에 있으므로 I/O 분할 또는 격리를 위해 테이블스페이스를 사용할 수 없습니다. Amazon의 벤치마크 결과와 실용적 경험에 따르면 단일 논리 볼륨이 대부분의 사용 사례에 최선의 설정입니다.

RDS for PostgreSQL DB 인스턴스로 테이블스페이스를 생성하고 사용하려면 `rds_superuser` 역할이 필요합니다. RDS for PostgreSQL DB 인스턴스의 기본 사용자 계정(기본 이름, `postgres`)은 이 역할의 멤버입니다. 자세한 정보는 [PostgreSQL 역할 및 권한 이해](Appendix.PostgreSQL.CommonDBATasks.Roles.md)의 내용을 참조하세요.

테이블스페이스를 생성할 때 파일 이름을 지정하는 경우, 경로 접두사는 `/rdsdbdata/db/base/tablespace`입니다. 다음 예제에서는 테이블스페이스 파일을 `/rdsdbdata/db/base/tablespace/data`에 배치합니다. 이 예에서는 `dbadmin` 사용자(역할)가 존재하고 테이블스페이스 작업에 필요한 `rds_superuser` 역할이 부여되었다고 가정합니다.

```
postgres=> CREATE TABLESPACE act_data
  OWNER dbadmin
  LOCATION '/data';
CREATE TABLESPACE
```

PostgreSQL 테이블스페이스에 대한 자세한 내용은 [Tablespaces](https://www.postgresql.org/docs/current/manage-ag-tablespaces.html)(테이블스페이스)를 참조하세요.

# EBCDIC 및 기타 메인프레임 마이그레이션을 위한 RDS for PostgreSQL 데이터 정렬
<a name="PostgreSQL.Collations.mainframe.migration"></a>

PostgreSQL용 RDS 버전 10 이상에는 유니코드 10.0을 기반으로 하고 유니코드 공통 로케일 데이터 저리포지토리(CLDR 32)의 데이터 정렬이 포함된 ICU 버전 60.2가 포함되어 있습니다. 이러한 소프트웨어 국제화 라이브러리는 운영 체제나 플랫폼에 관계없이 문자 인코딩이 일관된 방식으로 표시되도록 합니다. 유니코드 CLDR-32에 대한 자세한 내용은 유니코드 CLDR 웹 사이트의 [CLDR 32 릴리스 노트](https://cldr.unicode.org/index/downloads/cldr-32)에서 확인할 수 있습니다. [ICU 기술 위원회(ICU-TC)](https://icu.unicode.org/home) 웹 사이트에서 유니코드(ICU)의 국제화 구성 요소에 대해 자세히 알아볼 수 있습니다. ICU-60에 대한 정보는 [ICU 60 다운로드](https://icu.unicode.org/download/60)를 참조하세요.

14.3 버전부터 PostgreSQL용 RDS에는 EBCDIC 기반 시스템에서 데이터 통합 및 변환을 지원하는 데이터 정렬도 포함됩니다. 확장 이진 코딩 십진 교환 코드 또는 *EBCDIC* 인코딩은 일반적으로 메인프레임 운영 체제에서 사용됩니다. Amazon RDS에서 제공하는 이러한 데이터 정렬은 EBCDIC 코드 페이지에 직접 매핑되는 유니코드 문자만 정렬하도록 좁게 정의되어 있습니다. 문자는 변환 후 데이터 유효성 검사가 가능하도록 EBCDIC 코드 포인트 순서로 정렬됩니다. 이러한 데이터 정렬에는 비정규화된 형식이 포함되지 않으며 소스 EBCDIC 코드 페이지의 문자에 직접 매핑되지 않는 유니코드 문자도 포함되지 않습니다.

EBCDIC 코드 페이지와 유니코드 코드 포인트 간의 문자 매핑은 IBM에서 게시한 테이블을 기반으로 합니다. 전체 세트는 다운로드용 [압축 파일](http://download.boulder.ibm.com/ibmdl/pub/software/dw/java/cdctables.zip)로 IBM에서 사용할 수 있습니다. PostgreSQL용 RDS는 ICU에서 제공하는 도구와 함께 이러한 매핑을 사용하여 이 섹션의 표에 나열된 데이터 정렬을 만들었습니다. 데이터 정렬 이름에는 ICU에서 요구하는 언어 및 국가가 포함됩니다. 그러나 EBCDIC 코드 페이지는 언어를 지정하지 않으며 일부 EBCDIC 코드 페이지는 여러 국가를 포함합니다. 따라서 테이블에 있는 데이터 정렬 이름의 언어 및 국가 부분이 임의적이며 현재 로케일과 일치할 필요가 없습니다. 코드 페이지 번호는 이 표의 데이터 정렬 이름에서 가장 중요한 부분입니다. RDS for PostgreSQL 데이터베이스에서 다음 표에 나열된 모든 데이터 정렬을 사용할 수 있습니다.
+ [Unicode to EBCDIC collations table](#ebcdic-table) - 일부 메인프레임 데이터 마이그레이션 툴은 내부적으로 LATIN1 또는 LATIN9 을 사용하여 데이터를 인코딩하고 처리합니다. 이러한 도구는 왕복 방식을 사용하여 데이터 무결성을 유지하고 역변환을 지원합니다. 이 표의 데이터 정렬은 특별한 처리가 필요하지 않은 LATIN1 인코딩을 사용하여 데이터를 처리하는 도구에서 사용할 수 있습니다.
+ [Unicode to LATIN9 collations table](#latin9-table) - 모든 RDS for PostgreSQL 데이터베이스에서 이러한 데이터 정렬을 사용할 수 있습니다.

 

다음 표에는 EBCDIC 코드 페이지를 유니코드 코드 포인트에 매핑하는 RDS for PostgreSQL에서 사용할 수 있는 데이터 정렬이 나와 있습니다. IBM 코드 페이지의 순서를 기준으로 정렬해야 하는 애플리케이션 개발에는 이 테이블의 데이터 정렬을 사용하는 것이 좋습니다.<a name="ebcdic-table"></a>


| PostgreSQL 데이터 정렬 이름 | 코드 페이지 매핑 및 정렬 순서에 대한 설명 | 
| --- | --- | 
| da-DK-cp277-x-icu | IBM EBCDIC 코드 페이지 277에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 277 코드 포인트 순서로 정렬됩니다. | 
| de-DE-cp273-x-icu | IBM EBCDIC 코드 페이지 273에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 273 코드 포인트 순서로 정렬됩니다. | 
| en-GB-cp285-x-icu | IBM EBCDIC 코드 페이지 285에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 285 코드 포인트 순서로 정렬됩니다. | 
| en-US-cp037-x-icu | IBM EBCDIC 코드 페이지 037에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 37 코드 포인트 순서로 정렬됩니다. | 
| es-ES-cp284-x-icu | IBM EBCDIC 코드 페이지 284에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 284 코드 포인트 순서로 정렬됩니다. | 
| fi-FI-cp278-x-icu | IBM EBCDIC 코드 페이지 278에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 278 코드 포인트 순서로 정렬됩니다. | 
| fr-FR-cp297-x-icu | IBM EBCDIC 코드 페이지 297에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 297 코드 포인트 순서로 정렬됩니다. | 
| it-IT-cp280-x-icu | IBM EBCDIC 코드 페이지 280에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 280 코드 포인트 순서로 정렬됩니다. | 
| nl-BE-cp500-x-icu | IBM EBCDIC 코드 페이지 500에 직접 매핑되는 유니코드 문자(변환 테이블당)는 IBM CP 500 코드 포인트 순서로 정렬됩니다. | 

Amazon RDS는 소스 데이터의 EBCDIC 코드 페이지에 따라 원래 코드 포인트의 순서로 IBM에서 게시한 테이블을 사용하여 LATIN9 문자에 매핑되는 유니코드 코드 포인트를 정렬하는 추가 데이터 정렬 세트를 제공합니다.<a name="latin9-table"></a>


| PostgreSQL 데이터 정렬 이름 | 코드 페이지 매핑 및 정렬 순서에 대한 설명 | 
| --- | --- | 
| da-DK-cp1142b-x-icu | IBM EBCDIC 코드 페이지 1142(변환 테이블당)에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1142 코드 포인트 순서로 정렬됩니다. | 
| de-DE-cp1141m-x-icu | IBM EBCDIC 코드 페이지 1141(변환 테이블당)에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1141 코드 포인트 순서로 정렬됩니다. | 
| en-GB-cp1146m-x-icu | IBM EBCDIC 코드 페이지 1146(변환 테이블당)에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1146 코드 포인트 순서로 정렬됩니다. | 
| en-US-cp1140m-x-icu | IBM EBCDIC 코드 페이지 1140(변환 테이블당)에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1140 코드 포인트 순서로 정렬됩니다. | 
| es-ES-cp1145m-x-icu | IBM EBCDIC 코드 페이지 1145(변환 테이블당)에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1145 코드 포인트 순서로 정렬됩니다. | 
| fi-FI-cp1143m-x-icu | IBM EBCDIC 코드 페이지 1143(변환 테이블당) 에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1143 코드 포인트 순서로 정렬됩니다. | 
| fr-FR-cp1147m-x-icu | IBM EBCDIC 코드 페이지 1147(변환 테이블당) 에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1147 코드 포인트 순서로 정렬됩니다. | 
| it-IT-cp1144m-x-icu | IBM EBCDIC 코드 페이지 1144(변환 테이블당) 에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1144 코드 포인트 순서로 정렬됩니다. | 
| nl-BE-cp1148m-x-icu | IBM EBCDIC 코드 페이지 1148(변환 테이블당) 에서 원래 변환된 LATIN9 문자에 매핑되는 유니코드 문자는 IBM CP 1148 코드 포인트 순서로 정렬됩니다. | 

RDS for PostgreSQL 데이터 정렬 사용 예를 찾아볼 수 있습니다.

```
db1=> SELECT pg_import_system_collations('pg_catalog');
 pg_import_system_collations
-----------------------------
                          36
db1=> SELECT '¤' < 'a' col1;
 col1
------
 t  
db1=> SELECT '¤' < 'a' COLLATE "da-DK-cp277-x-icu" col1;
 col1
------
 f
```

IBM 코드 페이지의 순서를 기반으로 정렬해야 하는 애플리케이션 개발의 경우 [Unicode to EBCDIC collations table](#ebcdic-table) 및 [Unicode to LATIN9 collations table](#latin9-table)의 데이터 정렬을 사용하는 것이 좋습니다. 다음 데이터 정렬(문자 "b" 접미사)도 `pg_collation`에서 볼 수 있지만 특정 코드 포인트 이동이 있는 코드 페이지를 매핑하고 데이터 정렬에서 특별한 처리가 필요한 AWS의 메인프레임 데이터 통합 및 마이그레이션 도구에서 사용하기 위한 것입니다. 즉, 다음과 같은 데이터 정렬 데이터 정렬 방식은 권장되지 않습니다.
+ da-DK-cp1142b-x-icu
+ da-DK-cp1142b-x-icu
+ de-DE-cp273b-x-icu
+ de-DE-cp1141b-x-icu
+ en-GB-cp1146b-x-icu
+ en-GB-cp285b-x-icu
+ en-US-cp037b-x-icu
+ en-US-cp1140b-x-icu
+ es-ES-cp1145b-x-icu
+ es-ES-cp284b-x-icu
+ fi-FI-cp1143b-x-icu
+ fr-FR-cp1147b-x-icu
+ fr-FR-cp297b-x-icu
+ it-IT-cp1144b-x-icu
+ it-IT-cp280b-x-icu
+ nl-BE-cp1148b-x-icu
+ nl-BE-cp500b-x-icu

메인프레임 환경에서 AWS로 애플리케이션을 마이그레이션하는 방법에 대한 자세한 내용은 [AWS Mainframe Modernization 무엇입니까?](https://docs.aws.amazon.com/m2/latest/userguide/what-is-m2.html)를 참조하세요.

PostgreSQL의 데이터 정렬에 대한 자세한 내용은 PostgreSQL 설명서의 [데이터 정렬 지원](https://www.postgresql.org/docs/current/collation.html)을 참조하세요.

# RDS for PostgreSQL에 대한 논리적 슬롯 동기화 관리
<a name="Appendix.PostgreSQL.CommonDBATasks.pglogical.slot.synchronization"></a>

커뮤니티 PostgreSQL 17부터 실행 시 슬롯을 수동으로 동기화하는 파라미터 `sync_replication_slots` 또는 관련 함수 `pg_sync_replication_slots()`를 통해 기본 서버에서 대기 서버로 논리적 복제 슬롯을 자동으로 동기화하는 새로운 기능이 도입되었습니다.

이러한 기능은 RDS for PostgreSQL 17부터 사용할 수 있습니다. 일반적인 설정에는 기본 인스턴스와 [읽기 전용 복제본](USER_PostgreSQL.Replication.ReadReplicas.md) 및 프라이머리 인스턴스에 대한 논리적 복제 구독자가 포함됩니다.

장애 조치 옵션이 true로 설정된 상태에서 구독이 생성되었는지 확인합니다.

```
CREATE SUBSCRIPTION subname CONNECTION 'host=...' PUBLICATION pubname WITH (failover = true);
```

이렇게 하면 장애 조치가 활성화된 상태로 게시자에 논리적 슬롯이 생성됩니다.

```
postgres=> SELECT slot_name, slot_type, failover FROM pg_catalog.pg_replication_slots;
 slot_name | slot_type | failover 
-----------+-----------+----------
 subname   | logical   | t
(1 row)
```

슬롯 동기화를 활성화하면 프라이머리 인스턴스의 모든 장애 조치 논리적 복제 슬롯이 물리적 대기에 자동으로 생성되고 주기적으로 동기화됩니다. [파라미터 그룹](USER_WorkingWithParamGroups.Associating.md)을 통해 다음 값이 설정되었는지 확인합니다.
+ 논리적 복제를 활성화하려면 `rds.logical_replication`이 `1`이어야 합니다.
+ 대기 상태에서 `hot_standby_feedback`이 `1`이어야 합니다.
+ 대기 상태의 `rds.logical_slot_sync_dbname`을 유효한 데이터베이스 이름으로 설정해야 합니다.

  파라미터의 기본값은 `postgres`입니다. 논리적 게시 인스턴스에 `postgres` 데이터베이스가 있는 경우 기본 파라미터를 변경할 필요가 없습니다.
+ 프라이머리 인스턴스의 `synchronized_standby_slots`는 동기화되도록 의도된 대기의 물리적 복제 슬롯으로 설정되어야 합니다.
+ 자동 동기화를 활성화하려면 `sync_replication_slots`가 `1`이어야 합니다.

장애 조치 활성화 구독 슬롯과 위의 파라미터 값을 사용하면 대기가 승격될 때 구독자는 새로 승격된 이 인스턴스에 대한 구독을 변경하고 논리적 복제를 원활하게 계속할 수 있습니다.