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