为什么我使用 PostgreSQL 作为源的 AWS DMS 任务会失败,并出现所有副本槽都在使用的问题?

1 分钟阅读
0

我有一个 AWS Database Migration Service(AWS DMS)任务,它使用 Amazon Relational Database Service(Amazon RDS)for PostgreSQL DB 实例。我的任务失败,所有副本槽都在使用中,并且我收到了一条错误消息。

简述

对于 Amazon RDS for PostgreSQL 实例,AWS DMS 使用本机副本槽来执行更改数据捕获(CDC)的逻辑复制。

max_replication_slots 参数控制 PostgreSQL 实例拥有的副本槽数量。默认情况下,RDS for PostgreSQL 实例有五个副本槽。如果您使用的副本槽数量超过了最大数量限制,则会看到如下所示的日志条目:

Messages
[SOURCE_CAPTURE ]E: Failed (retcode -1) to execute statement [1022502] (ar_odbc_stmt.c:2579)
[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 53400 NativeError: 1 Message: ERROR: all replication slots are in use;

要解决这些错误,请删除已使用的副本槽,或者加大 max_replication_slots 参数的值。

解决方案

删除已使用的副本槽

已使用的副本槽一直占用着空间。如果您运行多个 AWS DMS 任务,或者您有在同一 DB 实例上运行的旧任务,那么请删除已使用的副本槽。

首先,确定副本槽的最大数量限制。然后,删除未使用的副本槽。

要检查副本槽的最大数量,请运行以下查询。要识别未使用的副本槽,请查看 active 列:

SELECT * FROM pg_replication_slots;
     slot_name    |    plugin     | slot_type | datoid | database | active |  xmin  | catalog_xmin | restart_lsn
 -----------------+---------------+-----------+--------+----------+--------+--------+--------------+-------------
old_and_used_slot | test_decoding | logical   |  12052 | postgres | f      |        |          684 | 0/16A4408

**注意:**active: t (true) 表示该槽正在使用中,active: f (false) 表示该槽未被使用。

要删除未使用的副本槽,请运行以下查询:

SELECT pg_drop_replication_slot('old_and_used_slot');

**注意:**用副本槽的名称替换 old_and_used_slot

删除未使用的副本槽后,重新启动任务。

加大 max_replication_slots 参数的值

修改附加到 RDS DB 实例的自定义数据库参数组中的数据库参数。然后,加大 max_replication_slots 参数的值。这是一个静态参数,因此请务必在更改这个参数值后重启 DB 实例。然后,重新启动相关任务。

相关信息

Activating change data capture (CDC) using logical replication

Amazon RDS for PostgreSQL

Using a PostgreSQL database as an AWS DMS source

PostgreSQL 网站上的 Logical decoding examples