使用Debezium与Oracle快照时出现SCN读取失败问题求助
问题描述
注册Debezium 2.2-final版本的Kafka Connect Oracle连接器时,出现以下错误:
2023-05-05 18:14:33,308 INFO Oracle|server1|snapshot Already applied 1 database changes [io.debezium.relational.history.SchemaHistoryMetrics] 2023-05-05 18:14:33,358 INFO Oracle|server1|snapshot Snapshot step 7 - Snapshotting data [io.debezium.relational.RelationalSnapshotChangeEventSource] 2023-05-05 18:14:33,367 INFO Oracle|server1|snapshot Creating snapshot worker pool with 1 worker thread(s) [io.debezium.relational.RelationalSnapshotChangeEventSource] 2023-05-05 18:14:33,407 INFO Oracle|server1|snapshot For table 'ORCLPDB1.C##DBZUSER.TASKS' using select statement: 'SELECT "ID", "NAME" FROM "C##DBZUSER"."TASKS" AS OF SCN 3751208' ....
核心错误:
Caused by: org.apache.kafka.connect.errors.ConnectException: Failed reading SCN timestamp from source database
连接器配置如下:
{ "name": "task-connector", "config": { "connector.class": "io.debezium.connector.oracle.OracleConnector", "tasks.max": "1", "topic.prefix" : "server1", "database.hostname": "dbz_oracle21", "database.port": "1521", "database.user": "c##dbzuser", "database.password": "dbz", "database.dbname": "ORCLCDB", "database.pdb.name": "ORCLPDB1", "database.server.name": "server1", "table.include.list": "C##DBZUSER.TASKS", "database.history.kafka.bootstrap.servers": "kafka:9092", "database.history.kafka.topic": "schema-changes", "schema.history.internal.kafka.topic": "schema-changes.tasks", "schema.history.internal.kafka.bootstrap.servers": "kafka:9092" } }
解决方案
以下是几种可行的解决办法:
补充数据库用户权限
该错误通常是因为连接器用户缺少读取SCN时间戳相关系统视图的权限,需要给C##DBZUSER授予以下权限:GRANT SELECT ON V_$DATABASE TO C##DBZUSER; GRANT SELECT ON V_$SCN_TO_TIME TO C##DBZUSER; GRANT SELECT ON V_$THREAD TO C##DBZUSER; -- 如果使用闪回快照,还需要闪回权限 GRANT FLASHBACK ANY TABLE TO C##DBZUSER;注意:如果是CDB环境,需要先切换到对应的PDB(
ALTER SESSION SET CONTAINER=ORCLPDB1;)再执行授权语句。验证数据库闪回配置
Debezium的快照依赖Oracle闪回功能获取一致性数据,需确认目标PDB的闪回状态:- 切换到目标PDB:
ALTER SESSION SET CONTAINER=ORCLPDB1; - 查询闪回状态:
SELECT FLASHBACK_ON FROM V$DATABASE; - 如果结果为
NO,需先确保数据库处于归档模式(SELECT LOG_MODE FROM V$DATABASE;,若为NOARCHIVELOG需切换到归档模式),然后开启闪回:ALTER DATABASE FLASHBACK ON;
- 切换到目标PDB:
检查SCN有效性
日志中使用的SCN(3751208)可能已超出闪回日志的保留范围,可查询闪回保留时间:SELECT RETENTION_TARGET FROM V$FLASHBACK_DATABASE_LOG;若SCN对应的时间早于保留时间,可尝试:
- 调整闪回保留时间(
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=1440;,单位为分钟,示例设置为24小时) - 删除现有连接器的schema history topic,重新触发快照,让Debezium使用最新的有效SCN
- 调整闪回保留时间(
调整连接器快照配置
如果不需要强一致性快照,可尝试修改连接器配置,使用无闪回的快照模式:
在config中添加:"snapshot.mode": "initial", "oracle.snapshot.fetch.size": "1000"该配置会跳过AS OF SCN的查询,直接读取表数据,但可能无法保证快照的一致性,适合对一致性要求不高的场景。
内容的提问来源于stack exchange,提问作者BigD
相关产品推荐
相关产品推荐

