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

上次更新时间:2019 年 10 月 1 日

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

简短描述

对于运行 PostgreSQL 的 RDS 数据库实例,AWS DMS 使用本机复制槽执行逻辑复制来变更数据捕获 (CDC)(也称为持续复制)。

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

消息
[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 参数的值后,重新启动 AWS DMS 任务


这篇文章对您是否有帮助?

我们可以改进什么?


需要更多帮助吗?