当非活跃的逻辑复制槽因未及时清理而过多时,会导致 WAL 日志不断堆积,占用大量存储空间,甚至可能写满磁盘导致实例锁定无法写入数据,进而影响业务。因此生产数据库一定要及时清理非活跃逻辑复制槽。
可按照以下思路对数据库中存在的非活跃逻辑复制槽进行排查和处理:
排查是否存在失效的逻辑复制槽。
业务确认是否需要继续使用该逻辑复制槽。
删除失效的逻辑复制槽。
在实例中确认是否存在非活跃的逻辑复制槽。可通过以下两种方式进行判断:
在云数据库 PostgreSQL 版控制台查看复制槽列表,确认是否存在非活跃的逻辑复制槽。关于查看复制槽列表的详细信息,可参见查看复制槽列表。
调用 Open API DescribeSlots 查询实例下的复制槽,字段 SlotStatus 返回值为 INACTIVE
、SlotType 返回值为 logical
,则说明实例下存在非活跃的逻辑复制槽。SlotName 字段为复制槽名称。
联系业务方排查是否要继续使用该逻辑复制槽。
如不再使用,执行步骤 3 删除复制槽。
如需继续使用,且使用了 PostgreSQL 的 subscription 特性,可以按照以下方向进行排查:
在订阅端创建订阅时未启用逻辑复制槽的复制,手动设置为 disable 状态。 在订阅端执行以下 SQL 查看 subenabled 列的字段返回。
select subname,subenabled from pg_subscription;
若 subenabled 列的字段返回为 f
,说明订阅未启用逻辑复制,执行以下 SQL 启用订阅的逻辑复制。
ALTER SUBSCRIPTION sub_name ENABLE;
若 subenabled 列的字段返回为 t
,则继续按照以下步骤排查。
使用其他工具执行任务时使用的逻辑复制槽未自动清理,由于任务中断或源数据库或目标数据库的某些操作,如备份、重建索引等意外情况产生。
在发布端通过云数据库 PostgreSQL 版控制台查询,观察返回的“Slot 名称”字段的值是否是以 _volc_dts_logical_replica_
开头。如果是,则说明是执行 DTS 任务产生的该逻辑复制槽,此时可根据任务情况,判断是否执行步骤 3 清理复制槽。
删除失效的逻辑复制槽。可通过以下两种方式删除复制槽:
在云数据库 PostgreSQL 版控制台的复制槽列表删除复制槽。关于删除复制槽的详细信息,可参见删除复制槽。
调用 Open API DeleteSlot 删除实例下的复制槽。在请求参数 InstanceId 指定复制槽所属的实例的 ID,在请求参数 SlotName 中指定需要删除的复制槽的名称。
在业务中,及时清理已不再需要的复制槽。
云数据库 PostgreSQL 版为复制槽提供了非活跃状态复制槽个数和复制槽最大 WAL 堆积量两个监控项,为两个监控项创建告警策略,可及时发现非活跃复制槽的出现和因复制槽产生的存储空间占用。关于创建告警策略的详细信息,请参见创建告警策略。