

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

Amazon RDS for PostgreSQL 支持很多最常见的 PostgreSQL 功能。例如，PostgreSQL 具有对数据库执行例行维护的 autovacuum 功能。原定设置情况下，autovacuum 功能处于活动状态。尽管您可以禁用此功能，但我们强烈建议您继续启用该功能。了解此功能以及您可以做些什么来确保该功能正常工作，如同任何 DBA 基本任务一样。有关 autovacuum 的更多信息，请参阅 [在 Amazon RDS for PostgreSQL 上使用 PostgreSQL autovacuum](Appendix.PostgreSQL.CommonDBATasks.Autovacuum.md)。要了解有关其他常见 DBA 任务的更多信息，请参阅 [Amazon RDS for PostgreSQL 的数据库管理员常见任务](Appendix.PostgreSQL.CommonDBATasks.md)。

RDS for PostgreSQL 还支持向数据库实例添加重要功能的扩展。例如，您可以使用 PostGIS 扩展处理空间数据，或者使用 pg\$1cron 扩展从实例内计划维护。有关 PostgreSQL 扩展的更多信息，请参阅 [将 PostgreSQL 扩展与 Amazon RDS for PostgreSQL 结合使用](Appendix.PostgreSQL.CommonDBATasks.Extensions.md)。

外部数据包装器是一种特定类型的扩展，旨在让您的 RDS for PostgreSQL 数据库实例与其他商用数据库或数据类型配合使用。有关 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`）创建、修改、重命名和删除事件触发条件。事件触发器位于数据库实例级别，因此，它们可应用于实例上的所有数据库。

例如，以下代码创建在每个数据定义语言 (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` 参数的原定设置值使用数据库参数宏。此宏设置数据库实例内存可用的总共 8KB 分页的百分比。使用标准大页时，这些页面会位于大页中。如果共享内存参数设置为需要 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` 指定分配给用于存储 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 磁盘，可在数据库实例使用的参数组中将 `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 支持表空间。由于所有存储都在单个逻辑卷上，因此不能使用表空间进行 I/O 拆分或隔离。我们的基准测试和经验表明，对于大多数使用案例，单个逻辑卷是最佳设置。

若要为 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 及更高版本包括 ICU 版本 60.2，该版本基于 Unicode 10.0，并包括来自 Unicode 通用区域设置数据存储库 CLDR 32 的排序规则。这些软件国际化库确保字符编码以一致的方式呈现，无论操作系统或平台如何。有关 Unicode CLDR-32 的更多信息，请参阅 Unicode CLDR 网站上的 [CLDR 32 版本注释](https://cldr.unicode.org/index/downloads/cldr-32)。您可以通过 [ICU 技术委员会（ICU-TC）](https://icu.unicode.org/home)网站了解有关 Unicode (ICU) 国际化组件的更多信息。有关 ICU-60 的信息，请参阅[下载 ICU 60](https://icu.unicode.org/download/60)。

从版本 14.3 开始，RDS for PostgreSQL 还包括排序规则，这些排序规则有助于从基于 EBCDIC 的系统进行数据集成和转换。扩展二进制编码的十进制交换码或 *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 for PostgreSQL 中可用的排序规则，这些排序规则将 EBCDIC 代码页映射到 Unicode 代码点。我们建议您将此表中的排序规则用于需要根据 IBM 代码页的顺序进行排序的应用程序开发。<a name="ebcdic-table"></a>


| PostgreSQL 排序规则名称 | 代码页映射和排序顺序的描述 | 
| --- | --- | 
| da-DK-cp277-x-icu | 直接映射到 IBM EBCDIC 代码页 277（每个转换表）的 Unicode 字符按 IBM CP 277 代码点顺序排序 | 
| de-DE-cp273-x-icu | 直接映射到 IBM EBCDIC 代码页 273（每个转换表）的 Unicode 字符按 IBM CP 273 代码点顺序排序 | 
| en-GB-cp285-x-icu | 直接映射到 IBM EBCDIC 代码页 285（每个转换表）的 Unicode 字符按 IBM CP 285 代码点顺序排序 | 
| en-US-cp037-x-icu | 直接映射到 IBM EBCDIC 代码页 037（每个转换表）的 Unicode 字符按 IBM CP 37 代码点顺序排序 | 
| es-ES-cp284-x-icu | 直接映射到 IBM EBCDIC 代码页 284（每个转换表）的 Unicode 字符按 IBM CP 284 代码点顺序排序 | 
| fi-FI-cp278-x-icu | 直接映射到 IBM EBCDIC 代码页 278（每个转换表）的 Unicode 字符按 IBM CP 278 代码点顺序排序 | 
| fr-FR-cp297-x-icu | 直接映射到 IBM EBCDIC 代码页 297（每个转换表）的 Unicode 字符按 IBM CP 297 代码点顺序排序 | 
| it-IT-cp280-x-icu | 直接映射到 IBM EBCDIC 代码页 280（每个转换表）的 Unicode 字符按 IBM CP 280 代码点顺序排序 | 
| nl-BE-cp500-x-icu | 直接映射到 IBM EBCDIC 代码页 500（每个转换表）的 Unicode 字符按 IBM CP 500 代码点顺序排序 | 

Amazon RDS 提供了一组额外的排序规则，这些排序规则使用 IBM 发布的表，按源数据的 EBCDIC 代码页的原始代码点顺序，对映射到 LATIN9 字符的 Unicode 代码点进行排序。<a name="latin9-table"></a>


| PostgreSQL 排序规则名称 | 代码页映射和排序顺序的描述 | 
| --- | --- | 
| da-DK-cp1142m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1142（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1142 代码点顺序排序 | 
| de-DE-cp1141m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1141（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1141 代码点顺序排序 | 
| en-GB-cp1146m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1146（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1146 代码点顺序排序 | 
| en-US-cp1140m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1140（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1140 代码点顺序排序 | 
| es-ES-cp1145m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1145（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1145 代码点顺序排序 | 
| fi-FI-cp1143m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1143（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1143 代码点顺序排序 | 
| fr-FR-cp1147m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1147（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1147 代码点顺序排序 | 
| it-IT-cp1144m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1144（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 IBM CP 1144 代码点顺序排序 | 
| nl-BE-cp1148m-x-icu | 映射到最初从 IBM EBCDIC 代码页 1148（每个转换表）转换而来的 LATIN9 字符的 Unicode 字符按 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
```

我们建议您将 [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 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` 才能启用自动同步

使用启用失效转移的订阅插槽和上述参数值，当提升备用实例时，订阅用户可以更改其对这个新提升实例的订阅，并继续无缝地进行逻辑复制。