

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Amazon RDS for PostgreSQL 支援的 PostgreSQL 功能
<a name="PostgreSQL.Concepts.General.FeatureSupport"></a>

Amazon RDS for PostgreSQL 支援許多最常用的 PostgreSQL 功能。例如，PostgreSQL 的自動資料清理功能可對資料庫執行例行維護。根據預設，會使用自動真空功能。雖然您可以關閉此功能，但我們強烈建議保持開啟。了解此功能以及您可以做些什麼來確保它能夠正常工作是任何 DBA 的基本任務。如需有關自動資料清理的詳細資訊，請參閱 [在 Amazon RDS for PostgreSQL 上使用 PostgreSQL 自動清空](Appendix.PostgreSQL.CommonDBATasks.Autovacuum.md)。若要進一步了解其他常見 DBA 任務，請參閱 [Amazon RDS for PostgreSQL 的常用 DBA 任務](Appendix.PostgreSQL.CommonDBATasks.md)。

RDS for PostgreSQL 也支援為資料庫執行個體新增重要功能的擴充功能。例如，您可以使用 PostGIS 擴充功能來處理空間資料，或者使用 pg\$1cron 擴充功能在執行個體內進行維護排程。如需 PostgreSQL 擴充功能的詳細資訊，請參閱 [搭配 Amazon RDS for PostgreSQL 使用 PostgreSQL 擴充功能](Appendix.PostgreSQL.CommonDBATasks.Extensions.md)。

