为 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 数据库实例启用逻辑解码
-
确保您使用的用户账户具有以下角色:
-
rds_superuser
角色,以使您可以启用逻辑复制 -
rds_replication
角色,以授予管理逻辑槽并使用逻辑槽流式处理数据的权限
-
-
将
rds.logical_replication
静态参数设置为 1。在应用该参数时,还将设置参数wal_level
、max_wal_senders
、max_replication_slots
和max_connections
。这些参数更改可能会增加 WAL 生成,因此,仅在使用逻辑槽时设置rds.logical_replication
参数。 -
重启数据库实例,静态
rds.logical_replication
参数才会生效。 -
请按下一部分中的说明创建逻辑复制槽。该过程需要您指定解码插件。目前,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)