HDP 异常排查手册
一、数据源连接问题
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;
-
优化查询避免使用临时表
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保留关键字作为字段名
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
问题描述