使用 Amazon RDS for PostgreSQL 支持的 PostgreSQL 功能 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon RDS for PostgreSQL 支持的 PostgreSQL 功能

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

RDS for PostgreSQL 还支持向数据库实例添加重要功能的扩展。例如,您可以使用 PostGIS 扩展处理空间数据,或者使用 pg_cron 扩展从实例内计划维护。有关 PostgreSQL 扩展的更多信息,请参阅 将 PostgreSQL 扩展与 Amazon RDS for PostgreSQL 结合使用

外部数据包装器是一种特定类型的扩展,旨在让您的 RDS for PostgreSQL 数据库实例与其他商用数据库或数据类型配合使用。有关 RDS for PostgreSQL 支持的外部数据包装器的更多信息,请参阅 使用 Amazon RDS for PostgreSQL 支持的外部数据包装器

在下文中,您可以了解有关 RDS for PostgreSQL 支持的一些其他功能的信息。

使用 RDS for PostgreSQL 自定义数据类型和枚举

PostgreSQL 支持创建自定义数据类型和使用枚举。有关创建和使用枚举以及其他数据类型的更多信息,请参阅 PostgreSQL 文档中的枚举类型

以下是创建一种类型作为枚举然后在表中插入值的示例。

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 的事件触发条件

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 文档中的事件触发器

在 Amazon RDS 上使用 PostgreSQL 事件触发器存在多个限制。这些功能包括:

  • 您不能在只读副本上创建事件触发器。不过,您可以在只读副本源上创建事件触发器。然后,事件触发器复制到只读副本。从源推送更改时,不会触发只读副本上的事件触发器。不过,如果提升只读副本,则当数据库发生操作时将触发现有事件触发器。

  • 要将主要版本升级到使用事件触发器的 PostgreSQL 数据库实例,请确保在升级该实例之前删除事件触发器。

适用于 RDS for PostgreSQL 的大页

大页是一项内存管理功能,可以减少数据库实例处理大量连续内存数据块(例如共享缓冲区使用的内存数据块)时的开销。RDS for PostgreSQL 的当前所有可用版本支持 PostgreSQL 的这个功能。您可以通过使用对 mmapSYSV 共享内存的调用,为应用程序分配大页。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 文档中的资源消耗

为 Amazon RDS for PostgreSQL 执行逻辑复制

从版本 10.4 开始,RDS for PostgreSQL 支持 PostgreSQL 10 中引入的发布和订阅 SQL 语法。要了解更多信息,请参阅 PostgreSQL 文档中的逻辑复制

注意

除了 PostgreSQL 10 中引入的原生 PostgreSQL 逻辑复制功能外,RDS for PostgreSQL 还支持 pglogical 扩展。有关更多信息,请参阅使用 pglogical 跨实例同步数据

在下文中,您可以了解有关为 RDS for PostgreSQL 数据库实例设置逻辑复制的信息。

了解逻辑复制和逻辑解码

RDS for PostgreSQL 支持使用 PostgreSQL 的逻辑复制槽流式传输预写日志 (WAL) 更改。其还支持使用逻辑解码。您可以在实例上设置逻辑复制槽并通过这些槽将数据库更改流式传输到某个客户端(如 pg_recvlogical)。您可在数据库级别创建逻辑复制槽,它们支持与单个数据库的复制连接。

PostgreSQL 逻辑复制的最常见客户端是 Amazon Database Migration Service 或 Amazon EC2 实例上的自定义托管主机。逻辑复制槽没有关于流接收器的信息。此外,不要求目标是副本数据库。如果设置逻辑复制槽并且不从该槽进行读取,则数据可写入并快速填满数据库实例上的存储。

您可启用 Amazon RDS 的 PostgreSQL 逻辑复制和逻辑解码,带有参数、复制连接类型和安全角色。逻辑解码的客户端可以是能够与 PostgreSQL 数据库实例上的数据库建立复制连接的任何客户端。

为 RDS for PostgreSQL 数据库实例启用逻辑解码
  1. 确保您使用的用户账户具有以下角色:

    • rds_superuser 角色,以使您可以启用逻辑复制

    • rds_replication 角色,以授予管理逻辑槽并使用逻辑槽流式处理数据的权限

  2. rds.logical_replication 静态参数设置为 1。在应用该参数时,还将设置参数 wal_levelmax_wal_sendersmax_replication_slotsmax_connections。这些参数更改可能会增加 WAL 生成,因此,仅在使用逻辑槽时设置 rds.logical_replication 参数。

  3. 重启数据库实例,静态 rds.logical_replication 参数才会生效。

  4. 请按下一部分中的说明创建逻辑复制槽。该过程需要您指定解码插件。目前,RDS for PostgreSQL 支持 PostgreSQL 随附的 test_decoding 和 wal2json 输出插件。

有关 PostgreSQL 逻辑解码的更多信息,请参阅 PostgreSQL 文档

使用逻辑复制槽

您可以通过 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 文档中的逻辑解码示例

创建逻辑复制槽后,就可以开始流式处理。以下示例显示了如何通过流式复制协议控制逻辑解码。此示例使用 PostgreSQL 发行版中包含的程序 pg_recvlogical。此操作要求设置客户端身份验证以允许复制连接。

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)

