数据集成同步异常解决手册
一、数据源连接问题
1. MySQL相关问题
1.1 连接认证异常
错误信息:Read split MySqlBinlogSplit{splitId='binlog-split', ...} error due to Unable to connect to the MySQL database at 124.71.177.180:3306 with user 'root': unexpected sequence #1.
问题原因:
- 客户端数据库连接数不足
- 网络抖动导致连接不稳定
- 数据库负载过高
解决方案:
- 清理数据库中的空闲连接
- 扩充数据库的最大连接数限制
- 检查网络连接的稳定性,确保无丢包和高延迟
1.2 版本兼容问题
错误信息: Synchronizing error: Public Key Retrieval is not allowed
问题原因:
- Flink CDC与MySQL 8.0的认证方式不兼容
- sha256_password认证方式需要通过TLS或RSA公钥加密保护密码
解决方案:
-
更改MySQL用户的认证方式: ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES;
-
在my.ini文件中添加配置: [mysqld] default_authentication_plugin=mysql_native_password
1.3 主键索引问题
错误信息: Specified key was too long; max key length is 767 bytes
问题原因:
- MySQL 5.6中InnoDB存储引擎对索引长度限制为767字节
- utf8mb4字符集下varchar(255)会超出限制:
- utf8mb4每个字符占4字节
- varchar(255) * 4 = 1020字节 > 767字节限制
解决方案:
- 减少varchar字段长度:
- 将主键字段长度从255修改为191或更小
- 191 * 4 = 764字节 < 767字节限制
- 或更改字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
1.4 数据同步配置问题
错误信息: 开启同步任务后数据不同步
问题原因:
- binlog未开启
- binlog格式配置不正确
- binlog保留时间不足
解决方案:
-
检查并开启binlog: SHOW VARIABLES LIKE 'log_bin';
-
设置正确的binlog格式: SET GLOBAL binlog_format = 'ROW';
-
调整binlog保留时间: SET GLOBAL expire_logs_days = 7;
1.5 主从复制错误
错误信息: A slave with the same server_uuid/server_id as this slave has connected to the master
问题原因:
- 多个从库使用相同的server_uuid或server_id
- 主从同步配置冲突
- 复制连接未正常关闭
解决方案:
-
确保从库配置唯一性:
- 检查并修改server_id
- 验证server_uuid唯一性
-
重置复制状态: STOP SLAVE; RESET SLAVE; START SLAVE;
1.6 CDC数据解析错误
错误信息: Failed to deserialize data of EventHeaderV4
问题原因:
- CDC数据格式不兼容
- 数据解析过程中断
- 事务日志不完整
解决方案:
-
检查数据库配置: SET GLOBAL slave_net_timeout = 120; SET GLOBAL thread_pool_idle_timeout = 120;
-
确保事务日志完整性:
- 检查binlog是否完整
- 验证CDC追踪状态
1.7 时区配置不匹配
错误信息: ValidationException: The MySQL server has a timezone offset (0 seconds ahead of UTC) which does not match the configured timezone GMT+08:00.
问题原因:
- 数据库服务器时区设置与应用配置不一致
- 时区转换错误
- 默认时区配置问题
解决方案:
-
检查MySQL时区设置: SHOW VARIABLES LIKE '%time_zone%';
-
修改数据库时区: SET GLOBAL time_zone = '+8:00'; SET time_zone = '+8:00';
1.8 字符集编码问题
错误信息: java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x81' for column
问题原因:
- 数据库字符集不支持特殊字符
- 连接字符集配置不正确
- 表字段字符集与连接字符集不匹配
解决方案:
-
修改数据库字符集: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
修改表字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
1.9 内存使用过高
错误信息: The table 'xxx' is full
问题原因:
- temp_table_size 和 max_heap_table_size 设置过小
- 同步过程中产生大量临时表
- 系统内存不足
解决方案:
-
增加临时表空间: SET GLOBAL tmp_table_size = 67108864; SET GLOBAL max_heap_table_size = 67108864;
-
优化查询避免使用临时表
1.10 SSL连接握手异常
错误信息: HikariPool$PoolInitializationException: Failed to initialize pool: Communications link failure;javax.net.ssl.SSLHandshakeException: Remote host terminated the handshake;java.io.EOFException: SSL peer shut down incorrectly
问题原因:
- 客户端默认尝试以SSL方式连接MySQL,但与服务端SSL握手失败(常见于MySQL 5.7配合较新JDK,导致老版本TLS协议被禁用而协商失败)
- “测试连接”读取的是“其他连接串参数”,而Flink CDC任务运行时连接器自行拼接连接URL,不读取该参数,因此会出现“测试连接通过但任务启动后仍报SSL错误”的现象
- Flink CDC任务存在两条连接(快照阶段的JDBC连接池、增量阶段的Debezium binlog连接),需分别关闭SSL,否则快照阶段过了,增量阶段仍会报同样的错
解决方案:
-
确认服务端是否强制SSL(值为OFF时,关闭客户端SSL不会被服务端拒绝): SHOW VARIABLES LIKE 'require_secure_transport';
-
在“其他连接串参数”中追加,供测试连接使用(MySQL 5.x驱动用useSSL,8.x驱动用sslMode): useSSL=false 或 sslMode=DISABLED
-
在“其他连接器选项”中追加,供任务运行时使用。注意此处需用Flink CDC 选项格式,不能直接写useSSL: jdbc.properties.useSSL=false&debezium.database.ssl.mode=disabled 其中 jdbc.properties.useSSL 作用于快照阶段的JDBC连接池(即报HikariPool的那条连接),debezium.database.ssl.mode 作用于增量阶段的binlog连接
-
保存配置后,将任务停止并重新发布(必须重新发布,resume不会重新加载数据源配置),重启后SSL报错即消失
1.11 连接数打满Too many connections
错误信息: com.mysql.cj.jdbc.exceptions.SQLNonTransientConnectionException: Too many connections
问题原因:
- MySQL max_connections 上限较低,被业务连接 + 同步任务连接共同打满
- CDC 快照阶段并行度高,JDBC 连接池占用较多连接
- 存在大量空闲未释放连接
- 同一实例上运行多个同步任务,连接叠加
解决方案:
- 查看当前连接与上限: SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected';
- 适当上调上限(需 DBA 评估内存): SET GLOBAL max_connections = 500;
- 降低 CDC 快照并行度,或为同步任务设置合理的连接池上限
- 清理空闲连接,缩短 wait_timeout 回收僵尸连接
- 为同步任务创建独立账号并限制其最大连接数,避免影响业务
1.12 锁等待超时Lock wait timeout
错误信息: Lock wait timeout exceeded; try restarting transaction
问题原因:
- 快照阶段需要的元数据锁/表锁被其它长事务阻塞
- 源库存在长时间未提交事务持有锁
- 目标库写入与其它业务争抢行锁(写入侧也可能报此错)
- 大事务导致锁持有时间过长
解决方案:
- 定位阻塞源头: SELECT * FROM information_schema.INNODB_TRX; SELECT * FROM performance_schema.data_lock_waits; -- 8.0
- 提交或终止持锁的长事务
- 适当增大锁等待超时(治标): SET GLOBAL innodb_lock_wait_timeout = 120;
- CDC 建议使用支持无锁/弱锁快照的增量快照算法,避免长时间持表锁
- 避免在同步高峰期对相关表执行大事务或 DDL
1.13 数据包过大max_allowed_packet
错误信息: Packet for query is too large (xxx > yyy). You can change this value on the server by setting the 'max_allowed_packet' variable.
问题原因:
- 单行数据过大(大文本、BLOB),超过 max_allowed_packet
- 批量写入时单批 SQL 过大超过限制
- 源库或目标库 max_allowed_packet 配置过小
解决方案:
- 查看并调大(源库/目标库按需,两端都可能涉及): SHOW VARIABLES LIKE 'max_allowed_packet'; SET GLOBAL max_allowed_packet = 67108864; -- 64MB
- 减小批量写入的 batch size,避免单批过大
- 评估超大字段是否必须同步,可裁剪或单独处理
- 修改 GLOBAL 后需重新建立连接(重发任务)才生效
1.14 binlog格式非ROW导致解析异常
错误信息: 任务能连接但增量数据解析不全/报错,或日志提示 binlog 格式不为 ROW。
问题原因:
- binlog_format 设置为 STATEMENT 或 MIXED,CDC 无法可靠解析行级变更
- binlog_row_image 非 FULL,导致 UPDATE 前镜像/部分列缺失
- 仅改了会话级未改全局,或未重启使配置生效
解决方案:
- 检查并设置为 ROW 全镜像: SHOW VARIABLES LIKE 'binlog_format'; SHOW VARIABLES LIKE 'binlog_row_image'; SET GLOBAL binlog_format = 'ROW'; SET GLOBAL binlog_row_image = 'FULL';
- GLOBAL 修改仅对新连接生效,已有连接需重连;建议同时写入 my.cnf 持久化并择机重启
- 修改前已产生的 STATEMENT 格式 binlog 无法补救,需重新做全量同步
1.15 只读实例/从库无法读取binlog
错误信息: 连接只读副本(如云 RDS 只读实例)做 CDC 时无增量,或报无 binlog/权限不足。
问题原因:
- 连接的是只读实例,其 binlog 未开启或不对外提供订阅
- 云厂商只读实例默认不保留可订阅的 binlog
- 账号缺少 REPLICATION SLAVE / REPLICATION CLIENT 权限
解决方案:
- CDC 增量订阅应连接主实例(或专门用于订阅的实例),而非只读副本
- 确认实例已开启 binlog 且保留时间足够(见 1.4、2.3 位点相关)
- 授予订阅权限: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'sync_user'@'%';
- 云环境需在控制台确认实例支持 binlog 订阅并已开启
1.16 数值类型映射溢出(MEDIUMINT被映射为SMALLINT)
错误信息: Value out of range. Value:"40000" Radix:10(堆栈含 java.lang.Short.parseShort)
问题原因:
- 源端为 MySQL MEDIUMINT / MEDIUMINT UNSIGNED,在 Flink/JDBC DDL 或中间算子中被映射/CAST 成 SMALLINT,位宽不足(SMALLINT 最大 32767)
- 目标表列型过小,写入或反序列化时溢出
解决方案:
- 统一将该列在源表 DDL / 目标表 DDL 中声明为 INT(UNSIGNED 情况建议用 INT 或 BIGINT)
- 若目标库已建为 SMALLINT,执行: ALTER TABLE table_name MODIFY COLUMN column_name INT;
- 核对全链路(源表声明 → 中间映射 → 目标表)类型一致,避免被自动收窄
1.17 不支持的字段元数据类型field type 230
错误信息:
Unsupported table metadata field type 230;任务之前正常,后续频繁异常停止,TaskManager 日志中 Error during binlog processing,Last offset stored = {... file=mysql-bin.xxxxx, pos=xxxx ...}。
问题原因:
- 源端为 MySQL 8.0.x,binlog 是实例级的,CDC 会读取整个实例的 binlog
- 当前同步表本身结构正常,但同实例下其它库/表使用了 CDC 不支持的 MySQL 8.0 新特性,污染了 binlog 解析,典型如:
- JSON 多值索引(multi-valued index),例如对 json_extract 结果建 cast(... as char(255) array) 的 KEY
- 虚拟/存储生成列(GENERATED ALWAYS AS ... STORED)引用 JSON 函数
- 这些特性产生的 binlog 元数据字段类型(如 230)当前连接器无法解析,导致整条 binlog 流处理中断
排查方法:
- 根据报错中的 file 与 pos 定位对应的 mysql-bin.xxxxx 文件,下载后用 binlog 解析工具分析出问题事件归属的表
- 重点排查同实例下使用了 JSON 多值索引、JSON 生成列的表(不一定是当前同步表)
解决方案:
- 去掉触发问题的不支持索引/隐藏(生成)字段,或将相关表迁出该实例
- 改用支持该特性的采集方案(如 hdp 链路支持)
- 上线 MySQL 8.0 新特性前,评估其对实例级 binlog 采集的兼容性影响
1.18 零值日期Zero date value prohibited
错误信息: Zero date value prohibited; nested exception is java.sql.SQLException: Zero date value prohibited(mysql 作为源预览源表数据时报错)
问题原因:
- 源表存在 '0000-00-00' / '0000-00-00 00:00:00' 等零值日期
- 较新 JDBC 驱动默认禁止读取零值日期,直接抛异常
解决方案:
- 在数据源"其他连接串参数"中填写(供测试连接/预览使用): zeroDateTimeBehavior=convertToNull
- 在"其他连接器选项"中填写(供任务运行时使用,需 Flink CDC 选项格式): jdbc.properties.zeroDateTimeBehavior=convertToNull
- 保存后停止并重新发布任务使配置生效(resume 不会重新加载数据源配置)
1.19 连接池超时与单账号同步任务数上限
错误信息: java.sql.SQLTransientConnectionException: HikariPool-x - Connection is not available, request timed out after 10000ms
问题原因:
- MySQL 连接数接近上限,连接池拿不到可用连接(同一账号其它任务正常,但新建任务连接失败是典型特征)
- 实测同一个 MySQL 账号创建的同步任务数存在上限(本地 MySQL 与阿里云 RDS 实测约为 20 个/账号),超过后新任务连接报此错。该限制源自 MySQL 自身机制,并非数据集成限制,且暂未找到可解除该限制的官方参数说明
排查方法:
- 登录 MySQL 查看连接与上限: SHOW PROCESSLIST; SHOW VARIABLES LIKE 'max_connections';
- 若连接数接近上限,瓶颈在 MySQL 连接数(见 1.11)
- 若 max_connections 充足但仍报错,多为单账号同步任务数已达上限(旧任务正常、新任务全部连接失败)
解决方案:
- 连接数不足:适当调大 max_connections(如 150 → 500)
- 单账号任务数达上限:另建新的 MySQL 账号,用新账号创建后续同步任务
- 规划账号分配:按业务/任务批次拆分多个采集账号,单账号承载的任务数控制在上限以内
2. Oracle相关问题
2.1 监听连接异常
错误信息: ORA-12516, TNS:listener could not find available handler with matching protocol stack
问题原因:
- 数据库连接池中的并发连接数超过了监听程序的处理能力
- 服务器资源不足(CPU、内存、磁盘空间等)
- 网络连接不稳定
解决方案:
- 检查并调整数据库连接池配置,增加最大并发连接数
- 确保服务器资源充足:
- 检查CPU使用率
- 增加内存分配
- 确保磁盘空间充足
- 检查网络连接的稳定性,确保无丢包和高延迟
2.2 CDC字段解析错误
错误信息: DataException: file is not a valid field name
问题原因:
- Oracle CDC 3.0及以下版本在处理某些特殊字段时存在bug
- 字段命名不规范导致解析失败
解决方案:
- 检查表结构,避免使用Oracle保留关键字作为字段名
- 参考Issue:https://github.com/apache/flink-cdc/pull/2315
2.3 表主键识别问题
错误信息: Oracle数据库表存在主键,但系统提示找不到主键
问题原因:
- 数据库账户缺少读取schema的权限
- 主键定义不规范
解决方案:
-
授予用户以下权限: GRANT SELECT ON ALL_CONSTRAINTS TO username; GRANT SELECT ON ALL_CONS_COLUMNS TO username; GRANT SELECT ON ALL_TAB_COLUMNS TO username;
-
检查主键定义: SELECT constraint_name, constraint_type, table_name FROM user_constraints WHERE table_name = 'YOUR_TABLE';
2.4 表空间不足
错误信息: ORA-01653: unable to extend table xxx by xxx in tablespace xxx
问题原因:
- 表空间空间不足
- 数据文件无法自动扩展
- 磁盘空间不足
解决方案:
-
检查表空间使用情况: SELECT tablespace_name, bytes/1024/1024 MB, maxbytes/1024/1024 MAX_MB, user_bytes/1024/1024 USED_MB FROM dba_data_files;
-
增加数据文件: ALTER TABLESPACE tablespace_name ADD DATAFILE 'path/filename.dbf' SIZE 100M AUTOEXTEND ON NEXT 10M;
2.5 归档日志空间不足
错误信息: ORA-00257: archiver error. Connect internal only, until freed
问题原因:
- 归档目的地空间不足
- 归档日志未及时清理
- 归档产生速度过快
解决方案:
-
检查归档日志使用情况: SELECT * FROM v$flash_recovery_area_usage;
-
清理归档日志: RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
2.6 Oracle监听器服务名识别错误
错误信息: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
问题原因:
- 连接字符串中的服务名(SERVICE_NAME)或SID不正确
- Oracle数据库实例未运行*
- Oracle监听器未正常启动或配置有误*
- 监听器尚未注册请求的服务*
- TNS配置不正确*
2.7 监听器拒绝连接
错误信息: Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor (CONNECTION_ID=Fy668w9sSS+ZXlTWboSNzA==)
问题原因:
- 监听器未正确配置请求的服务名。
- 数据库实例未注册到监听器。
- 连接描述符中的服务名拼写错误或不存在。
- 监听器未启动或配置错误。
解决方案:
-
检查监听器配置: 确保
listener.ora文件中的服务名配置正确,并且与数据库实例的服务名一致。 -
检查数据库实例注册: 确认数据库实例已成功注册到监听器。可以通过以下命令检查:
SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
-
如果实例未注册,尝试手动注册:
ALTER SYSTEM REGISTER;
-
检查连接描述符: 确保连接字符串中的服务名正确无误,并且与数据库实例的服务名一致。
2.8 Oracle增量数据不同步问题
错误信息:Flink Oracle CDC增量数据同步不完整、漏数据或完全无法捕获数据变更。
问题原因:
- 数据库级别未启用最小补充日志。
- 表级别未配置适当的补充日志。
- 启用了补充日志,但配置类型不正确(如只配置了主键日志,但需要全列日志)。
- 对象所有者(Schema)与补充日志配置的所有者不匹配。
- CDC用户没有足够的权限查看日志内容。
- 归档日志被过早清理,导致CDC无法读取变更记录。
- 查询是否未提交事物,部分数据库客户端工具不会自动提交事物。
解决方案:
-
检查数据库级别补充日志配置:
SELECT SUPPLEMENTAL_LOG_DATA_MIN as "最小补充日志",
SUPPLEMENTAL_LOG_DATA_PK as "主键补充日志",
SUPPLEMENTAL_LOG_DATA_ALL as "全列补充日志" FROM V$DATABASE; 确保至少启用了最小补充日志(SUPPLEMENTAL_LOG_DATA_MIN = 'YES')。如果未启用,执行: ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -
检查表级别补充日志配置:
-- 检查特定表的补充日志配置 SELECT LOG_GROUP_NAME as "日志组名称", LOG_GROUP_TYPE as "日志组类型" FROM DBA_LOG_GROUPS WHERE OWNER = '表所有者' AND TABLE_NAME = '表名'; 根据CDC同步需求,为表添加适当的补充日志: -- 为表添加主键补充日志 ALTER TABLE 表所有者.表名 ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
-- 如果表没有主键,但有唯一键 ALTER TABLE 表所有者.表名 ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
-- 如果需要捕获所有列的变更 ALTER TABLE 表所有者.表名 ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
-
检查并修正对象所有者不匹配问题:
-- 检查实际表所有者和表名的大小写 SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE UPPER(TABLE_NAME) = UPPER('表名');
-
验证CDC用户权限:确保CDC用户有足够的权限读取补充日志:
-- 检查用户权限 SELECT * FROM SESSION_PRIVS;
-- 授予访问日志和数据字典的权限 GRANT SELECT ON SYS.V_$DATABASE TO cdc用户; GRANT SELECT ON SYS.V_$ARCHIVED_LOG TO cdc用户; GRANT SELECT ON SYS.V_$LOGMNR_CONTENTS TO cdc用户; GRANT SELECT_CATALOG_ROLE TO cdc用户;
注意事项:
- 启用全列补充日志会显著增加重做日志的大小,可能影响数据库性能。在高事务量环境中,应谨慎权衡并选择最小必要的补充日志级别。
- 补充日志配置更改不会影响已生成的归档日志。如果需要对历史数据进行CDC同步,必须在产生这些变更前就 配置好补充日志。
- 在RAC环境中,确保补充日志配置对所有实例都有效。
- 注意表结构变更对CDC的影响,特别是主键或唯一键的变更可能需要同步调整补充日志配置。
2.9 存储过程使用TRUNCATE无法触发CDC同步
错误信息:错误:1292,Position:0,Sql-BEGIN sys.dbms logmnr.startlogmnr(startScn =>'1027988E04068',endscn=>'102798824067',OPTIONS=> DBMS_LOGMNR.DICT FROM_ONLIN ECATALOG+ DBMS LOGMN R.CONTINUOUS MINE+ DB MSLOGMNR.NO ROWID IN STMT):END:,OriginalSql=B EGINsys.dbms logmnr.start logmnr(startScn=>'10279880 4068',endScn=>'102798824 067',OPTIONS=> DBMS LO GMNR.DICT FROM ONLINE CATALOG+DBMS LOGMNR。 CONTINUOUS MINE+ DBMS LOGMNR.NO ROWID IN ST MT);END;,错误消息=ORA-0 1292 当前 LogMiner 会话没有特定的日志文件
问题原因:
TRUNCATE TABLE属于 DDL 操作,不属于标准的 DML(如DELETE)。- Oracle 的 LogMiner 和大部分 CDC 采集工具仅能捕获 DML 变更(
INSERT、UPDATE、DELETE),无法捕获TRUNCATE。 - 由于
TRUNCATE不会写入可供 CDC 采集的 REDO 日志,导致下游同步链路无法感知该操作。
解决方案:
- 禁止在需要 CDC 同步的表上使用
TRUNCATE TABLE操作。 - 改用
DELETE FROM table; COMMIT;语句清空表数据,确保该操作会写入 REDO 日志,CDC 能正常采集并同步 delete 事件到下游。 - 对已出现数据不一致的下游表,可手动执行清空操作后,重新全量同步一次数据,保证一致性。
2.10 归档日志未设置为全列导致同步字段为NULL
问题描述:
在 Flink Oracle CDC 同步任务中,如果 Oracle 归档日志(LogMiner)参数未设置为全列模式,而是仅保留主键或者部分字段,则下游表(如 MySQL、Kafka 等)同步时,只有主键字段有实际值,其余字段为 NULL。问题原因:
- Oracle 归档日志的 LogMiner 组件支持配置抓取的列范围,如仅主键、部分字段或全字段。
- 若归档日志未设置为全列模式,则 redo log 仅记录被配置的字段数据,未配置的字段不会写入日志。
- Flink CDC 在解析 redo/归档日志时,只能提取日志中实际存在的字段,未写入日志的字段在下游表中表现为
NULL。 - 这种情况即使 Flink 表结构声明了所有字段,未被归档日志采集的字段依旧无法同步真实值。
解决方案:
- 确保 Oracle 归档日志(LogMiner)设置为全列(Full Column)模式,即所有需要同步的字段都被记录到日志。
- 配置全列同步后,重启 Flink CDC 任务,确保所有 数据变更都能被完整采集。
- 对已经出现字段为
NULL的下游表,需在修正归档日志配置后,重新进行全量同步,以修复历史数据缺失。
2.11 快照过旧ORA-01555
错误信息: ORA-01555: snapshot too old: rollback segment number xxx with name "xxx" too small
问题原因:
- 全量快照查询时间过长,期间源表数据持续变更,UNDO 表空间无法保留足够的读一致性版本
- UNDO_RETENTION 设置过小或 UNDO 表空间不足
- 大表快照 + 高并发写入叠加
解决方案:
- 增大 UNDO 保留与表空间(需 DBA): ALTER SYSTEM SET UNDO_RETENTION = 7200; -- 必要时扩大 UNDO 表空间或开启 AUTOEXTEND
- 调小 chunk size 缩短单次查询时长(见 Flink 章节 2.1)
- 尽量在源库低峰期执行全量快照
- 评估是否可跳过全量、仅做增量(确认不需要存量)
2.12 表或视图不存在ORA-00942
错误信息: ORA-00942: table or view does not exist
问题原因:
- CDC 账号对目标表无 SELECT 权限(Oracle 区分 schema,跨 schema 需显式授权)
- 表名/owner 大小写不匹配(Oracle 默认大写,带引号的小写名需精确匹配)
- 配置的 schema-name / table 与实际不符
- 缺少访问数据字典或 LogMiner 相关视图的权限
解决方案:
- 授予表与字典权限: GRANT SELECT ON owner.table_name TO cdc_user; GRANT SELECT_CATALOG_ROLE TO cdc_user;
- 核对实际 owner 与表名大小写: SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE UPPER(TABLE_NAME)=UPPER('表名');
- 配置中 schema/表名按数据库实际大小写填写
- 确认 LogMiner 所需 V$ 视图权限齐全(见 2.8)
2.13 PDB容器/多租户连接问题
错误信息: 连接 Oracle 12c+ 多租户实例时报无法找到服务/找不到表,或 LogMiner 无法读取 CDB 重做日志。
问题原因:
- 连接串误连到 CDB$ROOT 而非业务 PDB(或相反)
- CDC 用户需为 common user(C##前缀)才能跨容器访问重做日志
- PDB 与 CDB 的服务名/权限边界配置不当
解决方案:
- 业务数据连接对应 PDB 的服务名;LogMiner 读取重做日志需有 CDB 级权限
- 创建具备跨容器权限的 common 用户(C##前缀)并授予 LOGMINING、SELECT ANY TRANSACTION 等
- 确认 enable_goldengate_replication / 补充日志在容器层面正确开启
- 多租户环境配置较复杂,必要时联系 DBA 协助规划用户与权限
2.14 共享池内存不足ORA-04031
错误信息: ORA-04031: unable to allocate xxx bytes of shared memory ("shared pool",...)
问题原因:
- LogMiner 持续运行消耗共享池内存,叠加业务负载导致 SGA 共享池不足
- SGA/共享池规格偏小
- 硬解析过多、内存碎片化
解决方案:
- 检查并适当增大共享池/SGA(需 DBA): ALTER SYSTEM SET SHARED_POOL_SIZE = '512M';
- 评估 LogMiner 挖掘频率与范围,避免长时间持续高强度挖掘
- 优化业务侧硬解析,使用绑定变量
- 内存类参数调整通常需 DBA 评估实例整体规划
2.15 跨Schema同名表导致多主键无法同步
错误信息: 选择 Oracle 数据表时提示"该表有多个主键,暂时不支持同步"。
问题原因:
- 同一实例下多个不同 schema(owner)存在同名表,且各自都定义了主键
- 识别主键时通过 ALL_CONSTRAINTS / ALL_CONS_COLUMNS 查询,若未严格限定 owner,会把多个 schema 的同名表主键都查出来,表现为"多个主键"
- 常见于历史迁移场景(如 EKP、EKP1、EKPTEST 三个 schema 下都有 SYS_ORG_ELEMENT 且都有主键)
排查方法:
- 用以下 SQL 确认是否多个 owner 下存在同名表主键: SELECT owner, constraint_name, constraint_type, table_name FROM all_constraints WHERE table_name = 'SYS_ORG_ELEMENT' AND constraint_type = 'P';
- 若返回多行且 owner 不同,即为本问题
解决方案:
- 理想做法是限定 owner 只识别目标 schema 的主键;但若同步账号有权限访问多个同名表的 schema,限定 owner 仍可能不生效
- 客户线上业务无法调整 schema/表结构时,该表暂无法通过标准方式同步,需改用其它同步方式
- 规划上建议避免多 schema 同名表 + 同名主键并存;新建采集账号时尽量只授予目标 schema 的访问权限,减少同名表干扰
2.16 Oracle11g(11.2.0.4)PGA内存溢出已知bug
问题描述: 源端为 Oracle 11g(具体 11.2.0.4.0),同步运行中出现内存溢出(out of memory)。
问题原因:
- 该 Oracle 版本存在已知 bug:在 PGA 内存配置较小的情况下会出现内存溢出
- 属数据库版本自身缺陷,非采集链路问题
解决方案:
- 适当调大 PGA 相关内存(如 PGA_AGGREGATE_TARGET),规避该 bug 的触发条件(需 DBA 评估)
- 参考 Oracle 官方说明(Doc/Bug 1934141.1 及社区讨论)评估打补丁或升级小版本
- 若条件允许 ,升级到不受该 bug 影响的版本
3. SQLServer相关问题
3.1 SSL连接失败
错误信息: The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed"
问题原因:
- SQL Server驱动试图建立SSL加密连接失败
- 证书验证路径构建失败-
- 默认情况下驱动会尝试使用SSL加密连接
解决方案:
-
在数据源配置中添加参数:
- encrypt=false
- trustServerCertificate=true
-
或配置正确的证书:
- 导入SQL Server的SSL证书
- 确保证书链完整
3.2 CDC同步异常
错误信息: SQLServer数据库及表已启用CDC,但创建同步任务后无增量数据同步
问题原因:
- 数据库恢复模式被修改为简单模式
- CDC功能需要数据库处于完整恢复模式才能正常工作
- CDC代理作业未运行
解决方案:
-
检查并修改数据库恢复模式: ALTER DATABASE YourDatabase SET RECOVERY FULL;
-
验证CDC是否正常: SELECT name, is_cdc_enabled FROM sys.databases WHERE database_id = DB_ID();
SELECT name, is_tracked_by_cdc FROM sys.tables WHERE object_id = OBJECT_ID('YourTable');
- 检查CDC代理作业: EXEC sys.sp_cdc_help_jobs;
3.3 事务日志满
错误信息: Could not allocate space for object in database 'xxx' because the 'PRIMARY' filegroup is full
问题原因:
- 事务日志空间不足
- 事务日志未及时备份
- 大事务导致日志增长过快
解决方案:
-
检查日志空间: DBCC SQLPERF(LOGSPACE);
-
收缩日志文件: BACKUP LOG DatabaseName WITH TRUNCATE_ONLY; DBCC SHRINKFILE(LogFileName);
3.4 死锁问题
错误信息: Transaction (Process ID xx) was deadlocked on lock resources with another process and has been chosen as the deadlock victim
问题原因:
- 并发事务互相等待资源
- 事务执行时间过长
- 锁升级导致死锁
解决方案:
-
查看死锁信息: SELECT * FROM sys.dm_tran_locks;