使用Debezium同步Postgres数据时Kafka报UNKNOWN_TOPIC_OR_PARTITION错误求助
排查Debezium Postgres连接器主题未创建及UNKNOWN_TOPIC_OR_PARTITION错误的思路
1. 确认Kafka集群的可达性与可用性
- 进入Kafka容器,执行以下命令验证集群连接:
若能正常列出现有主题,说明Kafka服务正常;若失败,检查Kafka容器是否运行正常,以及Connect容器与Kafka容器的网络连通性(可在Connect容器内执行kafka-topics.sh --list --bootstrap-server kafka:9092ping kafka或telnet kafka 9092测试)。
2. 检查Kafka主题自动创建配置
- Debezium默认依赖Kafka的自动创建主题功能,需确认Kafka broker的
auto.create.topics.enable参数是否为true:kafka-configs.sh --describe --bootstrap-server kafka:9092 --entity-type brokers --entity-name 0 - 若自动创建未开启,要么修改Kafka配置并重启服务,要么手动创建所需主题:
# 创建research表对应的主题 kafka-topics.sh --create --topic dbserver1.public.research --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1 # 创建schema变更历史主题 kafka-topics.sh --create --topic schema-changes.students --bootstrap-server kafka:9092 --partitions 1 --replication-factor 1
3. 验证PostgreSQL的wal_level配置
- Debezium需要PostgreSQL启用逻辑复制,确保
wal_level设置为logical:-- 进入Postgres容器执行 psql -U postgres -d students -c "show wal_level;" - 若结果不是
logical,修改postgresql.conf中的wal_level = logical,然后重启Postgres服务。
4. 检查PostgreSQL用户权限
- 确认用于连接的
postgres用户拥有REPLICATION权限:psql -U postgres -d students -c "SELECT rolname, rolreplication FROM pg_roles WHERE rolname='postgres';" - 若
rolreplication为f,执行以下命令赋予权限:ALTER USER postgres REPLICATION;
5. 排查Transform配置的影响
- 暂时移除连接器配置中的
transforms相关参数,重启连接器后观察是否能正常创建主题。如果恢复正常,再逐步添加transform配置,排查是否是解包逻辑导致的问题。
6. 查看Kafka Connect完整日志
- 获取Connect容器的全部日志,查找更早的错误信息(比如Postgres连接失败、Schema Registry不可达等):
docker logs <your-connect-container-name> - 也可以通过Connect的REST API查看连接器状态:
curl -X GET http://<connect-host>:8083/connectors/postgres-source/status
7. 确认数据库白名单与表监听配置
- 检查连接器日志中是否有识别到
public.admission和public.research表的记录,确保database.whitelist配置正确(当前配置的students是数据库名,符合要求)。
内容的提问来源于stack exchange,提问作者paolo_tn
相关产品推荐
相关产品推荐

