← Назад к вопросам

Как посмотреть список replication slots в PostgreSQL

1.0 Junior🔥 152 комментариев
#Базы данных

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Просмотр Replication Slots в PostgreSQL

Replication slots (слоты репликации) — это механизм в PostgreSQL, обеспечивающий сохранение WAL (Write-Ahead Log) файлов до тех пор, пока они не будут получены всеми репликами. Это предотвращает потерь данных при репликации. Для просмотра списка слотов существует несколько методов, которые я использую в своей практике, в зависимости от контекста и потребностей мониторинга.

Основные SQL-запросы

Самый прямой способ — выполнить SQL-запрос к системным представлениям. Вот основные варианты:

1. Использование pg_replication_slots: Это стандартное представление, доступное начиная с PostgreSQL 9.4, где были введены слоты репликации.

SELECT * FROM pg_replication_slots;

Этот запрос возвращает полную информацию о каждом слоте:

  • slot_name — имя слота
  • plugin — используемый плагин логической репликации (например, pgoutput, test_decoding)
  • slot_type — тип: physical (физическая репликация) или logical (логическая репликация)
  • datoid — OID базы данных (для логических слотов)
  • database — имя базы данных (для логических слотов)
  • active — флаг активности (true/false)
  • restart_lsn — LSN (Log Sequence Number), с которого нужно начать при переподключении
  • confirmed_flush_lsn — последний LSN, подтверждённый для логической репликации

2. Детальный запрос с дополнительной информацией: Часто требуется более структурированный вывод с человекочитаемыми размерами.

SELECT 
    slot_name,
    slot_type,
    database,
    active,
    pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes,
    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag_pretty,
    restart_lsn,
    confirmed_flush_lsn
FROM pg_replication_slots
ORDER BY slot_name;

Ключевые моменты в этом запросе:

  • pg_wal_lsn_diff() вычисляет разницу в байтах между текущим LSN и restart_lsn
  • pg_size_pretty() форматирует вывод в читаемом виде (КБ, МБ, ГБ)
  • Отставание (lag_bytes) показывает, сколько WAL не было отправлено

Практическое использование через psql

В командной строке psql можно использовать несколько подходов:

# Подключение и выполнение запроса
psql -U postgres -c "SELECT slot_name, slot_type, active, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag FROM pg_replication_slots;"

# Или в интерактивном режиме psql
\connect postgres
\x auto  -- Включаем расширенный вывод при необходимости
SELECT * FROM pg_replication_slots;

Мониторинг и важные аспекты

В production-среде я всегда настраиваю регулярный мониторинг слотов репликации:

  1. Отслеживание задержек: Большая разница между pg_current_wal_lsn() и restart_lsn указывает на проблемы с репликацией
  2. Активность слотов: Неактивные слоты (active = false) могут накапливать WAL и приводить к заполнению диска
  3. Размер WAL: Слоты предотвращают удаление WAL файлов, поэтому важно контролировать их количество

Пример скрипта для мониторинга

Вот базовый скрипт, который я использую для проверки:

#!/bin/bash
# Скрипт проверки слотов репликации

PGUSER="postgres"
PGHOST="localhost"
PGPORT="5432"

QUERY="
SELECT 
    slot_name,
    slot_type,
    active,
    pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS wal_retained,
    CASE 
        WHEN pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) > 1024*1024*1024 -- 1GB
        THEN 'WARNING: Excessive WAL retention'
        ELSE 'OK'
    END AS status
FROM pg_replication_slots;
"

psql -U "$PGUSER" -h "$PGHOST" -p "$PGPORT" -c "$QUERY"

Важные предупреждения

  • Физические слоты не привязаны к конкретной БД и видны из любой базы данных кластера
  • Логические слоты привязаны к конкретной базе данных и требуют подключения к этой БД
  • Опасность накопления WAL: Если слот неактивен длительное время, WAL файлы будут накапливаться, что может привести к исчерпанию дискового пространства
  • Для удаления неиспользуемого слота используйте: SELECT pg_drop_replication_slot('slot_name');

В production-окружении я рекомендую интегрировать проверку слотов репликации в систему мониторинга (например, Prometheus с postgres_exporter или Zabbix), чтобы получать алерты при возникновении проблем с репликацией или при чрезмерном накоплении WAL.

Как посмотреть список replication slots в PostgreSQL | PrepBro