更新时间:2024-09-05 GMT+08:00
存在非活跃逻辑复制槽问题定位及处理方法
指标异常说明(影响)
生产数据库一定要及时清理非活跃逻辑复制槽。配置非活跃逻辑复制槽监控指标(连续3个周期 上报值≥1 Counts),当存在时,需要及时关注并处理。
存在非活跃逻辑复制槽产生的影响:
- 数据库残留的非活跃逻辑复制槽,会一直保留逻辑复制所需要的资源。数据库wal日志无法被清理,从而导致wal日志积压,占用更多的磁盘空间,严重时会导致磁盘满。
- 可能意味着应用侧的业务未按预期运行,存在风险。
问题排查思路
数据库存在非活跃逻辑复制槽排查和处理的思路是:
- 排查是否存在失效的逻辑复制槽。
- 业务确认是否需要继续使用该逻辑复制槽。
- 删除失效的逻辑复制槽。
排查及解决方法
- 排查是否存在失效的逻辑复制槽。
若有返回时,则说明数据库中存在失效的逻辑复制槽,其中返回的slot_name字段为失效逻辑复制槽的名称。
select slot_name,database,active from pg_replication_slots where active ='f' and slot_type='logical';
- 业务确认是否需要继续使用该逻辑复制槽。
联系业务方排查是否要继续使用该逻辑复制槽,若不使用时执行3。
若需继续使用,建议业务按照以下方向排查:
- 订阅端创建订阅时未启用逻辑复制槽的复制,手动设置为disable状态。
- 若subenabled列的字段返回为f,说明订阅未启用逻辑复制,执行以下SQL启用订阅的逻辑复制。
ALTER SUBSCRIPTION sub_name ENABLE;
- 若返回为t,则进行以下步骤排查。
- 若subenabled列的字段返回为f,说明订阅未启用逻辑复制,执行以下SQL启用订阅的逻辑复制。
- 使用其他工具执行任务时使用的逻辑复制槽未自动清理,由于任务中断或源数据库或目标数据库的某些操作,如备份、重建索引等意外情况产生。
在发布端执行如下SQL查询,观察返回的“slot_name”字段的值是否是以drs等开头,则说明是执行drs任务产生的该逻辑复制槽,此时可根据任务情况,判断是否执行3清理。
select slot_name,database,active from pg_replication_slots where active ='f' and slot_type='logical';
- 订阅端创建订阅时未启用逻辑复制槽的复制,手动设置为disable状态。
- 如果确认不再使用逻辑复制槽,则删除失效的逻辑复制槽。
select pg_drop_replication_slot('slot_name');