为什么将 PostgreSQL 用作源的 AWS DMS 任务因所有复制槽均在使用中而失败?

上次更新日期:2022 年 6 月 27 日

我有一个 AWS Database Migration Service(AWS DMS)任务,该任务使用将 PostgreSQL 用作源的 Amazon Relational Database Service(Amazon RDS)数据库实例。我的任务失败,所有的复制槽均在使用中,且我收到错误消息。我的任务为什么失败,我如何解决这些错误?

简短描述

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

PostgreSQL 实例所具有的复制槽数量受 max_replication_slots 参数控制。默认情况下,RDS PostgreSQL 实例具有五个复制槽。如果超出复制槽的最大数量,您将看到类似以下内容的日志条目:

消息
[SOURCE_CAPTURE ]E:无法(retcode -1)执行语句 [1022502](ar_odbc_stmt.c:2579)
[SOURCE_CAPTURE ]E: RetCode: SQL_ERROR SqlState: 53400 NativeError: 1 消息:错误:所有复制槽都在使用中;

要解决这些错误,移除已用的复制槽或提高 max_replication_slots 参数的值。

解决方法

移除已用的复制槽

如果您正在运行多个 AWS DMS 任务,或者在同一个数据库实例上运行旧任务,请移除已使用的复制槽。这些复制槽继续占用空间,因此通过移除这些复制槽,您可以将插槽用于新任务。

首先,确定复制槽的最大数量。然后,移除或“丢弃”已使用的复制槽。

运行此查询以检查复制槽的最大数量:

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

运行此查询以删除已用的复制槽:

SELECT pg_drop_replication_slot('old_and_used_slot');

注意:old_and_used_slot 替换为您的复制槽名称。

提高 max_replication_slots 参数的值

修改附加到 Amazon RDS 数据库实例的自定义数据库参数组中的数据库参数。然后,提高 max_replication_slots 参数的值。这是一个静态参数,因此,请确保在更改参数值后重启数据库实例

移除已用的复制槽或提高 max_replication_slots 参数的值后,重新启动任务。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?