外部資料包裝函式是一種特定類型的擴充功能，旨在讓您的 RDS for PostgreSQL 資料庫執行個體與其他商業資料庫或資料類型搭配使用。如需 RDS 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`) 來建立、修改、重新命名和刪除事件觸發程序。事件觸發是在資料庫執行個體層級上運作，可套用至執行個體上的所有資料庫。

例如，下列程式碼建立的事件觸發程序會在每個資料定義語言 (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 文件中的[事件觸發](https://www.postgresql.org/docs/current/static/event-triggers.html)。

在 Amazon RDS 上使用 PostgreSQL 事件觸發時有幾項限制。這些索引標籤包括以下項目：
+ 您無法在僅供讀取複本上建立事件觸發程序。不過，您可以在僅供讀取複本來源建立事件觸發。然後，事件觸發會複製到僅供讀取複本。從來源推送變更時，僅供讀取複本上的事件觸發不會在僅供讀取複本上發動。不過，如果提升僅供讀取複本，則資料庫操作發生時，現有的事件觸發會啟動。
+ 若要對使用事件觸發程序的 PostgreSQL 資料庫執行個體執行主要版本升級，就必須在升級執行個體之前刪除事件觸發程序。

# RDS for PostgreSQL 的巨型分頁
<a name="PostgreSQL.Concepts.General.FeatureSupport.HugePages"></a>

*巨型分頁*是一項記憶體管理功能，可減少資料庫執行個體處理大型連續記憶體區塊 (如共用緩衝區使用的記憶體區塊) 時的額外負荷。所有目前可用的 RDS for PostgreSQL 版本都支援此 PostgreSQL 功能。您可以呼叫 `mmap` 或 `SYSV` 共用記憶體，以分配巨型分頁給您的應用程式。RDS for PostgreSQL 同時支援 4 KB 和 2 MB 分頁大小。

您可以開啟或關閉巨型分頁功能，方法是變更 `huge_pages` 參數的值。除了微型、小型和中型資料庫執行個體類之外，所有資料庫執行個體類都預設開啟該功能。

RDS for PostgreSQL 會根據可用的共用記憶體使用巨型分頁。如果資料庫執行個體因為共用記憶體限制而無法使用巨型分頁，Amazon RDS 會阻止資料庫執行個體啟動。在此情況下，Amazon RDS 會將資料庫執行個體的狀態設為不相容的參數狀態。如果發生這種情況，您可以將 `huge_pages` 參數設為「`off`」，以允許 Amazon RDS 啟動資料庫執行個體。

`shared_buffers` 參數是為了使用巨型分頁而設定所需之共用記憶體集區的關鍵。`shared_buffers` 參數的預設值會使用資料庫參數巨集。此巨集會設定可用於資料庫執行個體記憶體的總計 8 KB 分頁的百分比。當您使用巨型分頁時，這些頁面會與巨型分頁放在一起。如果共用記憶體參數設為需要 90% 以上的資料庫執行個體記憶體，Amazon RDS 會將資料庫執行個體設為不相容的參數狀態。

若要進一步了解 PostgreSQL 記憶體管理，請參閱 PostgreSQL 說明文件中的[資源耗用](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)。

**注意**  
除了在 PostgreSQL 10 中引進的原生 PostgreSQL 邏輯複寫功能之外，RDS for PostgreSQL 也支援 `pglogical` 延伸模組。如需詳細資訊，請參閱[使用 pglogical 跨執行個體同步資料](Appendix.PostgreSQL.CommonDBATasks.pglogical.md)。

在下文中，您可以了解如何設定 RDS for PostgreSQL 資料庫執行個體邏輯複寫的資訊。

**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 邏輯複寫最常見的用戶端是 AWS Database Migration Service 或 Amazon EC2 執行個體上的自訂受管主機。邏輯複寫插槽沒有關於串流接收者的資訊。此外，不要求目標必須是複本資料庫。如果您設定邏輯複寫槽，但未讀取這個槽，則資料會寫入並快速填滿資料庫執行個體的儲存體。

Amazon RDS 的 PostgreSQL 邏輯複寫與邏輯解碼是以參數、複寫連線類型和安全角色來開啟。任何用戶端只要能夠在 PostgreSQL 資料庫執行個體上的資料庫建立複寫連線，都可以當作邏輯解碼的用戶端。

**開啟 RDS for PostgreSQL 資料庫執行個體的邏輯解碼**

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` 參數生效，請重新啟動資料庫執行個體。

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 文件中的[邏輯解碼範例](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 資料庫執行個體中的來源資料庫：

   ```
   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. 

**連線至目標資料庫並建立目標資料表**
   + 連線至目標資料庫執行個體中的目標資料庫。使用與來源資料表相同的名稱建立目標資料表：

     ```
     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>

從 RDS for PostgreSQL 第 11 版及更新版本開始，您可以使用 AWS Identity and Access Management (IAM) 身分驗證進行複寫連線。此功能可讓您使用 IAM 角色而非密碼來管理資料庫存取，以增強安全性。它適用於叢集和執行個體精細程度，並遵循與標準 IAM 身分驗證相同的安全模型。

複寫連線的 IAM 身分驗證是一項選擇加入功能。若要啟用它，請在資料庫叢集或資料庫`rds.iam_auth_for_replication`參數群組中將 參數設定為 1。由於這是動態參數，因此您的資料庫叢集或執行個體不需要重新啟動，可讓您利用 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 資料庫執行個體必須是 11 版或更新版本。
+ 在您的發佈者 RDS for PostgreSQL 資料庫執行個體上：
  + 啟用 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 資料庫執行個體上啟用 IAM 身分驗證和邏輯複寫。如果其中一個未啟用，則您無法針對複寫連線使用 IAM 身分驗證。

## 啟用複寫連線的 IAM 身分驗證
<a name="PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Enabling"></a>

完成下列步驟，以啟用複寫連線的 IAM 身分驗證。

**啟用複寫連線的 IAM 身分驗證**

1. 確認您的 RDS for PostgreSQL 資料庫叢集或執行個體符合具有複寫連線的 IAM 身分驗證的所有先決條件。如需詳細資訊，請參閱[先決條件](#PostgreSQL.Concepts.General.FeatureSupport.IAMLogicalReplication.Prerequisites)。

1. 根據您的 RDS for PostgreSQL 設定來設定 `rds.iam_auth_for_replication` 參數：
   + 對於 RDS for PostgreSQL 資料庫執行個體：修改資料庫參數群組。
   + 對於多可用區域叢集：修改資料庫叢集參數群組。

   `rds.iam_auth_for_replication` 設定為 1。這是一個動態參數，無需重新開機即可立即生效。
**注意**  
多可用區域叢集僅使用資料庫叢集參數群組。無法在多可用區域叢集中修改個別執行個體參數群組。

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 身分驗證：
+ 將資料庫執行個體的資料庫參數群組或多可用區域叢集的資料庫叢集參數群組中的 `rds.iam_auth_for_replication` 參數設定為 0。
+ 或者，您可以在 RDS for PostgreSQL 資料庫叢集或執行個體上停用下列其中一項功能：
  + 將 `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` 指定組態給 RAM 磁碟的系統記憶體，以存放 PostgreSQL `stats_temp_directory`。RAM 磁碟參數僅適用於 RDS for PostgreSQL 第 14 版和較低版本。

在某些工作負載下，設定此參數可以提高效能和降低輸入/輸出需求。如需 `stats_temp_directory` 的詳細資訊，請參閱 [PostgreSQL 文件](https://www.postgresql.org/docs/current/static/runtime-config-statistics.html#GUC-STATS-TEMP-DIRECTORY)。

如要設定 `stats_temp_directory` 的 RAM 磁碟，請於資料庫執行個體所使用的參數群組中，將 `rds.pg_stat_ramdisk_size` 參數設為整數常值。此參數表示 MB，因此您必須使用整數值。表達式、公式和函數對 `rds.pg_stat_ramdisk_size` 參數無效。請務必重新啟動資料庫執行個體，變更才會生效。如需有關設定參數的詳細資訊，請參閱 [Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

例如，下列 AWS CLI 命令會將 RAM 磁碟參數設定為 256 MB。

```
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 支援資料表空間以實現相容性。因為所有儲存區都位於單一邏輯磁碟區上，所以您無法使用資料表空間進行輸入/輸出分割或隔離。我們的基準和經驗指出，單一邏輯磁碟區是多數使用案例的最佳設定。

若要建立資料表空間並搭配 RDS for PostgreSQL 資料庫執行個體一起使用，需要 `rds_superuser` 角色。RDS for PostgreSQL 資料庫執行個體的主使用者帳戶 (預設名稱 `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 資料表空間，請參閱 PostgreSQL 說明文件中的[資料表空間](https://www.postgresql.org/docs/current/manage-ag-tablespaces.html)。

# 適用於 EBCDIC 和其他大型機遷移的 RDS for PostgreSQL 定序
<a name="PostgreSQL.Collations.mainframe.migration"></a>

RDS for PostgreSQL 10 版及更高版本包括基於 Unicode 10.0 的 ICU 版本 60.2，其中包含來自 Unicode 通用語言環境資料儲存庫 (CLDR 32) 的定序。這些軟體國際化程式庫可確保字元編碼以一致的方式呈現，不論作業系統或平台為何。如需 Unicode CLDR-32 的詳細資訊，請參閱 Unicode CLDR 網站上的 [CLDR 32 版本備註](https://cldr.unicode.org/index/downloads/cldr-32)。您可以在 [ICU Technical Committee (ICU-TC)](https://icu.unicode.org/home) 網站了解有關 Unicode (ICU) 的國際化元件的更多資訊。如需有關 ICU-60 的資訊，請參閱[下載 ICU 60](https://icu.unicode.org/download/60)。

從 14.3 版開始，RDS for PostgreSQL 也包含有助於從 EBCDC 系統進行資料整合和轉換的定序。擴展的二進制編碼十進制交換碼或 *EBCDIC* 編碼通常由大型機作業系統使用。這些 Amazon RDS 提供的定序定義很小，只能夠直接對應至 EBCDIC 字碼頁的 Unicode 字元。這些字元按 EBCDIC 代碼點順序進行排序，以便在轉換後進行資料驗證。這些定序不包含部正常的格式，也不包含未直接對應至來源 EBCDIC 字碼頁的 Unicode 字元。

EBCDIC 字碼頁與 Unicode 字碼點之間的字元對應是以 IBM 發佈的表格為基礎。完整的設定可從 IBM 的[壓縮檔案](http://download.boulder.ibm.com/ibmdl/pub/software/dw/java/cdctables.zip)下載。RDS for PostgreSQL 會將這些對應與 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 資料庫中使用這些定序。

 

在下表中，您會發現 RDS 版 PostgreSQL 中可用的定序，這些定序會將 EBCDIC 字碼頁對應至 Unicode 字碼點。我們建議您使用此表格中的定序來進行應用程式開發，這些應用程式開發需要根據 IBM 字碼頁的順序進行排序。<a name="ebcdic-table"></a>


| PostgreSQL 定序名稱 | 字碼頁對應和排序順序的說明 | 
| --- | --- | 
| da-DK-cp277-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 277 (每個轉換表) 按照 IMB CP 277 字碼點順序排序 | 
| de-DE-cp273-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 273 (每個轉換表) 按照 IMB CP 273 字碼點順序排序 | 
| en-GB-cp285-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 285 (每個轉換表) 按照 IMB CP 285 字碼點順序排序 | 
| en-US-cp037-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 037 (每個轉換表) 按照 IMB CP 37 字碼點順序排序 | 
| es-ES-cp284-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 284 (每個轉換表) 按照 IMB CP 284 字碼點順序排序 | 
| fi-FI-cp278-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 278 (每個轉換表) 按照 IMB CP 278 字碼點順序排序 | 
| fr-FR-cp297-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 297 (每個轉換表) 按照 IMB CP 297 字碼點順序排序 | 
| it-IT-cp280-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 280 (每個轉換表) 按照 IMB CP 280 字碼點順序排序 | 
| nl-BE-cp500-x-icu | Unicode 字元直接對應至 IBM EBCDIC 字碼頁 500 (每個轉換表) 按照 IMB CP 500 字碼點順序排序 | 

Amazon RDS 提供一組額外的定序，可根據來源資料的 EBCDIC 字碼頁，使用 IBM 發佈的表格，依原始程式碼點的順序，對應至 LATIN9 字元的 Unicode 程式碼點進行排序。<a name="latin9-table"></a>


| PostgreSQL 定序名稱 | 字碼頁對應排序順序的說明 | 
| --- | --- | 
| da-DK-cp1142m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1142 (每個轉換表) 按照 IMB CP 1142 字碼點順序排序 | 
| de-DE-cp1141m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1141 (每個轉換表) 按照 IMB CP 1141 字碼點順序排序 | 
| en-GB-cp1146m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1146 (每個轉換表) 按照 IMB CP 1146 字碼點順序排序 | 
| en-US-cp1140m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1140 (每個轉換表) 按照 IMB CP 1140 字碼點順序排序 | 
| es-ES-cp1145m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1145 (每個轉換表) 按照 IMB CP 1145 字碼點順序排序 | 
| fi-FI-cp1143m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1143 (每個轉換表) 按照 IMB CP 1143 字碼點順序排序 | 
| fr-FR-cp1147m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1147 (每個轉換表) 按照 IMB CP 1147 字碼點順序排序 | 
| it-IT-cp1144m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1144 (每個轉換表) 按照 IMB CP 1144 字碼點順序排序 | 
| nl-BE-cp1148m-x-icu | Unicode 字元對應至 LATIN9 字元，原始轉換自 IBM EBCDIC 字碼頁 1148 (每個轉換表) 按照 IMB 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
```

我們建議您使用 [Unicode to EBCDIC collations table](#ebcdic-table) 中的定序並在 [Unicode to LATIN9 collations table](#latin9-table) 中用於需要根據 IBM 字碼頁排序進行排序的應用程式開發。下列定序 （尾碼為字母「b」) 也可見於 `pg_collation`，但適用於大型主機資料整合和遷移工具 AWS ，其對應具有特定程式碼點位移的程式碼頁面，且需要特殊的定序處理。換言之，不建議使用下列定序。
+ da-DK-277b-x-icu
+ da-DK-1142b-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 大型主機現代化？](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` 以啟用自動同步

透過已啟用容錯移轉的訂閱槽和上述參數值，當待命提升時，訂閱者可以變更對此新提升執行個體的訂閱，並無縫地繼續邏輯複寫。