我有一个 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