База знаний типичных ошибок Debezium с диагностикой, причинами и пошаговыми решениями. Используйте фильтры для поиска по коннектору и категории проблемы, или Cmd+K для поиска по тексту ошибки.
PostgreSQL не разрешает подключения для репликации от указанного хоста. Файл pg_hba.conf контролирует аутентификацию и должен явно разрешать replication connections для пользователя и хоста Debezium.
pg_hba.conf (обычно /var/lib/postgresql/data/pg_hba.conf)host replication debezium 0.0.0.0/0 md5SELECT pg_reload_conf(); (или перезапуск PostgreSQL)psql -h localhost -U debezium -d postgres -c "IDENTIFY_SYSTEM" replication=databaseПредыдущий инстанс коннектора не освободил replication slot корректно, или slot уже используется другим процессом репликации. PostgreSQL позволяет только одно активное соединение к каждому слоту.
SELECT slot_name, active, active_pid FROM pg_replication_slots;active = true, найдите процесс: SELECT pid, usename, application_name FROM pg_stat_replication;SELECT pg_terminate_backend(); SELECT pg_drop_replication_slot('debezium');snapshot.mode=initial если удалили слотReplication slot удерживает WAL-сегменты, не позволяя PostgreSQL удалять их до тех пор, пока Debezium не прочитает. Если коннектор остановлен или работает медленно, WAL накапливается.
SELECT slot_name, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes FROM pg_replication_slots;SELECT pg_drop_replication_slot('debezium');max_slot_wal_keep_size = 10GBDebezium пытается сделать consistent snapshot и требует короткую блокировку таблиц. Если на таблице есть долгие транзакции или активные записи, блокировку получить невозможно.
snapshot.lock.timeout.ms в конфигурации коннектора (по умолчанию 10 секунд)snapshot.mode=never и snapshot.mode=schema_only если начальные данные не критичныSELECT pid, usename, query, state FROM pg_stat_activity WHERE state != 'idle';Debezium пытается читать binlog с позиции, которая уже была удалена из-за ротации логов. Это происходит после длительного downtime коннектора или при агрессивных настройках expire_logs_days / binlog_expire_logs_seconds.
SHOW BINARY LOGS;SET GLOBAL expire_logs_days = 7; или SET GLOBAL binlog_expire_logs_seconds = 604800;snapshot.mode=initial для полного ресканированияMySQL удалил binlog файлы, содержащие GTID транзакции, которые Debezium ещё не прочитал. При использовании GTID режима невозможно продолжить репликацию с пропущенными GTID.
SHOW GLOBAL VARIABLES LIKE 'gtid_purged';SHOW MASTER STATUS;RESET MASTER; и SET GLOBAL gtid_purged=''; Параметр database.server.name используется как префикс для Kafka топиков. Kafka топики не поддерживают большинство спецсимволов, только [a-zA-Z0-9._-].
database.server.namedbserver1, pg-prod, mysql.replica_01db@server, pg prod, mysql:5432Consumer приложение не успевает обрабатывать CDC события с той скоростью, с которой они поступают. Возможные причины: медленная бизнес-логика, неоптимальная сериализация, недостаточная параллелизация.
PostgreSQL параметр wal_level установлен в replica или minimal, что недостаточно для logical replication. Debezium требует wal_level = logical для захвата изменений через логическую репликацию.
SHOW wal_level;wal_level = logicalSHOW wal_level; должно вернуть "logical"При использовании pgoutput plugin (Debezium 2.0+), коннектор ожидает существующую PostgreSQL publication. Если publication.autocreate.mode=disabled, publication должна быть создана вручную.
SELECT * FROM pg_publication;CREATE PUBLICATION dbz_publication FOR ALL TABLES;CREATE PUBLICATION dbz_publication FOR TABLE customers, orders;publication.autocreate.mode=all_tablesПользователь БД, который использует Debezium, не имеет прав REPLICATION. Только пользователи с REPLICATION role или SUPERUSER могут создавать и использовать replication slots.
SELECT rolname, rolreplication FROM pg_roles WHERE rolname = 'debezium';ALTER USER debezium WITH REPLICATION;CREATE USER debezium WITH REPLICATION PASSWORD 'password';GRANT CONNECT ON DATABASE mydb TO debezium;GRANT USAGE ON SCHEMA public TO debezium; GRANT SELECT ON ALL TABLES IN SCHEMA public TO debezium;MySQL параметр binlog_format установлен в STATEMENT или MIXED. Debezium требует binlog_format = ROW для захвата всех изменений на уровне строк, включая изменения данных до и после.
SHOW VARIABLES LIKE 'binlog_format';SET GLOBAL binlog_format = 'ROW';[mysqld] секция, добавьте binlog_format = ROWSHOW VARIABLES LIKE 'binlog_format'; должно вернуть "ROW"MySQL параметр server_id не установлен или равен 0. Для репликации (включая CDC) каждый сервер в топологии должен иметь уникальный server_id > 0.
SHOW VARIABLES LIKE 'server_id';SET GLOBAL server_id = 223344; (временно)[mysqld] секция, добавьте server_id = 223344MySQL параметр binlog_row_image установлен в MINIMAL или NOBLOB. Debezium требует FULL для получения полных данных "before" и "after" для всех операций.
SHOW VARIABLES LIKE 'binlog_row_image';SET GLOBAL binlog_row_image = 'FULL';[mysqld] секция, добавьте binlog_row_image = FULLMySQL терминирует соединение из-за превышения таймаута или проблем сети. Причины: wait_timeout слишком мал, max_allowed_packet недостаточен, сетевые разрывы, большие транзакции.
SET GLOBAL wait_timeout = 28800;SET GLOBAL max_allowed_packet = 67108864; (64MB)wait_timeout = 28800, max_allowed_packet = 64MИмя коннектора уже используется в Kafka Connect кластере. Каждый коннектор должен иметь уникальное имя в пределах кластера.
curl http://localhost:8083/connectorscurl -X DELETE http://localhost:8083/connectors/xyzcurl -X PUT http://localhost:8083/connectors/xyz/config -H "Content-Type: application/json" -d @config.jsonKafka топик для хранения истории схем БД (DDL changes) был удалён или недоступен. MySQL коннектор требует этот топик для отслеживания структуры таблиц во времени.
kafka-topics --bootstrap-server localhost:9092 --list | grep schema-historyKafka топик для хранения offset (connect-offsets) недоступен, удалён, или у Kafka Connect нет прав на запись. Без offset коннектор не может отслеживать свою позицию в логах репликации.
kafka-topics --bootstrap-server localhost:9092 --describe --topic connect-offsetskafka-topics --create --topic connect-offsets --replication-factor 3 --partitions 25 --config cleanup.policy=compactНедостаточно памяти JVM heap для обработки больших событий или snapshot операций. Причины: очень большие таблицы в snapshot, огромные транзакции, много коннекторов на одном worker, малый heap size.
export KAFKA_HEAP_OPTS="-Xms4G -Xmx4G"-XX:+UseG1GCPostgreSQL не имеет установленного pgoutput плагина или используется старая версия PostgreSQL (< 10). pgoutput — это встроенный плагин логической репликации, доступный с PostgreSQL 10+.
SELECT version(); — должна быть 10 или вышеSELECT * FROM pg_available_extensions WHERE name = 'pgoutput';