stats_temp_directory 的 RAM 磁盘

您可使用 RDS for PostgreSQL 参数 rds.pg_stat_ramdisk_size 指定分配给用于存储 PostgreSQL stats_temp_directory 的 RAM 磁盘系统内存。RAM 磁盘参数适用于 Amazon RDS 上的所有 PostgreSQL 版本。

在某些工作负载下,设置该参数可提高性能并降低 I/O 要求。有关 stats_temp_directory 的更多信息,请参阅 PostgreSQL 文档

要为您的 stats_temp_directory 设置 RAM 磁盘,可在数据库实例使用的参数组中将 rds.pg_stat_ramdisk_size 参数设置为整数值。此参数表示 MB,因此必须使用整数值。表达式、公式和函数对 rds.pg_stat_ramdisk_size 参数无效。请务必重启数据库实例,以便更改能够生效。有关设置参数的信息,请参阅 使用参数组

例如,以下 Amazon 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 的表空间

为了实现兼容性,RDS for PostgreSQL 支持表空间。由于所有存储都在单个逻辑卷上,因此不能使用表空间进行 I/O 拆分或隔离。我们的基准测试和经验表明,对于大多数使用案例,单个逻辑卷是最佳设置。

若要为 RDS for PostgreSQL 数据库实例创建和使用表空间,需要 rds_superuser 角色。RDS for PostgreSQL 数据库实例的主用户账户(默认名称:postgres)是此角色的成员。有关更多信息,请参阅了解 PostgreSQL 角色和权限

如果在创建表空间时指定文件名,则路径前缀为 /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 文档中的表空间

用于 EBCDIC 和其他大型机迁移的 RDS for PostgreSQL 排序规则

RDS for PostgreSQL 版本 10 及更高版本包括 ICU 版本 60.2,该版本基于 Unicode 10.0,并包括来自 Unicode 通用区域设置数据存储库 CLDR 32 的排序规则。这些软件国际化库确保字符编码以一致的方式呈现,无论操作系统或平台如何。有关 Unicode CLDR-32 的更多信息,请参阅 Unicode CLDR 网站上的 CLDR 32 版本注释。您可以通过 ICU 技术委员会(ICU-TC)网站了解有关 Unicode (ICU) 国际化组件的更多信息。有关 ICU-60 的信息,请参阅下载 ICU 60

从版本 14.3 开始,RDS for PostgreSQL 还包括排序规则,这些排序规则有助于从基于 EBCDIC 的系统进行数据集成和转换。扩展二进制编码的十进制交换码或 EBCDIC 编码通常由大型机操作系统使用。这些 Amazon RDS 提供的排序规则的定义非常狭窄,仅对那些直接映射到 EBCDIC 代码页的 Unicode 字符进行排序。字符按 EBCDIC 代码点顺序排序,以便在转换后进行数据验证。这些排序规则不包括非规范化表单,也不包含不直接映射到源 EBCDIC 代码页上字符的 Unicode 字符。

EBCDIC 代码页和 Unicode 代码点之间的字符映射基于 IBM 发布的表。可以从 IBM 下载整套的压缩文件。RDS for PostgreSQL 使用这些映射以及 ICU 提供的工具来创建本节的各表中列出的排序规则。排序规则名称包括 ICU 要求的语言和国家/地区。但是,EBCDIC 代码页没有指定语言,一些 EBCDIC 代码页涵盖多个国家/地区。这意味着表中排序规则名称的语言和国家/地区部分是任意的,它们不需要与当前的区域设置相匹配。换句话说,代码页码是该表中排序规则名称的最重要部分。您可以在任何 RDS for PostgreSQL 数据库中使用以下各表列出的任何排序规则。

  • Unicode to EBCDIC collations table – 一些大型机数据迁移工具在内部使用 LATIN1 或 LATIN9 来编码和处理数据。此类工具使用往返操作方案来保持数据完整性并支持反向转换。使用 LATIN1 编码处理数据(这种编码不需要特殊处理)的工具可以使用此表中的排序规则。

  • Unicode to LATIN9 collations table – 您可以在任何 RDS for PostgreSQL 数据库中使用这些排序规则。

在下表中,您可以找到 RDS for PostgreSQL 中可用的排序规则,这些排序规则将 EBCDIC 代码页映射到 Unicode 代码点。我们建议您将此表中的排序规则用于需要根据 IBM 代码页的顺序进行排序的应用程序开发。

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 代码点进行排序。

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 tableUnicode to LATIN9 collations table中的排序规则用于需要根据 IBM 代码页的顺序进行排序的应用程序开发。以下排序规则(后缀为字母“b”)在 pg_collation 中也可见,但供 Amazon 中的大型机数据集成和迁移工具使用,这些工具将代码页映射到特定的代码点偏移,并要求在排序规则中进行特殊处理。换句话说,不建议使用以下排序规则。

  • 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

要了解有关将应用程序从大型机环境迁移到 Amazon 的更多信息,请参阅什么是 Amazon Mainframe Modernization?

有关在 PostgreSQL 中管理排序规则的更多信息,请参阅 PostgreSQL 文档中的排序规则支持