为什么将 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 数据库实例具有五个复制槽。如果超出复制槽的最大数量,您将看到类似以下内容的日志条目:
| 消息 |
|---|
| E: 无法 (retcode -1) 执行语句 (ar_odbc_stmt.c:2579) |
| 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 任务。