为什么将 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 参数的值后,重新启动任务。