跳至主要内容

数据集成同步异常解决手册

一、数据源连接问题​

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. 网络抖动导致连接不稳定
  3. 数据库负载过高

解决方案:

  1. 清理数据库中的空闲连接
  2. 扩充数据库的最大连接数限制
  3. 检查网络连接的稳定性,确保无丢包和高延迟
1.2 版本兼容问题​

错误信息: Synchronizing error: Public Key Retrieval is not allowed

问题原因:

  1. Flink CDC与MySQL 8.0的认证方式不兼容
  2. sha256_password认证方式需要通过TLS或RSA公钥加密保护密码

解决方案:

  1. 更改MySQL用户的认证方式: ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; FLUSH PRIVILEGES;

  2. 在my.ini文件中添加配置: [mysqld] default_authentication_plugin=mysql_native_password

1.3 主键索引问题​

错误信息: Specified key was too long; max key length is 767 bytes

问题原因:

  1. MySQL 5.6中InnoDB存储引擎对索引长度限制为767字节
  2. utf8mb4字符集下varchar(255)会超出限制:
    • utf8mb4每个字符占4字节
    • varchar(255) * 4 = 1020字节 > 767字节限制

解决方案:

  1. 减少varchar字段长度:
    • 将主键字段长度从255修改为191或更小
    • 191 * 4 = 764字节 < 767字节限制
  2. 或更改字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
1.4 数据同步配置问题​

错误信息: 开启同步任务后数据不同步

问题原因:

  1. binlog未开启
  2. binlog格式配置不正确
  3. binlog保留时间不足

解决方案:

  1. 检查并开启binlog: SHOW VARIABLES LIKE 'log_bin';

  2. 设置正确的binlog格式: SET GLOBAL binlog_format = 'ROW';

  3. 调整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

问题原因:

  1. 多个从库使用相同的server_uuid或server_id
  2. 主从同步配置冲突
  3. 复制连接未正常关闭

解决方案:

  1. 确保从库配置唯一性:

    • 检查并修改server_id
    • 验证server_uuid唯一性
  2. 重置复制状态: STOP SLAVE; RESET SLAVE; START SLAVE;

1.6 CDC数据解析错误​

错误信息: Failed to deserialize data of EventHeaderV4

问题原因:

  1. CDC数据格式不兼容
  2. 数据解析过程中断
  3. 事务日志不完整

解决方案:

  1. 检查数据库配置: SET GLOBAL slave_net_timeout = 120; SET GLOBAL thread_pool_idle_timeout = 120;

  2. 确保事务日志完整性:

    • 检查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.

问题原因:

  1. 数据库服务器时区设置与应用配置不一致
  2. 时区转换错误
  3. 默认时区配置问题

解决方案:

  1. 检查MySQL时区设置: SHOW VARIABLES LIKE '%time_zone%';

  2. 修改数据库时区: 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

问题原因:

  1. 数据库字符集不支持特殊字符
  2. 连接字符集配置不正确
  3. 表字段字符集与连接字符集不匹配

解决方案:

  1. 修改数据库字符集: ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

  2. 修改表字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

1.9 内存使用过高​

错误信息: The table 'xxx' is full

问题原因:

  1. temp_table_size 和 max_heap_table_size 设置过小
  2. 同步过程中产生大量临时表
  3. 系统内存不足

解决方案:

  1. 增加临时表空间: SET GLOBAL tmp_table_size = 67108864; SET GLOBAL max_heap_table_size = 67108864;

  2. 优化查询避免使用临时表

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

问题原因:

  1. 客户端默认尝试以SSL方式连接MySQL,但与服务端SSL握手失败(常见于MySQL 5.7配合较新JDK,导致老版本TLS协议被禁用而协商失败)
  2. “测试连接”读取的是“其他连接串参数”,而Flink CDC任务运行时连接器自行拼接连接URL,不读取该参数,因此会出现“测试连接通过但任务启动后仍报SSL错误”的现象
  3. Flink CDC任务存在两条连接(快照阶段的JDBC连接池、增量阶段的Debezium binlog连接),需分别关闭SSL,否则快照阶段过了,增量阶段仍会报同样的错

解决方案:

  1. 确认服务端是否强制SSL(值为OFF时,关闭客户端SSL不会被服务端拒绝): SHOW VARIABLES LIKE 'require_secure_transport';

  2. 在“其他连接串参数”中追加,供测试连接使用(MySQL 5.x驱动用useSSL,8.x驱动用sslMode): useSSL=false 或 sslMode=DISABLED

  3. 在“其他连接器选项”中追加,供任务运行时使用。注意此处需用Flink CDC选项格式,不能直接写useSSL: jdbc.properties.useSSL=false&debezium.database.ssl.mode=disabled 其中 jdbc.properties.useSSL 作用于快照阶段的JDBC连接池(即报HikariPool的那条连接),debezium.database.ssl.mode 作用于增量阶段的binlog连接

  4. 保存配置后,将任务停止并重新发布(必须重新发布,resume不会重新加载数据源配置),重启后SSL报错即消失

1.11 连接数打满Too many connections​

错误信息: com.mysql.cj.jdbc.exceptions.SQLNonTransientConnectionException: Too many connections

问题原因:

  1. MySQL max_connections 上限较低,被业务连接 + 同步任务连接共同打满
  2. CDC 快照阶段并行度高,JDBC 连接池占用较多连接
  3. 存在大量空闲未释放连接
  4. 同一实例上运行多个同步任务,连接叠加

解决方案:

  1. 查看当前连接与上限: SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected';
  2. 适当上调上限(需 DBA 评估内存): SET GLOBAL max_connections = 500;
  3. 降低 CDC 快照并行度,或为同步任务设置合理的连接池上限
  4. 清理空闲连接,缩短 wait_timeout 回收僵尸连接
  5. 为同步任务创建独立账号并限制其最大连接数,避免影响业务
1.12 锁等待超时Lock wait timeout​

错误信息: Lock wait timeout exceeded; try restarting transaction

问题原因:

  1. 快照阶段需要的元数据锁/表锁被其它长事务阻塞
  2. 源库存在长时间未提交事务持有锁
  3. 目标库写入与其它业务争抢行锁(写入侧也可能报此错)
  4. 大事务导致锁持有时间过长

解决方案:

  1. 定位阻塞源头: SELECT * FROM information_schema.INNODB_TRX; SELECT * FROM performance_schema.data_lock_waits; -- 8.0
  2. 提交或终止持锁的长事务
  3. 适当增大锁等待超时(治标): SET GLOBAL innodb_lock_wait_timeout = 120;
  4. CDC 建议使用支持无锁/弱锁快照的增量快照算法,避免长时间持表锁
  5. 避免在同步高峰期对相关表执行大事务或 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.

问题原因:

  1. 单行数据过大(大文本、BLOB),超过 max_allowed_packet
  2. 批量写入时单批 SQL 过大超过限制
  3. 源库或目标库 max_allowed_packet 配置过小

解决方案:

  1. 查看并调大(源库/目标库按需,两端都可能涉及): SHOW VARIABLES LIKE 'max_allowed_packet'; SET GLOBAL max_allowed_packet = 67108864; -- 64MB
  2. 减小批量写入的 batch size,避免单批过大
  3. 评估超大字段是否必须同步,可裁剪或单独处理
  4. 修改 GLOBAL 后需重新建立连接(重发任务)才生效
1.14 binlog格式非ROW导致解析异常​

错误信息: 任务能连接但增量数据解析不全/报错,或日志提示 binlog 格式不为 ROW。

问题原因:

  1. binlog_format 设置为 STATEMENT 或 MIXED,CDC 无法可靠解析行级变更
  2. binlog_row_image 非 FULL,导致 UPDATE 前镜像/部分列缺失
  3. 仅改了会话级未改全局,或未重启使配置生效

解决方案:

  1. 检查并设置为 ROW 全镜像: SHOW VARIABLES LIKE 'binlog_format'; SHOW VARIABLES LIKE 'binlog_row_image'; SET GLOBAL binlog_format = 'ROW'; SET GLOBAL binlog_row_image = 'FULL';
  2. GLOBAL 修改仅对新连接生效,已有连接需重连;建议同时写入 my.cnf 持久化并择机重启
  3. 修改前已产生的 STATEMENT 格式 binlog 无法补救,需重新做全量同步
1.15 只读实例/从库无法读取binlog​

错误信息: 连接只读副本(如云 RDS 只读实例)做 CDC 时无增量,或报无 binlog/权限不足。

问题原因:

  1. 连接的是只读实例,其 binlog 未开启或不对外提供订阅
  2. 云厂商只读实例默认不保留可订阅的 binlog
  3. 账号缺少 REPLICATION SLAVE / REPLICATION CLIENT 权限

解决方案:

  1. CDC 增量订阅应连接主实例(或专门用于订阅的实例),而非只读副本
  2. 确认实例已开启 binlog 且保留时间足够(见 1.4、2.3 位点相关)
  3. 授予订阅权限: GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'sync_user'@'%';
  4. 云环境需在控制台确认实例支持 binlog 订阅并已开启
1.16 数值类型映射溢出(MEDIUMINT被映射为SMALLINT)​

错误信息: Value out of range. Value:"40000" Radix:10(堆栈含 java.lang.Short.parseShort)

问题原因:

  1. 源端为 MySQL MEDIUMINT / MEDIUMINT UNSIGNED,在 Flink/JDBC DDL 或中间算子中被映射/CAST 成 SMALLINT,位宽不足(SMALLINT 最大 32767)
  2. 目标表列型过小,写入或反序列化时溢出

解决方案:

  1. 统一将该列在源表 DDL / 目标表 DDL 中声明为 INT(UNSIGNED 情况建议用 INT 或 BIGINT)
  2. 若目标库已建为 SMALLINT,执行: ALTER TABLE table_name MODIFY COLUMN column_name INT;
  3. 核对全链路(源表声明 → 中间映射 → 目标表)类型一致,避免被自动收窄
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 ...}。

问题原因:

  1. 源端为 MySQL 8.0.x,binlog 是实例级的,CDC 会读取整个实例的 binlog
  2. 当前同步表本身结构正常,但同实例下其它库/表使用了 CDC 不支持的 MySQL 8.0 新特性,污染了 binlog 解析,典型如:
    • JSON 多值索引(multi-valued index),例如对 json_extract 结果建 cast(... as char(255) array) 的 KEY
    • 虚拟/存储生成列(GENERATED ALWAYS AS ... STORED)引用 JSON 函数
  3. 这些特性产生的 binlog 元数据字段类型(如 230)当前连接器无法解析,导致整条 binlog 流处理中断

排查方法:

  1. 根据报错中的 file 与 pos 定位对应的 mysql-bin.xxxxx 文件,下载后用 binlog 解析工具分析出问题事件归属的表
  2. 重点排查同实例下使用了 JSON 多值索引、JSON 生成列的表(不一定是当前同步表)

解决方案:

  1. 去掉触发问题的不支持索引/隐藏(生成)字段,或将相关表迁出该实例
  2. 改用支持该特性的采集方案(如 hdp 链路支持)
  3. 上线 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 作为源预览源表数据时报错)

问题原因:

  1. 源表存在 '0000-00-00' / '0000-00-00 00:00:00' 等零值日期
  2. 较新 JDBC 驱动默认禁止读取零值日期,直接抛异常

解决方案:

  1. 在数据源"其他连接串参数"中填写(供测试连接/预览使用): zeroDateTimeBehavior=convertToNull
  2. 在"其他连接器选项"中填写(供任务运行时使用,需 Flink CDC 选项格式): jdbc.properties.zeroDateTimeBehavior=convertToNull
  3. 保存后停止并重新发布任务使配置生效(resume 不会重新加载数据源配置)
1.19 连接池超时与单账号同步任务数上限​

错误信息: java.sql.SQLTransientConnectionException: HikariPool-x - Connection is not available, request timed out after 10000ms

问题原因:

  1. MySQL 连接数接近上限,连接池拿不到可用连接(同一账号其它任务正常,但新建任务连接失败是典型特征)
  2. 实测同一个 MySQL 账号创建的同步任务数存在上限(本地 MySQL 与阿里云 RDS 实测约为 20 个/账号),超过后新任务连接报此错。该限制源自 MySQL 自身机制,并非数据集成限制,且暂未找到可解除该限制的官方参数说明

排查方法:

  1. 登录 MySQL 查看连接与上限: SHOW PROCESSLIST; SHOW VARIABLES LIKE 'max_connections';
  2. 若连接数接近上限,瓶颈在 MySQL 连接数(见 1.11)
  3. 若 max_connections 充足但仍报错,多为单账号同步任务数已达上限(旧任务正常、新任务全部连接失败)

解决方案:

  1. 连接数不足:适当调大 max_connections(如 150 → 500)
  2. 单账号任务数达上限:另建新的 MySQL 账号,用新账号创建后续同步任务
  3. 规划账号分配:按业务/任务批次拆分多个采集账号,单账号承载的任务数控制在上限以内

2. Oracle相关问题​

2.1 监听连接异常​

错误信息: ORA-12516, TNS:listener could not find available handler with matching protocol stack

问题原因:

  1. 数据库连接池中的并发连接数超过了监听程序的处理能力
  2. 服务器资源不足(CPU、内存、磁盘空间等)
  3. 网络连接不稳定

解决方案:

  1. 检查并调整数据库连接池配置,增加最大并发连接数
  2. 确保服务器资源充足:
    • 检查CPU使用率
    • 增加内存分配
    • 确保磁盘空间充足
  3. 检查网络连接的稳定性,确保无丢包和高延迟
2.2 CDC字段解析错误​

错误信息: DataException: file is not a valid field name

问题原因:

  1. Oracle CDC 3.0及以下版本在处理某些特殊字段时存在bug
  2. 字段命名不规范导致解析失败

解决方案:

  1. 检查表结构,避免使用Oracle保留关键字作为字段名
  2. 参考Issue:https://github.com/apache/flink-cdc/pull/2315
2.3 表主键识别问题​

错误信息: Oracle数据库表存在主键,但系统提示找不到主键

问题原因:

  1. 数据库账户缺少读取schema的权限
  2. 主键定义不规范

解决方案:

  1. 授予用户以下权限: GRANT SELECT ON ALL_CONSTRAINTS TO username; GRANT SELECT ON ALL_CONS_COLUMNS TO username; GRANT SELECT ON ALL_TAB_COLUMNS TO username;

  2. 检查主键定义: 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

问题原因:

  1. 表空间空间不足
  2. 数据文件无法自动扩展
  3. 磁盘空间不足

解决方案:

  1. 检查表空间使用情况: SELECT tablespace_name, bytes/1024/1024 MB, maxbytes/1024/1024 MAX_MB, user_bytes/1024/1024 USED_MB FROM dba_data_files;

  2. 增加数据文件: 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

问题原因:

  1. 归档目的地空间不足
  2. 归档日志未及时清理
  3. 归档产生速度过快

解决方案:

  1. 检查归档日志使用情况: SELECT * FROM v$flash_recovery_area_usage;

  2. 清理归档日志: 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

问题原因:

  1. 连接字符串中的服务名(SERVICE_NAME)或SID不正确
  2. Oracle数据库实例未运行*
  3. Oracle监听器未正常启动或配置有误*
  4. 监听器尚未注册请求的服务*
  5. 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==)

问题原因:

  1. 监听器未正确配置请求的服务名。
  2. 数据库实例未注册到监听器。
  3. 连接描述符中的服务名拼写错误或不存在。
  4. 监听器未启动或配置错误。

解决方案:

  1. 检查监听器配置: 确保 listener.ora 文件中的服务名配置正确,并且与数据库实例的服务名一致。

  2. 检查数据库实例注册: 确认数据库实例已成功注册到监听器。可以通过以下命令检查:

    SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;

  3. 如果实例未注册,尝试手动注册:

    ALTER SYSTEM REGISTER;

  4. 检查连接描述符: 确保连接字符串中的服务名正确无误,并且与数据库实例的服务名一致。

2.8 Oracle增量数据不同步问题​

错误信息:Flink Oracle CDC增量数据同步不完整、漏数据或完全无法捕获数据变更。

问题原因:

  1. 数据库级别未启用最小补充日志。
  2. 表级别未配置适当的补充日志。
  3. 启用了补充日志,但配置类型不正确(如只配置了主键日志,但需要全列日志)。
  4. 对象所有者(Schema)与补充日志配置的所有者不匹配。
  5. CDC用户没有足够的权限查看日志内容。
  6. 归档日志被过早清理,导致CDC无法读取变更记录。
  7. 查询是否未提交事物,部分数据库客户端工具不会自动提交事物。

解决方案:

  1. 检查数据库级别补充日志配置:

    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;

  2. 检查表级别补充日志配置:

    -- 检查特定表的补充日志配置 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;

  3. 检查并修正对象所有者不匹配问题:

    -- 检查实际表所有者和表名的大小写 SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE UPPER(TABLE_NAME) = UPPER('表名');

  4. 验证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用户;

注意事项:

  1. 启用全列补充日志会显著增加重做日志的大小,可能影响数据库性能。在高事务量环境中,应谨慎权衡并选择最小必要的补充日志级别。
  2. 补充日志配置更改不会影响已生成的归档日志。如果需要对历史数据进行CDC同步,必须在产生这些变更前就配置好补充日志。
  3. 在RAC环境中,确保补充日志配置对所有实例都有效。
  4. 注意表结构变更对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 会话没有特定的日志文件

问题原因:

  1. TRUNCATE TABLE 属于 DDL 操作,不属于标准的 DML(如 DELETE)。
  2. Oracle 的 LogMiner 和大部分 CDC 采集工具仅能捕获 DML 变更(INSERT、UPDATE、DELETE),无法捕获 TRUNCATE。
  3. 由于 TRUNCATE 不会写入可供 CDC 采集的 REDO 日志,导致下游同步链路无法感知该操作。

解决方案:

  1. 禁止在需要 CDC 同步的表上使用 TRUNCATE TABLE 操作。
  2. 改用 DELETE FROM table; COMMIT; 语句清空表数据,确保该操作会写入 REDO 日志,CDC 能正常采集并同步 delete 事件到下游。
  3. 对已出现数据不一致的下游表,可手动执行清空操作后,重新全量同步一次数据,保证一致性。
2.10 归档日志未设置为全列导致同步字段为NULL​

问题描述:

在 Flink Oracle CDC 同步任务中,如果 Oracle 归档日志(LogMiner)参数未设置为全列模式,而是仅保留主键或者部分字段,则下游表(如 MySQL、Kafka 等)同步时,只有主键字段有实际值,其余字段为 NULL。问题原因:

  1. Oracle 归档日志的 LogMiner 组件支持配置抓取的列范围,如仅主键、部分字段或全字段。
  2. 若归档日志未设置为全列模式,则 redo log 仅记录被配置的字段数据,未配置的字段不会写入日志。
  3. Flink CDC 在解析 redo/归档日志时,只能提取日志中实际存在的字段,未写入日志的字段在下游表中表现为 NULL。
  4. 这种情况即使 Flink 表结构声明了所有字段,未被归档日志采集的字段依旧无法同步真实值。

解决方案:

  1. 确保 Oracle 归档日志(LogMiner)设置为全列(Full Column)模式,即所有需要同步的字段都被记录到日志。
  2. 配置全列同步后,重启 Flink CDC 任务,确保所有数据变更都能被完整采集。
  3. 对已经出现字段为 NULL 的下游表,需在修正归档日志配置后,重新进行全量同步,以修复历史数据缺失。
2.11 快照过旧ORA-01555​

错误信息: ORA-01555: snapshot too old: rollback segment number xxx with name "xxx" too small

问题原因:

  1. 全量快照查询时间过长,期间源表数据持续变更,UNDO 表空间无法保留足够的读一致性版本
  2. UNDO_RETENTION 设置过小或 UNDO 表空间不足
  3. 大表快照 + 高并发写入叠加

解决方案:

  1. 增大 UNDO 保留与表空间(需 DBA): ALTER SYSTEM SET UNDO_RETENTION = 7200; -- 必要时扩大 UNDO 表空间或开启 AUTOEXTEND
  2. 调小 chunk size 缩短单次查询时长(见 Flink 章节 2.1)
  3. 尽量在源库低峰期执行全量快照
  4. 评估是否可跳过全量、仅做增量(确认不需要存量)
2.12 表或视图不存在ORA-00942​

错误信息: ORA-00942: table or view does not exist

问题原因:

  1. CDC 账号对目标表无 SELECT 权限(Oracle 区分 schema,跨 schema 需显式授权)
  2. 表名/owner 大小写不匹配(Oracle 默认大写,带引号的小写名需精确匹配)
  3. 配置的 schema-name / table 与实际不符
  4. 缺少访问数据字典或 LogMiner 相关视图的权限

解决方案:

  1. 授予表与字典权限: GRANT SELECT ON owner.table_name TO cdc_user; GRANT SELECT_CATALOG_ROLE TO cdc_user;
  2. 核对实际 owner 与表名大小写: SELECT OWNER, TABLE_NAME FROM ALL_TABLES WHERE UPPER(TABLE_NAME)=UPPER('表名');
  3. 配置中 schema/表名按数据库实际大小写填写
  4. 确认 LogMiner 所需 V$ 视图权限齐全(见 2.8)
2.13 PDB容器/多租户连接问题​

错误信息: 连接 Oracle 12c+ 多租户实例时报无法找到服务/找不到表,或 LogMiner 无法读取 CDB 重做日志。

问题原因:

  1. 连接串误连到 CDB$ROOT 而非业务 PDB(或相反)
  2. CDC 用户需为 common user(C##前缀)才能跨容器访问重做日志
  3. PDB 与 CDB 的服务名/权限边界配置不当

解决方案:

  1. 业务数据连接对应 PDB 的服务名;LogMiner 读取重做日志需有 CDB 级权限
  2. 创建具备跨容器权限的 common 用户(C##前缀)并授予 LOGMINING、SELECT ANY TRANSACTION 等
  3. 确认 enable_goldengate_replication / 补充日志在容器层面正确开启
  4. 多租户环境配置较复杂,必要时联系 DBA 协助规划用户与权限
2.14 共享池内存不足ORA-04031​

错误信息: ORA-04031: unable to allocate xxx bytes of shared memory ("shared pool",...)

问题原因:

  1. LogMiner 持续运行消耗共享池内存,叠加业务负载导致 SGA 共享池不足
  2. SGA/共享池规格偏小
  3. 硬解析过多、内存碎片化

解决方案:

  1. 检查并适当增大共享池/SGA(需 DBA): ALTER SYSTEM SET SHARED_POOL_SIZE = '512M';
  2. 评估 LogMiner 挖掘频率与范围,避免长时间持续高强度挖掘
  3. 优化业务侧硬解析,使用绑定变量
  4. 内存类参数调整通常需 DBA 评估实例整体规划
2.15 跨Schema同名表导致多主键无法同步​

错误信息: 选择 Oracle 数据表时提示"该表有多个主键,暂时不支持同步"。

问题原因:

  1. 同一实例下多个不同 schema(owner)存在同名表,且各自都定义了主键
  2. 识别主键时通过 ALL_CONSTRAINTS / ALL_CONS_COLUMNS 查询,若未严格限定 owner,会把多个 schema 的同名表主键都查出来,表现为"多个主键"
  3. 常见于历史迁移场景(如 EKP、EKP1、EKPTEST 三个 schema 下都有 SYS_ORG_ELEMENT 且都有主键)

排查方法:

  1. 用以下 SQL 确认是否多个 owner 下存在同名表主键: SELECT owner, constraint_name, constraint_type, table_name FROM all_constraints WHERE table_name = 'SYS_ORG_ELEMENT' AND constraint_type = 'P';
  2. 若返回多行且 owner 不同,即为本问题

解决方案:

  1. 理想做法是限定 owner 只识别目标 schema 的主键;但若同步账号有权限访问多个同名表的 schema,限定 owner 仍可能不生效
  2. 客户线上业务无法调整 schema/表结构时,该表暂无法通过标准方式同步,需改用其它同步方式
  3. 规划上建议避免多 schema 同名表 + 同名主键并存;新建采集账号时尽量只授予目标 schema 的访问权限,减少同名表干扰
2.16 Oracle11g(11.2.0.4)PGA内存溢出已知bug​

问题描述: 源端为 Oracle 11g(具体 11.2.0.4.0),同步运行中出现内存溢出(out of memory)。

问题原因:

  1. 该 Oracle 版本存在已知 bug:在 PGA 内存配置较小的情况下会出现内存溢出
  2. 属数据库版本自身缺陷,非采集链路问题

解决方案:

  1. 适当调大 PGA 相关内存(如 PGA_AGGREGATE_TARGET),规避该 bug 的触发条件(需 DBA 评估)
  2. 参考 Oracle 官方说明(Doc/Bug 1934141.1 及社区讨论)评估打补丁或升级小版本
  3. 若条件允许,升级到不受该 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"

问题原因:

  1. SQL Server驱动试图建立SSL加密连接失败
  2. 证书验证路径构建失败-
  3. 默认情况下驱动会尝试使用SSL加密连接

解决方案:

  1. 在数据源配置中添加参数:

    • encrypt=false
    • trustServerCertificate=true
  2. 或配置正确的证书:

    • 导入SQL Server的SSL证书
    • 确保证书链完整
3.2 CDC同步异常​

错误信息: SQLServer数据库及表已启用CDC,但创建同步任务后无增量数据同步

问题原因:

  1. 数据库恢复模式被修改为简单模式
  2. CDC功能需要数据库处于完整恢复模式才能正常工作
  3. CDC代理作业未运行

解决方案:

  1. 检查并修改数据库恢复模式: ALTER DATABASE YourDatabase SET RECOVERY FULL;

  2. 验证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');

  1. 检查CDC代理作业: EXEC sys.sp_cdc_help_jobs;
3.3 事务日志满​

错误信息: Could not allocate space for object in database 'xxx' because the 'PRIMARY' filegroup is full

问题原因:

  1. 事务日志空间不足
  2. 事务日志未及时备份
  3. 大事务导致日志增长过快

解决方案:

  1. 检查日志空间: DBCC SQLPERF(LOGSPACE);

  2. 收缩日志文件: 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

问题原因:

  1. 并发事务互相等待资源
  2. 事务执行时间过长
  3. 锁升级导致死锁

解决方案:

  1. 查看死锁信息: SELECT * FROM sys.dm_tran_locks;

  2. 优化事务处理:

  • 减少事务范围
  • 统一访问顺序
  • 添加适当的索引
3.5 TLS1.0协议不兼容​

问题描述:

当源数据库为 SQL Server,并通过 JDBC 参数设置不使用 SSL 时,测试连接依然失败,报错信息如下:

  • ErrorCode=0, SQLState=08S01

  • 日志中出现类似错误:

    复制

    Caused by: The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]。

问题原因:

  1. SQL Server 即使未强制启用 SSL 连接,底层协议仍会自生成一个证书,对登录数据包进行加密。
  2. 较低版本的 SQL Server 可能默认只支持 TLS1.0 协议。
  3. 当前使用的 JRE(Java 运行环境)出于安全考虑,默认禁用了 TLS1.0 及以下协议。
  4. 因此,客户端无法与服务器协商出兼容的 TLS 协议,导致连接失败。

解决方案:

  1. 建议优先升级 SQL Server 端的 TLS 协议,支持 TLS1.2 或 TLS1.3。
    • 推荐在 SQL Server 服务器上升级操作系统及相关补丁,并按照 微软官方文档 启用更高版本的 TLS 协议。
    • 升级后重启 SQL Server 服务。
3.6 SQLServer字段类型datetime2同步异常​

异常描述:

  • SQL Server 源表字段为 datetime2 类型,数据中存在 2262 年以后的日期(如 9998 年)。

  • 使用 Flink CDC、JDBC 等 Java 生态工具同步到下游(如 Kafka、MySQL、Hudi 等)时,任务报错,常见堆栈为:

    复制

    Caused by: java.lang.IllegalArgumentException
    at org.apache.flink.table.data.TimestampData.fromEpochMillis(...)
    ...
    • 即使下游目标字段为字符串类型,也会出现该异常。

原因分析:

  • Java 和 Flink 的时间类型以 long 存储毫秒数,最大支持到 2262-04-11 23:47:16.854。
  • 超过此时间的数据,Flink CDC 解析时无法转换,直接报错。

适用范围:

  • 适用于所有通过 Java 生态工具同步 SQL Server datetime2 字段的场景。

建议处理:

  1. 源表数据建议控制在 2262 年以内,避免写入超大日期。
  2. 如确有需要存储更大日期,建议将该字段类型设计为字符串,且同步链路不做时间类型解析。
3.7 登录失败Login failed 18456​

错误信息: Login failed for user 'xxx'. (Microsoft SQL Server, Error: 18456)

问题原因:

  1. 用户名或密码错误
  2. 账号被禁用、过期,或仅允许 Windows 认证而非 SQL 认证
  3. 该登录名无权访问目标数据库(default database 不可达)
  4. 账号被锁定或超出登录策略

解决方案:

  1. 核对账号密码;确认实例启用了 SQL Server 与 Windows 混合认证模式
  2. 检查登录名状态与默认数据库: SELECT name, is_disabled FROM sys.sql_logins WHERE name='xxx';
  3. 为该登录映射目标数据库用户并授予读取/CDC 权限
  4. 查看 SQL Server 错误日志中 18456 的 state 码进一步定位(state 指明具体原因)
3.8 CDC清理作业导致变更丢失​

错误信息: 增量同步出现数据缺口,或任务报找不到对应的 LSN/变更记录。

问题原因:

  1. SQL Server CDC 的 cleanup 作业按 retention(默认约 3 天)清理变更表,任务停机过久导致所需变更被清理
  2. 变更表数据量大被清理过快
  3. CDC capture/cleanup 作业配置不当

解决方案:

  1. 调大 CDC 保留时长,给停机/积压留足空间: EXEC sys.sp_cdc_change_job @job_type='cleanup', @retention=4320; -- 分钟,约3天,可加大
  2. 控制任务停机时间不超过 retention
  3. 变更已被清理且无法续传时,需重新做全量同步
  4. 监控 CDC 变更表与 capture/cleanup 作业运行状态(EXEC sys.sp_cdc_help_jobs)
3.9 排序规则冲突Collation conflict​

错误信息: Cannot resolve the collation conflict between "xxx" and "yyy" in the equal to operation.

问题原因:

  1. 数据库/表/列使用了不同的排序规则(collation),关联或比较时冲突
  2. 源库与目标库 collation 不一致,导致字符串比较/去重异常
  3. 临时表与源表 collation 不匹配

解决方案:

  1. 统一相关列的 collation,或在比较时显式指定 COLLATE
  2. 目标库建表时与源库保持一致的 collation
  3. 涉及中文/大小写敏感场景,确认 collation 的语言与 CI/CS、AI/AS 设置符合预期
  4. 如仅同步不做库内比较,确保下游表字段 collation 能容纳源数据字符集
3.10 表结构变更后增量不同步(需重建表CDC)​

问题描述: 已创建过同步任务的 SQL Server 表,修改字段(增删改列)后,新的变更无法同步。

问题原因:

  1. SQL Server CDC 机制只会按"开启 CDC 时的表结构"捕获变更
  2. 表结构变动后,原 capture instance 仍按旧结构采集,导致变更不被正确捕获

解决方案:

  1. 对变更后的表禁用并重新启用 CDC(替换 schema_name / table_name): -- 禁用表的CDC EXEC sys.sp_cdc_disable_table @source_schema = 'schema_name', @source_name = 'table_name', @capture_instance = 'all';

    -- 重新启用表的CDC EXEC sys.sp_cdc_enable_table @source_schema = 'schema_name', @source_name = 'table_name', @role_name = NULL, @supports_net_changes = 0;

  2. 重新启用后,按需重新发布同步任务

  3. 规范:对已纳入同步的表做 DDL 前,先评估是否需要重建 CDC,避免静默丢数据

4. PostgreSQL相关问题​

4.1 版本兼容问题​

错误信息: PG 9.6版本同步任务无法同步数据

问题原因:

  1. PostgreSQL 9.6版本不支持pgoutput编解码扩展
  2. 部分同步功能需要更高版本支持
  3. 复制槽配置不正确

解决方案:

  1. 安装并配置wal2json插件: CREATE EXTENSION IF NOT EXISTS wal2json;
  2. 修改postgresql.conf配置:
    • wal_level = logical
    • max_replication_slots = 10
    • max_wal_senders = 10
  3. 检查复制槽状态:
    • SELECT * FROM pg_replication_slots;
4.2 连接数超限​

错误信息: FATAL: remaining connection slots are reserved for non-replication superuser connections

问题原因:

  1. 达到max_connections限制
  2. 连接未及时释放
  3. 连接池配置不合理

解决方案:

  1. 检查当前连接: SELECT * FROM pg_stat_activity;

  2. 调整连接数限制: ALTER SYSTEM SET max_connections = '200';

4.3 复制延迟过大​

错误信息: ERROR: replication slot "xxx" is active but not used for too long

问题原因:

  1. 网络带宽不足
  2. 源库写入压力大
  3. 复制进程负载高

解决方案:

  1. 监控复制延迟: SELECT slot_name, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) as replication_lag FROM pg_replication_slots;

  2. 优化复制配置: ALTER SYSTEM SET max_wal_senders = 10; ALTER SYSTEM SET wal_keep_segments = 64;

4.4 从库没有复制连接主库的权限​

错误信息: no pg_hba.conf entry for replication connection from host "192.168.1.103", user "postgres", SSL off

问题原因:

  1. PostgreSQL 数据库的访问控制文件 pg_hba.conf 未为该主机、用户和连接类型(如 replication)配置允许访问的规则。

当外部服务(如数据同步、CDC、备份等)尝试以 replication 模式连接 PostgreSQL 时,若 pg_hba.conf 中没有相应的条目,则会被拒绝连接。

解决方案:

  1. 编辑 PostgreSQL 的 pg_hba.conf 文件,为需要访问的主机、用户和 replication 连接类型添加一条允许规则。例如,允许 192.168.1.103 主机使用 postgres 用户进行 replication 连接:

    oxygene

    复制

    # TYPE    DATABASE    USER        ADDRESS             METHOD
    host replication postgres 192.168.1.103/32 trust

    如需开启 SSL,可将 SSL off 部分调整为支持 SSL 的配置。

  2. 保存 pg_hba.conf 文件后,需重载 PostgreSQL 配置生效:

    bash

    复制

    pg_ctl reload
    # 或
    systemctl reload postgresql
    # 或
    SELECT pg_reload_conf();
  3. 建议:生产环境建议使用更安全的认证方式(如 md5),不要直接使用 trust,并严格限制允许的 IP 范围。

4.5 权限异常:permission denied for database XXX​

问题原因:

  1. 当前连接使用的数据库用户没有访问目标数据库的权限。
  2. 可能是该用户未被授权,或被限制连接特定数据库。

解决方案:

  1. 确认连接使用的用户名,确保该用户已被授权访问目标数据库。
  2. 可能需要superuser账户才行。
4.6 复制槽堆积导致WAL磁盘写满​

错误信息: 源库磁盘报警/写满,或 No space left on device;pg_replication_slots 中槽 active 为 false 但 WAL 持续堆积。

问题原因:

  1. CDC 任务长时间停止或消费缓慢,复制槽(replication slot)一直未推进 confirmed_flush_lsn
  2. PostgreSQL 为保留未确认的 WAL 不能回收,WAL 持续累积撑满磁盘
  3. 任务删除后未清理对应的复制槽,成为"僵尸槽"

解决方案:

  1. 查看槽与堆积量: SELECT slot_name, active, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) AS lag FROM pg_replication_slots;
  2. 尽快恢复任务消费,或对确认废弃的槽手动删除释放 WAL: SELECT pg_drop_replication_slot('slot_name'); -- 删除后该任务需重做全量
  3. 设置上限避免无限堆积(PG13+): ALTER SYSTEM SET max_slot_wal_keep_size = '10GB';
  4. 建立监控,任务长时间停机前应评估对源库磁盘的影响
4.7 发布Publication缺失或未含目标表​

错误信息: publication "xxx" does not exist / 增量无数据但任务无明显报错。

问题原因:

  1. pgoutput 逻辑解码需要 publication,未创建或名称不匹配
  2. publication 创建时未包含目标表(FOR TABLE 范围不全)
  3. 新增表后未把表加入 publication

解决方案:

  1. 检查/创建 publication: SELECT * FROM pg_publication; SELECT * FROM pg_publication_tables WHERE pubname='xxx'; CREATE PUBLICATION xxx FOR TABLE schema.table1, schema.table2;
  2. 新增表时追加进 publication: ALTER PUBLICATION xxx ADD TABLE schema.new_table;
  3. 确认 wal_level = logical 且复制槽、publication 名称与任务配置一致
  4. 如使用 FOR ALL TABLES,确认账号有相应权限
4.8 大字段TOAST更新值丢失(REPLICA IDENTITY)​

问题描述: 更新仅改了部分列时,下游同步到的大字段(text/jsonb 等 TOAST 存储字段)值变为空或保持旧值。

问题原因:

  1. 表 REPLICA IDENTITY 为 DEFAULT,UPDATE 时未变更的 TOAST 大字段不会写入 WAL
  2. 逻辑解码拿不到未变更的大字段值,下游表现为缺失
  3. 无主键表未设置 REPLICA IDENTITY FULL

解决方案:

  1. 对需要完整行镜像的表设置全行标识: ALTER TABLE schema.table REPLICA IDENTITY FULL;
  2. 注意 FULL 会增大 WAL 体积,按需在关键表上启用
  3. 有主键表通常用主键标识即可,仅大字段缺失场景才需 FULL
  4. 修改后对已出现缺失的下游数据重新全量同步修复
4.9 逻辑复制槽数量用完all replication slots are in use​

错误信息: org.apache.flink.runtime.JobException: Recovery is suppressed by FixedDelayRestartBackoffTimeStrategy ... Caused by: io.debezium.DebeziumException: Creation of replication slot failed Caused by: org.postgresql.util.PSQLException: ERROR: all replication slots are in use Hint: Free one or increase max_replication_slots.

问题原因:

  1. 每个 PG CDC 任务运行时会占用一个逻辑复制槽,并发任务数超过 max_replication_slots / max_wal_senders 上限
  2. 旧任务遗留的"僵尸槽"(active=false)一直占用名额未释放

排查方法:

  1. 查看当前上限: SELECT name, setting FROM pg_settings WHERE name IN ('max_replication_slots','max_wal_senders');
  2. 查看已存在的槽及是否在用: SELECT slot_name, active, database, plugin, restart_lsn FROM pg_replication_slots; (active = f 表示当前未被使用,可能是遗留槽)

解决方案:

  1. 方案一:调大上限(按需并发量设置,建议预留充足,可调至数百): -- 配置文件 postgresql.conf max_replication_slots = 20 max_wal_senders = 20 -- 修改后重启数据库;或在线: ALTER SYSTEM SET max_replication_slots = 20; SELECT pg_reload_conf(); (部分参数需重启方可生效,以数据库提示为准)
  2. 方案二:释放无用槽,删除前务必确认对应任务已废弃: SELECT pg_drop_replication_slot('your_old_slot_name');
  3. 建立运维规范:任务删除时清理其复制槽,避免槽名额被僵尸槽长期占用
4.10 字符类型写入jsonb需stringtype=unspecified​

问题描述: 将字符串/JSON 文本同步写入 PostgreSQL 的 jsonb 字段时失败。

问题原因:

  1. PG 的 jsonb 是二进制 JSON 类型,不直接兼容字符串写入,即便内容是合法 JSON 文本也不会自动转换
  2. JDBC 默认以字符串类型绑定参数,与 jsonb 列类型不匹配

解决方案:

  1. 在 PostgreSQL 数据源的"其他连接串参数"中添加,让驱动对字符串做类型自适应转换: stringtype=unspecified
  2. 配置后字符串可被服务端按目标列类型(jsonb)正确转换写入
  3. 保存后重新发布任务使配置生效
4.11 非superuser账号创建同步任务(权限管控场景)​

背景: PostgreSQL CDC 默认需要拥有 superuser 权限的账号才能正常创建同步任务(创建 publication FOR ALL TABLES、创建/读取逻辑复制槽等动作默认需要超级权限)。

问题描述: 部分客户对数据库账号有严格权限管控,不允许对外提供 superuser 最高权限账号,导致"创建同步任务需要 superuser"的要求无法满足。

解决思路: 由 superuser 账号预先完成只需一次的"发布(publication)"创建,之后改用仅授予必要权限(REPLICATION + CONNECT + USAGE + SELECT)的普通账号来创建并运行同步任务。发布名称必须为 dbz_publication(Debezium 默认发布名)。

解决方案:

  1. 开启 PG 的逻辑复制(CDC 前提),按部署方式二选一:

    本地部署:修改 postgresql.conf 后重启:

    # 更改 wal 日志方式为 logical
    wal_level = logical
    # 复制槽最大数量(默认10),flink-cdc 默认一张表占一个 slot
    max_replication_slots = 100
    # wal 发送最大进程数(默认10),与上面的 slots 设为一致
    max_wal_senders = 100
    # 可适当调大空闲复制连接中断超时(默认60s)
    # wal_sender_timeout = 180s

    RDS-PG(如阿里云):在控制台修改参数 wal_level、max_replication_slots、max_wal_senders,提交后重启实例生效。

  2. 用 superuser(如 postgres)登录,为所有表创建发布(仅此步需要超级权限,发布名必须为 dbz_publication):

    CREATE PUBLICATION dbz_publication FOR ALL TABLES;
    -- 查看发布: SELECT * FROM pg_publication;
    -- 查看已发布的表: SELECT * FROM pg_publication_tables;
  3. 创建非 superuser 普通账号并最小化授权(库名/账号名按需替换,下例库 flink_test、账号 flink_user):

    -- 创建用户
    CREATE USER flink_user WITH PASSWORD 'flink123';
    -- 授予 REPLICATION 权限(创建/读取复制槽所需)
    ALTER ROLE flink_user WITH REPLICATION;
    -- 授权数据库连接
    GRANT CONNECT ON DATABASE flink_test TO flink_user;
    -- 授权 Schema 访问
    GRANT USAGE ON SCHEMA public TO flink_user;
    -- 授权表查询:单表授权
    -- GRANT SELECT ON TABLE public.user_table TO flink_user;
    -- 或:把当前库 public 下所有表查询权限赋给用户
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO flink_user;
  4. 为需要同步的表设置 REPLICA IDENTITY FULL(确保 UPDATE/DELETE 能捕获完整前镜像,否则默认可能为 NOTHING 导致更新/删除数据丢失,参见 4.8):

    ALTER TABLE public.user_table REPLICA IDENTITY FULL;
    -- 多个表分别执行
    -- ALTER TABLE public.other_table REPLICA IDENTITY FULL;
    -- 查看复制标识(值为 f 表示设置成功)
    -- SELECT relreplident FROM pg_class WHERE relname='user_table';
  5. 用 flink_user(非 superuser)创建并运行同步任务即可。

补充:为什么任务停止后复制槽不会自动删除

Flink CDC 的 PostgreSQL connector(底层基于 Debezium)启动时会创建一个逻辑复制槽,从 slot 读取 WAL 增量并保存消费位点(LSN)。任务正常停止时 Debezium 不会自动 drop 该 slot,因为它认为任务可能会重启/从 checkpoint 恢复;若 slot 被删,将无法从上次 LSN 续读,导致全量重跑或数据丢失。因此 slot 默认需手动管理(与 4.6 "复制槽堆积撑满 WAL" 同源)。

复制槽管理:

-- 查看所有复制槽及是否在用
SELECT slot_name, active, database, plugin, restart_lsn FROM pg_replication_slots;
-- 仅查未在用的遗留槽(注意:需要 WHERE 子句)
SELECT slot_name, active, database, plugin, restart_lsn
FROM pg_replication_slots WHERE active = false;
-- 删除确认废弃的无用槽(把 your_old_slot_name 换成上一步查到的 slot_name)
SELECT pg_drop_replication_slot('your_old_slot_name');

5. MongoDB相关问题​

5.1 副本集同步问题​

错误信息: 聚合表预览有数据,正式发布保存无数据

问题原因:

  1. MongoDB副本集未开启
  2. MongoDB版本过低
  3. 复制集配置不正确

解决方案:

  1. 开启MongoDB副本集:
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "localhost:27017" }
]
})
  1. 确认MongoDB版本,建议升级到4.0以上版本

  2. 验证复制集状态: rs.status()

5.2 Oplog窗口问题​

错误信息: Cannot find timestamp in oplog greater than or equal to timestamp

问题原因:

  1. Oplog大小设置过小
  2. 同步延迟导致Oplog数据过期
  3. 复制集负载过高

解决方案:

  1. 检查Oplog状态: db.printReplicationInfo()

  2. 调整Oplog大小:

db.adminCommand({
"replSetResizeOplog": 1,
"size": 16384
})
5.3 认证失败​

错误信息: Authentication failed for user xxx

问题原因:

  1. 用户认证机制不匹配
  2. 权限不足
  3. 认证数据库错误

解决方案:

  1. 检查用户权限: db.getUser("username")

  2. 授予必要权限: db.grantRolesToUser("username", ["readWrite", "XXX"] )

5.4 ChangeStream resume token失效​

错误信息: resume of change stream was not possible, as the resume point may no longer be in the oplog / ChangeStreamHistoryLost。

问题原因:

  1. 任务停机过久,断点对应的 oplog 已被覆盖(oplog 是固定大小循环写)
  2. oplog 窗口过小,承载不了停机/积压时间
  3. 复制集做过重大维护导致 oplog 不连续

解决方案:

  1. 增大 oplog 窗口以容纳更长停机(见 5.2): db.adminCommand({ replSetResizeOplog: 1, size: 16384 })
  2. 用 db.printReplicationInfo() 评估 oplog 实际可回溯时间,控制停机不超过该窗口
  3. resume token 已失效无法续传时,需重新做一次全量同步
  4. CDC 任务建议基于 ChangeStream(需 MongoDB 4.0+ 副本集),并保证 oplog 充足
5.5 分片集群同步异常​

问题描述: 对分片集群(sharded cluster)做 CDC 时,出现漏数据、orphan 文档或连接对象错误。

问题原因:

  1. 连接到了单个 shard 的 mongod 而非 mongos 路由,导致只拿到部分数据
  2. 分片迁移(chunk migration)产生的 orphan 文档造成重复/异常
  3. 各 shard oplog 窗口不一致,个别 shard 断点失效
  4. 账号在分片集群上的权限不足(需在 admin 上有相应角色)

解决方案:

  1. CDC 连接分片集群应连 mongos 路由入口,由其统一汇聚 ChangeStream
  2. 确认 MongoDB 版本支持分片集群 ChangeStream(4.0+,部分特性需更高版本)
  3. 统一并充分配置各 shard 的 oplog 窗口
  4. 授予集群级读取权限,必要时使用 clusterMonitor / readAnyDatabase 等角色
  5. 关注 orphan 文档对下游一致性的影响,必要时在下游做去重

6. 明道云工作表(作为数据源)相关问题​

说明:本节针对以明道云"工作表"为数据源、同步到数据库/其它目的地的场景。工作表的字段以控件ID绑定、删除走回收站/物理删除、以及聚合表计算逻辑等特性,是这类问题的常见根因。

6.1 控件删除重建导致字段值为NULL​

问题描述: 下游/报表中某"选项"等字段在某段时间后持续为 NULL。

问题原因:

  1. 上游删除了原控件(如"店铺文本控件"),又新建了一个同名的"选项控件"
  2. 名称虽相同,但控件/字段的 ID 已变化;同步/映射按字段 ID 而非名称绑定,导致读不到值表现为 NULL

解决方案:

  1. 在配置层将映射重新绑定到新的控件/字段 ID,或恢复原控件并迁移数据
  2. 对已产生 NULL 的数据执行一次性回填修复
  3. 变更管控:
    • 禁止在生产直接"删除后新建同名控件"
    • 上线前做 Schema/字段ID Diff 校验并阻断不兼容变更
    • 监控关键字段 NULL 率,对新增/删除字段告警
6.2 仅显示字段或权限不足导致数据缺失​

问题描述: 内部 Web 工具查询某表显示"无数据/少数据",怀疑同步缺失。

问题原因:

  1. Web 工具使用的账号/角色表或列权限不足,查询结果被过滤,造成"看起来缺失"
  2. 关联表中某字段被配置为"仅显示(Display Only)",不参与保存/变更,不产生更新事件,因而不同步

解决方案:

  1. 用具备完整权限的账号在数据库执行原生 SQL 交叉验证;对齐 Web 工具与任务实际使用账号的 RBAC / 列权限 / 行权限
  2. 将"仅显示"的他表控件改为可存储,确保会触发更新事件/CDC
  3. 清理已有脏数据后重新同步
6.3 非rowid主键+工作流彻底删除导致同步中断​

错误信息: 监控报错(同步工作表数据到 MySQL):Failed to deserialize consumer record ... Corrupt Debezium JSON message '{"op":"d","before":{"rowid":"xxxx"},"after":null}' ... Caused by: org.apache.flink.table.api.TableException: Column 'id' is NOT NULL, however, a null value is being written into it.

问题原因:

  1. 工作表选择了非 rowid 字段(如 id)作为同步主键
  2. 工作表通过工作流"彻底删除记录(不放入回收站)"
  3. 工作流产生的删除事件,内部推送给下游的 Debezium JSON 只包含 rowid,before 中没有 id 及其它字段
  4. 下游按 id 主键删除时拿不到 id,删除无法执行,且 id 列 NOT NULL 被写入 null 而报错,进而导致整个任务无法继续,后续新增/修改也都同步不了

解决方案:

  1. 首选:使用工作表的 rowid 作为同步主键(删除事件必带 rowid,能正常下发删除)
  2. 若必须用其它字段(如 id)作主键:避免使用工作流"彻底删除"操作(改为放入回收站等不丢字段的方式)
  3. 已出现任务中断的,修正主键/删除方式后重建任务并重新全量同步,修复一致性
  4. 可临时用 table.exec.sink.not-null-enforcer=DROP 静默丢弃此类记录,但会丢删除语义,不建议作为根治手段
6.4 聚合表计算字段在统计图中结果不准​

问题描述: 聚合表中的计算字段(如【数量完成率】=【销售数量】/【目标销售】、【销售完成率】=【销售额】/【目标销售额】)发布后单条计算正确;但在统计图中直接引用该聚合表计算字段做汇总时,相除结果不准确。

问题原因:

  1. 聚合表的公式是基于同步任务的单条记录逐条计算的
  2. 统计图做汇总时,不能直接套用聚合表已有的"单条相除"公式字段——分子分母应先各自汇总再相除,而非把每条的比值再聚合

解决方案:

  1. 在统计图里新增"计算值字段",基于已汇总后的【销售数量】与【目标销售】(及销售额/目标销售额)再做一次相除
  2. 即:先 SUM 分子、SUM 分母,最后相除,避免"先逐条相除再聚合"导致的偏差
  3. 区分两类字段用途:聚合表计算字段用于单条/明细,统计图汇总比率用统计图自身的计算值字段

7. DB2相关问题​

7.1 字段类型不被CDC支持导致Agent无法启动​

问题描述: DB2 表中存在 CDC 不支持的字段类型时,会导致 CDC Agent 起不来,无法采集。

问题原因:

  1. DB2 CDC Agent 仅支持有限的字段类型集合,表中含其范围外的类型时 Agent 启动失败
  2. 常见不受支持类型多为特殊/图形/大对象等类型(如 GRAPHIC / VARGRAPHIC 等需结合实际版本确认)

解决方案:

  1. 核对待同步表的字段类型,识别出 CDC Agent 不支持的列
  2. 对不支持的列做改造:调整为受支持的兼容类型,或在同步中排除该列
  3. 确认 Agent 支持的类型清单(以所用 DB2 CDC 组件文档为准),按清单对齐表结构后再启动 Agent
  4. 改造完成后重启 CDC Agent 验证可正常采集

二、目的地连接问题​

1. 明道云工作表问题​

1.1 Topic相关异常​

错误信息:

  1. Topic不存在: Failed to write records to Kafka: Topic(tableSyncTopic) not present in metadata after 30000 ms

  2. Topic分区异常: org.apache.kafka.common.errors.NotLeaderForPartitionException: This server is not the leader for that topic-partition

  3. Topic连接超时: org.apache.kafka.common.errors.TimeoutException: Expiring records after 30000ms

  4. Topic授权失败: org.apache.kafka.common.errors.TopicAuthorizationException: Not authorized to access topics: [xxx]

问题原因:

  1. Topic未创建或已被删除
  2. Kafka集群异常或重平衡
  3. 网络连接不稳定
  4. 权限配置问题
  5. Broker节点异常

统一解决方案:

  1. 重新发布任务流程:
  • 进入数据集成页面
  • 找到对应的同步任务
  • 点击"更新发布"
  • 等待任务重新发布完成
  • 启动任务验证同步情况
  1. 请求运维支持:
  • 提供任务ID
  • 提供具体错误信息
  • 说明问题发生时间点
  • 运维协助检查集成环境
1.2 新增数据异常​

错误信息:

  1. 主键重复:
  2. 删除标记异常:

问题原因:

  1. 主键重复
  • 包含正常行记录的重复
  • 包含回收站中的重复
  1. 删除操作问题
  • 非物理删除标识导致的问题
  • 先删除后新增的顺序问题
  1. 大批量新增问题
  • 合并多表同步数据
  • 重复发布导致的全量新增
  • 数据推送顺序问题

解决方案:

  1. 检查数据情况:
  • 验证主键是否重复
  • 确认回收站数据状态
  • 检查删除标记的准确性
  1. 调整同步策略:
  • 考虑分批同步数据
  • 调整推送顺序
  • 优化删除处理逻辑
1.3 更新数据异常​

错误信息:

  1. 主键数据不存在:
  2. 操作顺序异常:

问题原因:

  1. 数据状态问题
  • 数据已物理删除
  • 数据已进入回收站
  1. 复合操作问题
  • 先新增后删除的顺序问题
  • 非物理删除标识导致的问题
  • 推送数据顺序混乱

解决方案:

  1. 数据状态检查:
  • 确认数据是否真实删除
  • 检查回收站数据状态
  • 验证数据更新条件
  1. 优化同步策略:
  • 调整操作顺序
  • 规范删除标识使用
  • 优化数据推送逻辑
1.4 覆盖更新异常​

错误信息:

  1. 唯一索引冲突:
  2. 数据匹配失败:

问题原因:

  1. 工作表系统字段thirdprimary(三方主键)唯一索引冲突
  • 切换了主键映射的表字段
  • 新字段找不到数据时会走新增逻辑
  • 新增遇到唯一索引导致失败
  1. 去重依据字段问题
  • controlIdForIdentifyDuplicate字段为空
  • 推送去重字段配置错误
  • 去重依据字段匹配到多条数据

解决方案:

  1. 重新发布任务时的注意事项:
  • 确认源表主键字段是否变更
  • 验证去重依据字段的唯一性
  • 检查工作表中数据情况
  • 必要时先清空目标工作表
  1. 运维支持:
  • 检查工作表服务状态
  • 查看具体错误日志
  • 协助处理数据冲突

2. MySQL目的地问题​

2.1 表空间已满异常​

错误信息: The table 'xxx' is full; Error Code: 1114

问题原因:

  1. 磁盘空间不足
  2. 数据文件增长受限
  3. 表空间配置限制
  4. innodb_data_file_path配置不合理

解决方案:

  1. 检查空间使用情况: SELECT table_schema, table_name, data_length/1024/1024 as data_mb, index_length/1024/1024 as index_mb FROM information_schema.TABLES WHERE table_schema = 'your_database';

  2. 联系运维处理:

  • 清理磁盘空间
  • 扩容数据目录
  • 调整表空间配置
2.2 唯一索引冲突​

错误信息: Duplicate entry 'xxx' for key 'xxx'

问题原因:

  1. 源数据存在重复记录
  2. 未正确处理主键或唯一键
  3. 数据同步顺序问题
  4. 更新策略配置不当

解决方案:

  1. 检查源数据: SELECT column_name, COUNT() FROM table_name GROUP BY column_name HAVING COUNT() > 1;

  2. 调整同步任务:

  • 修改更新策略
  • 调整同步条件
  • 优化数据处理逻辑
2.3 字段长度溢出​

错误信息: Data too long for column 'xxx' at row xxx

问题原因:

  1. 目标字段长度小于源字段
  2. 字符集编码不一致
  3. 数据转换问题
  4. 特殊字符处理问题

解决方案:

  1. 检查字段定义: SHOW CREATE TABLE table_name;

  2. 调整字段长度: ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(适当长度);

  3. 检查字符集: SHOW VARIABLES LIKE 'character%';

2.4 写入权限不足command denied​

错误信息: INSERT/UPDATE/DELETE command denied to user 'xxxx'@'host' for table 'yyyy'

问题原因:

  1. 目标库账号缺少对应表的 INSERT / UPDATE / DELETE 权限
  2. 连接到了只读库或使用了只读账号

解决方案:

  1. 为目标账号授予写权限: GRANT INSERT, UPDATE, DELETE ON db.table TO 'user'@'host'; FLUSH PRIVILEGES;
  2. 确认连接的是可写实例、可写账号(非只读副本/只读账号)
  3. 最小权限原则下,确保至少授予同步所需的增删改权限

3. Oracle目的地问题​

3.1 字段值超长异常​

错误信息: ORA-12899: value too large for column xxx

问题原因:

  1. 字段定义长度不足
  2. 字符集转换导致长度变化
  3. 数据类型不匹配

解决方案:

  1. 检查字段定义: SELECT column_name, data_type, data_length FROM user_tab_columns WHERE table_name = 'TABLE_NAME';

  2. 调整字段长度: ALTER TABLE table_name MODIFY (column_name VARCHAR2(新长度));

3.2 序列生成异常​

错误信息: ORA-08004: sequence SEQ_XXX.NEXTVAL exceeds internal limits

问题原因:

  1. 序列达到最大值
  2. 序列缓存设置不合理
  3. 并发获取序列值

解决方案:

  1. 检查序列状态: SELECT sequence_name, min_value, max_value, increment_by, cache_size FROM user_sequences WHERE sequence_name = 'SEQ_NAME';

  2. 重建序列: DROP SEQUENCE sequence_name; CREATE SEQUENCE sequence_name START WITH xxx INCREMENT BY 1 NOCACHE;

3.3 表空间不足​

错误信息: ORA-01653: unable to extend table xxx by xxx in tablespace xxx

问题原因:

  1. 表空间物理空间不足
  2. 表空间最大尺寸限制
  3. 数据文件无法自动扩展

解决方案:

  1. 检查表空间使用情况: SELECT tablespace_name, bytes/1024/1024 MB, maxbytes/1024/1024 MAX_MB FROM dba_data_files;

  2. 联系运维处理:

  • 新增数据文件
  • 调整自动扩展配置
  • 清理无用数据
3.4 并发写入冲突​

错误信息: ORA-00060: deadlock detected while waiting for resource

问题原因:

  1. 事务相互等待
  2. 索引竞争
  3. 锁等待超时
  4. 并发写入同一数据

解决方案:

  1. 查看锁状态: SELECT sid, serial#, blocking_session FROM v$session WHERE blocking_session IS NOT NULL;

  2. 优化并发策略:

  • 调整事务大小
  • 优化锁等待时间
  • 减少长事务

4. SQLServer目的地问题​

4.1 主键重复异常​

错误信息: Violation of PRIMARY KEY constraint 'PK_xxx'. Cannot insert duplicate key

问题原因:

  1. 源数据主键重复
  2. 同步策略配置问题
  3. 标识列(IDENTITY)设置问题

解决方案:

  1. 检查主键值: SELECT column_name, COUNT() FROM table_name GROUP BY column_name HAVING COUNT() > 1;

  2. 调整同步策略:

  • 设置正确的更新规则
  • 处理重复数据逻辑
  • 检查IDENTITY设置

三、任务执行问题​

1. 任务创建问题​

1.1 任务创建超时​

错误信息: 创建任务时报504 time out超时错误

问题原因:

  1. Nginx默认超时时间设置过短
  2. 任务创建过程耗时较长
  3. 网络连接不稳定

解决方案:

  1. 修改Nginx配置:
location /private-datapipeline {
proxy_read_timeout 3600s;
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
}
  1. 执行以下步骤:
  • 进入容器: docker exec -it $(docker ps |grep community|awk '{print $1}') bash

  • 进入Nginx配置目录: cd /usr/local/nginx/conf/conf.d

  • 修改配置文件: sed -ri '/private-datapipeline;/a\ \ \ \ \ \ \ \ proxy_read_timeout 3600s;' private.conf

  • 检查配置是否生效: grep -C 5 'private-datapipeline;' private.conf

  • 重载Nginx配置: /usr/local/nginx/sbin/nginx -s reload

1.2 文件上传失败​

错误信息: 发布同步任务失败,上传jar包失败

问题原因:

  1. Flink与集成中心的通信异常
  2. 网络连接不稳定
  3. 文件权限问题

解决方案:

  1. 检查网络连接:
  • 确保Flink和集成中心之间网络通畅
  • 检查防火墙配置
  • 验证端口是否开放
  1. 检查文件权限:
  • 确保上传目录具有正确的写入权限
  • 检查磁盘空间是否充足
1.3 消息大小超限​

错误信息: io.grpc.StatusRuntimeException: RESOURCE_EXHAUSTED: Sending message exceeds the maximum configured message size

问题原因:

  1. 一次性同步的数据量过大
  2. 同步的表字段数过多
  3. gRPC消息大小限制配置过小

解决方案:

  1. 优化同步策略:
  • 减少单次操作的记录数量
  • 减少同步的字段数量
  • 考虑分批同步数据
  1. 建议操作:
  • 选择必要的字段进行同步
  • 适当调整同步批次大小
  • 避免全表数据一次性同步

2. 任务运行问题​

2.1 Checkpoint异常​

错误信息: Exceeded checkpoint tolerable failure threshold. The latest checkpoint failed due to Asynchronous task checkpoint failed.

问题原因:

  1. Checkpoint的大小超出限制
  2. Checkpoint的时间过长
  3. 任务状态过大

解决方案:

  1. 重启任务,尝试清理历史状态

  2. 检查数据量是否过大:

  • 考虑增量同步替代全量同步
  • 适当调整同步频率
  1. 检查是否存在数据倾斜:
  • 审查数据分布情况
  • 考虑优化数据分片策略
2.2 Task取消超时​

错误信息: did not react to cancelling signal - interrupting; it is stuck for XXX seconds in method

问题原因:

  1. Task在取消过程中被阻塞
  2. 未能在指定时间内响应取消信号
  3. 可能由于逻辑问题或资源争用导致

解决方案:

  1. 检查task执行状态:
  • 查看task manager日志
  • 检查资源使用情况
  • 分析task执行耗时
  1. 必要时强制终止:
  • 记录当前任务状态
  • 使用kill命令强制终止
  • 重新提交任务
2.3 Schema获取失败​

错误信息: Retrieve schema history failed, the schema record for engine has been removed

问题原因:

  1. 数据库表在任务运行时发生结构性变更
  2. Schema历史记录丢失
  3. 权限不足无法读取schema信息

解决方案:

  1. Schema变更管理:
  • 避免在同步过程中修改表结构
  • 必要变更时先停止同步任务
  1. 任务操作建议:
  • 记录现有配置
  • 重新创建同步任务
  • 验证新任务配置
2.4 SourceCoordinator超时​

错误信息: Failed to close the SourceCoordinator before timeout of 60000 ms

问题原因:

  1. 数据源连接数限制
  2. 网络延迟过高
  3. 资源争用导致响应缓慢

解决方案:

  1. 数据库连接管理:
  • 创建专用同步账户
  • 合理设置连接池大小
  • 定期清理空闲连接

四、Flink引擎异常排查​

说明:本章面向使用 Flink / Flink CDC 引擎运行同步任务时的常见异常。多数问题可由用户依据下文"问题原因—解决方案"自助定位,仅当涉及集群参数(flink-conf.yaml)调整或需要扩容资源时,才需联系研发/运维协助。排查前请先准备:任务ID、完整异常堆栈、问题发生时间点、JobManager 与 TaskManager 日志、Flink Web UI 截图(Overview / Checkpoints / Backpressure 页面)。

1. 运行时核心异常​

1.1 Checkpoint失败超过容忍阈值​

错误信息: Exceeded checkpoint tolerable failure threshold. The latest checkpoint failed due to Asynchronous task checkpoint failed.

问题原因:

  1. 状态后端写入慢或状态过大,异步快照在超时时间内未完成
  2. 反压严重,barrier 无法及时对齐(aligned checkpoint 下尤其明显)
  3. 状态存储目标(HDFS/OSS/本地盘)写入失败、空间不足或权限不足
  4. TaskManager 频繁 Full GC,导致快照线程被拖慢

解决方案:

  1. 适当放宽容忍阈值与超时,给慢快照留出空间(flink-conf.yaml 或任务参数): execution.checkpointing.tolerable-failed-checkpoints: 10 execution.checkpointing.timeout: 600000 execution.checkpointing.min-pause: 5000
  2. 排查反压(见 1.6),先消除反压再谈 Checkpoint 稳定性
  3. 检查状态存储后端可用性与剩余空间,确认任务账号对 checkpoint 目录有写权限
  4. 对大状态任务,开启非对齐 Checkpoint 缓解 barrier 对齐阻塞: execution.checkpointing.unaligned: true
  5. 若仅为偶发失败且数据未丢,可先重启任务清理历史状态再观察
1.2 Checkpoint长期Pending/超时​

错误信息: Checkpoint 在 Web UI 上长时间处于 IN_PROGRESS,最终 Checkpoint expired before completing.

问题原因:

  1. 某个 subtask 处于严重反压,barrier 长时间无法流到下游
  2. Source 端(如 CDC 快照阶段)单个 split 处理时间过长,barrier 被卡在 Source
  3. 状态过大,异步上传耗时超过 timeout
  4. 网络抖动或状态存储后端响应慢

解决方案:

  1. 打开 Web UI 的 Checkpoint 详情,定位 ack 最慢的 subtask(Acknowledged 列),针对性排查
  2. 增大超时时间:execution.checkpointing.timeout: 900000
  3. CDC 快照阶段建议先完成全量再观察增量阶段的 Checkpoint,是否快照阶段本就无法做 Checkpoint(部分版本快照阶段不切 Checkpoint 属正常现象)
  4. 开启非对齐 Checkpoint:execution.checkpointing.unaligned: true
  5. 缩小 Checkpoint 间隔不一定有效,反而加重负担;应优先解决反压与状态体积
1.3 Checkpoint状态过大导致同步缓慢​

问题描述: Checkpoint Size 持续增长到 GB 级别,每次 Checkpoint 耗时越来越长,任务吞吐下降。

问题原因:

  1. 使用了大状态算子(如全局去重、长时间窗口、regular join 维表缓存)
  2. 状态 TTL 未配置,历史状态无限累积
  3. CDC 任务 schema history / split 元数据状态膨胀
  4. 数据倾斜导致个别并行度状态远大于其它

解决方案:

  1. 为有状态算子配置状态 TTL,及时清理过期状态
  2. 大状态任务改用 RocksDB 状态后端并开启增量 Checkpoint: state.backend: rocksdb state.backend.incremental: true
  3. 评估是否真的需要全量状态,能用增量同步替代全量的尽量用增量
  4. 排查并缓解数据倾斜(见 1.16)
1.4 Savepoint触发失败​

错误信息: Triggering a savepoint for the job failed / Savepoint timed out.

问题原因:

  1. 任务正处于反压或异常状态,无法在超时内完成一致性快照
  2. Savepoint 目标路径不可写或磁盘空间不足
  3. 任务并行度极高、状态很大,Savepoint 耗时超出默认超时
  4. 任务正在 failover,状态不稳定

解决方案:

  1. 确认任务处于 RUNNING 且无持续反压后再触发 Savepoint
  2. 检查 Savepoint 目录(如 state.savepoints.dir)权限与剩余空间
  3. 大状态任务通过命令行加大超时,或改用 Checkpoint 进行恢复
  4. 若只是停机升级,可使用 stop-with-savepoint;若失败可退化为从最近一次成功 Checkpoint 恢复
1.5 从Checkpoint/Savepoint恢复失败​

错误信息: Cannot map checkpoint/savepoint state for operator xxx to the new program / Max parallelism mismatch / state schema incompatible.

问题原因:

  1. 任务拓扑发生变化(新增/删除算子)且算子未设置稳定的 uid
  2. 修改了并行度但超过了原 maxParallelism 上限
  3. 状态数据结构(Schema/序列化器)发生不兼容变更
  4. 状态文件损坏或路径不正确

解决方案:

  1. 为关键算子显式设置 uid,保证拓扑变更后状态可映射
  2. 恢复时允许跳过无法映射的状态:--allowNonRestoredState(确认可接受状态丢失再使用)
  3. maxParallelism 一经确定不可随意更改,扩并行度需在其上限内
  4. 若状态确实不兼容,停止任务后以无状态方式重新发布,并重新做一次全量同步
  5. 确认恢复路径指向完整的 _metadata 文件而非中间目录
1.6 反压(Backpressure)导致同步停滞​

问题描述: Flink Web UI 的 Backpressure 页面显示算子为 HIGH,吞吐下降、延迟升高、Checkpoint 频繁超时。

问题原因:

  1. 下游 Sink 写入慢(目标库索引多、单条 insert、网络 RTT 高、目标库反压)
  2. 某算子计算重(复杂 UDF、维表查询无缓存)
  3. 并行度不足,单并行度处理不过来
  4. 数据倾斜,个别 subtask 成为瓶颈
  5. 目标库锁等待、表空间不足等导致写入阻塞

解决方案:

  1. 用 Web UI 自上而下定位:第一个变红(HIGH)的算子的下游就是瓶颈所在
  2. Sink 瓶颈:开启批量写入、增大 batch size 与 flush 间隔、为目标表建合适索引、增大 Sink 并行度
  3. 计算瓶颈:为维表查询加缓存、优化 UDF、提升该算子并行度
  4. 数据倾斜:见 1.16
  5. 检查目标库是否存在锁、磁盘满、连接数打满等(参见本手册"目的地连接问题"章节)
1.7 任务反复重启(Restart Loop)​

错误信息: Job xxx switched from state RUNNING to RESTARTING / FAILING,并在短时间内循环。

问题原因:

  1. 存在持续性根因(如目标库连接失败、源库位点失效、序列化异常),每次重启都立刻再次失败
  2. 重启策略配置过于激进,掩盖了真实错误
  3. 资源不足导致 task 无法长时间稳定运行
  4. 周期性的网络/依赖服务抖动

解决方案:

  1. 不要只看"重启"现象,务必翻到第一次 FAILED 的根因异常(Web UI Exceptions 页 / JobManager 日志中第一条 root cause)
  2. 配置合理的重启策略,避免无限快速重启: restart-strategy: fixed-delay restart-strategy.fixed-delay.attempts: 3 restart-strategy.fixed-delay.delay: 30 s 或 exponential-delay 退避策略
  3. 针对根因解决(连接、位点、Schema、资源等)后再恢复任务
  4. 反复失败且已耗尽重启次数的任务会进入 FAILED,需修复根因后重新发布
1.8 Slot资源不足NoResourceAvailableException​

错误信息: org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException: Could not acquire the minimum required resources / Slot request bulk is not fulfillable.

问题原因:

  1. 集群可用 Slot 总数小于任务所需(并行度 × 任务数 超过 TaskManager 提供的 Slot)
  2. TaskManager 数量或单 TM 的 numberOfTaskSlots 配置过少
  3. 前序任务未释放 Slot,资源被占满
  4. Session 模式下多个任务争抢有限资源

解决方案:

  1. 核对所需 Slot:作业最大并行度即至少需要的 Slot 数(同一 SlotSharingGroup 内算子共享)
  2. 增加资源:提升 taskmanager.numberOfTaskSlots,或增加 TaskManager 实例数
  3. 降低任务并行度(parallelism.default 或任务级并行度)以匹配现有资源
  4. 清理/下线不再需要的历史任务,释放被占用的 Slot
  5. 资源扩容涉及集群配置变更,通常需运维协助
1.9 TaskManager心跳超时/失联​

错误信息: Heartbeat of TaskManager with id xxx timed out / Connection unexpectedly closed by remote task manager.

问题原因:

  1. TaskManager 进程因 OOM 被系统 Kill 或崩溃退出
  2. 长时间 Full GC(STW)导致心跳无法及时上报
  3. 网络抖动或机器负载过高
  4. 容器被资源管理器(YARN/K8s)因超限驱逐

解决方案:

  1. 检查对应 TM 是否还存活;若已退出,查看其退出前日志(OOM、被 Kill 的记录)
  2. GC 问题见 1.15;内存问题见 1.11~1.14
  3. 适当放宽心跳超时以容忍偶发抖动(不能掩盖真实 OOM): heartbeat.timeout: 120000 heartbeat.interval: 10000
  4. 检查 K8s/YARN 是否因内存超 limit 驱逐容器,必要时调大容器内存配额
1.10 Akka/RPC调用超时​

错误信息: akka.pattern.AskTimeoutException: Ask timed out on [Actor...] after [10000 ms] / Could not complete the operation. Number of retries...

问题原因:

  1. JobManager 或 TaskManager 负载过高、GC 严重,RPC 响应缓慢
  2. 大量任务/大并行度导致 JM 元数据操作变慢
  3. 网络延迟过高
  4. 默认 ask timeout 偏小

解决方案:

  1. 适当增大 RPC 超时: akka.ask.timeout: 60 s web.timeout: 60000
  2. 排查 JM/TM 的 GC 与 CPU 负载,必要时给 JobManager 增加内存
  3. 减少单集群上的任务数量或降低并行度,减轻 JM 压力
  4. 检查节点间网络连通与延迟
1.11 TaskManager内存溢出(堆OOM)​

错误信息: java.lang.OutOfMemoryError: Java heap space

问题原因:

  1. 算子在堆内累积过多对象(大窗口、全量缓存、维表全量加载)
  2. 单条记录过大或批量缓冲过大
  3. TaskManager 堆内存(taskmanager.memory.task.heap.size)配置过小
  4. 内存泄漏(自定义函数中持有大对象)

解决方案:

  1. 增大 TaskManager 总内存:taskmanager.memory.process.size: 4096m(按需上调)
  2. 大状态场景改用 RocksDB 状态后端,将状态放到磁盘而非堆内
  3. 减小单批数据量,避免一次性加载全表到内存
  4. 检查自定义 UDF/维表是否无界缓存,加上容量上限或 TTL
  5. 保留 OOM 时的 heap dump 以便定位泄漏: env.java.opts: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path
1.12 Metaspace内存溢出​

错误信息: java.lang.OutOfMemoryError: Metaspace

问题原因:

  1. 任务频繁提交/重启,旧 ClassLoader 未被回收,类元数据持续累积(典型于 Session 集群)
  2. 用户 jar 引入大量类或动态生成类(如频繁编译代码生成)
  3. taskmanager.memory.jvm-metaspace.size 配置过小

解决方案:

  1. 增大 Metaspace:taskmanager.memory.jvm-metaspace.size: 512m
  2. Session 模式下避免在同一 TM 上反复提交大量任务;问题严重时重启 TM 释放
  3. 排查类加载泄漏,确认连接器/驱动未在静态变量中残留引用
  4. 优先使用 Application 模式(每个作业独立 JVM),从根本上规避跨任务的 Metaspace 累积
1.13 堆外/直接内存溢出(Direct/Network Buffer)​

错误信息: java.lang.OutOfMemoryError: Direct buffer memory / Insufficient number of network buffers.

问题原因:

  1. 网络 buffer 不足(高并行度、shuffle 重的拓扑需要更多 buffer)
  2. 堆外内存(taskmanager.memory.framework.off-heap / task.off-heap)配置不足
  3. 使用了大量 Netty 直接内存的连接器

解决方案:

  1. 网络 buffer 不足时增大网络内存占比或总内存: taskmanager.memory.network.fraction: 0.2 taskmanager.memory.network.max: 1gb
  2. 适当增大堆外内存:taskmanager.memory.task.off-heap.size: 256m
  3. 过高的并行度会放大网络 buffer 需求,评估是否并行度设置过大
  4. 整体上调 taskmanager.memory.process.size 让各区域按比例增大
1.14 托管内存与RocksDB内存超限被Kill​

错误信息: 容器被 K8s/YARN 因超内存 limit 杀掉(OOMKilled / Container killed by YARN for exceeding memory limits)。

问题原因:

  1. RocksDB 实际使用内存超过 Flink 托管内存预算(block cache、write buffer 累加)
  2. 容器内存 limit 与 Flink process.size 之间未留出足够 JVM overhead
  3. 托管内存(taskmanager.memory.managed)配置偏小,RocksDB 频繁 spill 又被系统计入

解决方案:

  1. 适当增大托管内存占比:taskmanager.memory.managed.fraction: 0.4
  2. 让 RocksDB 受 Flink 内存管控(默认开启),不要手动放开 RocksDB 内存上限
  3. 增大 JVM overhead 留白,避免容器层面超 limit: taskmanager.memory.jvm-overhead.fraction: 0.1 taskmanager.memory.jvm-overhead.max: 1gb
  4. 容器 limit 应略大于 process.size,给 native 内存留余量
1.15 频繁Full GC导致任务卡顿​

问题描述: 任务周期性卡顿、心跳超时、Checkpoint 抖动;GC 日志显示频繁/长时间 Full GC。

问题原因:

  1. 堆内存偏小或对象创建/晋升过快
  2. 大状态全部放堆内(未用 RocksDB)
  3. 存在内存泄漏,老年代持续增长
  4. 数据倾斜使个别 TM 内存压力大

解决方案:

  1. 增大堆内存或改用 RocksDB 把状态移出堆
  2. 切换到更适合大堆的 GC(如 G1),并开启 GC 日志观察: env.java.opts: -XX:+UseG1GC -Xlog:gc*:file=/path/gc.log
  3. 排查并修复内存泄漏(heap dump 分析)
  4. 缓解数据倾斜(见 1.16)
1.16 数据倾斜导致单并行度过载​

问题描述: Web UI 上个别 subtask 的 records/bytes 远高于其它,该 subtask 持续反压、Checkpoint ack 最慢。

问题原因:

  1. keyBy / 分区键分布不均(如大量数据集中在某几个 key)
  2. 源表某个分片数据量远大于其它(CDC chunk 切分不均)
  3. 热点主键、空值 key 集中

解决方案:

  1. 优化分区键,避免使用低基数或高度集中的字段作为 key
  2. 对热点 key 做打散(加随机前缀两阶段聚合),聚合后再合并
  3. CDC 快照阶段可调小 chunk size 让分片更均匀: scan.incremental.snapshot.chunk.size: 8096
  4. 评估是否可在 Source 端过滤掉无意义的热点/空值数据
1.17 Watermark不推进导致窗口不触发​

问题描述: 基于事件时间的窗口/聚合迟迟不输出结果,下游"没有数据"。

问题原因:

  1. 某个并行 source/分区无数据,watermark 取所有分区最小值而被卡住(空闲分区问题)
  2. 事件时间字段存在异常值(远小于真实时间),拉低 watermark
  3. 乱序程度超过设定的 watermark 容忍,或根本未正确分配 watermark

解决方案:

  1. 为可能空闲的源配置空闲检测,让空闲分区不阻塞 watermark: table.exec.source.idle-timeout: 30 s
  2. 检查并清洗事件时间字段,剔除异常时间值
  3. 合理设置乱序容忍度(watermark 延迟),与业务乱序程度匹配
  4. 确认 source 已正确分配时间戳与 watermark 策略

2. CDC连接器专项​

2.1 快照阶段一直卡住无进度​

问题描述: 任务启动后长时间停留在全量快照阶段,Web UI 显示 source 一直在读取,下游无数据写入。

问题原因:

  1. 全量表数据量极大,快照本身就需要较长时间(属正常,但需评估)
  2. 快照查询在源库被慢查询/锁阻塞,或源库负载高
  3. chunk 切分键选择不当(无主键或主键分布极不均),导致个别 chunk 巨大
  4. 下游写入慢造成反压,回压到 source 使快照变慢
  5. 快照阶段默认不切 Checkpoint,给人"卡住"的错觉

解决方案:

  1. 评估源表行数,预估快照时长;大表属正常耗时
  2. 在源库查看是否存在该任务发起的慢查询或锁等待,必要时优化
  3. 调整 chunk 大小让分片更均匀:scan.incremental.snapshot.chunk.size: 8096
  4. 排查下游反压(见 1.6),消除 Sink 瓶颈
  5. 若只需增量,可将启动模式设为 latest-offset 跳过全量快照(确认不需要存量数据再使用): scan.startup.mode: latest-offset
2.2 快照阶段OOM/全表加载内存爆掉​

错误信息: 快照阶段 java.lang.OutOfMemoryError: Java heap space,或读取大表时 TM 崩溃。

问题原因:

  1. 单个 chunk 过大,一次性拉取过多行到内存
  2. 表中存在超大字段(LOB、长文本、BLOB),单行内存占用高
  3. JDBC fetch size 过大或驱动一次性加载结果集
  4. TaskManager 堆内存偏小

解决方案:

  1. 调小 chunk size,减少单次内存占用:scan.incremental.snapshot.chunk.size: 4096
  2. 增大 TaskManager 内存(见 1.11)
  3. 对超大字段表评估是否必须同步该字段,能裁剪则裁剪
  4. 确认采用增量快照(incremental snapshot)而非一次性全表快照
2.3 增量阶段Binlog位点失效​

错误信息: The connector is trying to read binlog starting at ... but this is no longer available on the server / Could not find first log file name in binary log index file.

问题原因:

  1. 任务停机时间过长,所需起始 binlog 已被源库按 expire 策略清理
  2. 源库做过 reset master 或 binlog 被手动清理
  3. 主从切换后位点不连续(GTID 不一致)

解决方案:

  1. 延长源库 binlog 保留时间,避免位点被过早清理(见本手册 MySQL 1.4 相关说明): SET GLOBAL binlog_expire_logs_seconds = 604800; -- 保留7天
  2. 位点已失效且无法续传时,需重新做一次全量同步以重建一致状态
  3. 使用 GTID 模式可提升主从切换后的位点连续性
  4. 制定停机上限(小于 binlog 保留期),避免任务长时间停机后无法续传
2.4 server-id冲突导致Binlog连接被断开​

错误信息: A slave with the same server_uuid/server_id as this slave has connected to the master(连接被反复踢下线)。

问题原因:

  1. 多个 CDC 任务/并行 source 使用了相同的 server-id
  2. 并行快照下每个并行度需要唯一 server-id,但只配置了单个值
  3. 与已有的真实从库 server-id 冲突

解决方案:

  1. 为每个 CDC 任务分配唯一的 server-id;并行 source 需配置一段范围: server-id: 5400-5404
  2. 范围大小应不小于 source 并行度,且与其它任务、真实从库互不重叠
  3. 规划全局 server-id 分配规则,避免多任务撞号
2.5 心跳/连接超时被MySQL主动断开​

错误信息: Communications link failure / The last packet successfully received from the server was X ms ago。

问题原因:

  1. 低峰期源表长时间无变更,连接空闲超过 wait_timeout 被服务端断开
  2. 网络设备(防火墙/LB)对空闲长连接做了超时回收
  3. 源库 net_write_timeout / wait_timeout 偏小

解决方案:

  1. 开启 CDC 心跳,定期发送心跳保活连接: heartbeat.interval: 30 s
  2. 适当调大源库相关超时(需 DBA 评估): SET GLOBAL wait_timeout = 28800;
  3. 检查中间网络设备的空闲连接回收策略,必要时放宽
  4. 确认网络稳定性,排查丢包
2.6 表无主键导致并行快照报错​

错误信息: 'scan.incremental.snapshot.enabled' is true but the table xxx does not have a primary key / chunk key column not found.

问题原因:

  1. 增量快照需要一个分片键(默认主键)来切分 chunk,表无主键时无法自动切分
  2. 联合主键或无唯一键场景未指定 chunk key

解决方案:

  1. 为表显式指定一个分布均匀的列作为 chunk key: scan.incremental.snapshot.chunk.key-column: id
  2. 该列应有索引、基数高、分布均匀,否则切分不均(见 1.16)
  3. 确实无合适列时,可关闭增量快照退化为单并行度快照(吞吐下降)
  4. 从根本上建议为同步表补充主键/唯一键
2.7 DDL变更导致解析失败/任务中断​

错误信息: Schema change detected / Encountered change event for table whose schema isn't known / DDL 解析报错导致任务失败。

问题原因:

  1. 同步运行期间源表执行了 DDL(加列、改类型、改名)
  2. CDC 的 schema history 与当前表结构不一致
  3. 不兼容的结构变更(删列、改主键)破坏了下游映射

解决方案:

  1. 尽量避免在同步运行期间对源表做 DDL;必须变更时先停任务、变更后再启动
  2. 兼容性变更(末尾加列)多数可平滑处理,确认连接器已开启 schema 变更捕获
  3. 不兼容变更(删列/改主键/改类型)通常需重建任务并重新全量同步
  4. 与本手册"任务运行问题 2.3 Schema获取失败"配合排查 schema history 丢失问题
2.8 时间/Decimal/二进制类型解析异常​

错误信息: 常见为时间值溢出(见本手册 SQLServer 3.6 datetime2)、Decimal 精度丢失或被 Base64 编码、tinyint(1) 被解析为 boolean 等。

问题原因:

  1. Java/Flink 时间类型上限为 2262-04-11,超大日期解析报错
  2. Debezium 对 decimal 默认采用 precise(字节)模式,下游表现为乱码/Base64
  3. MySQL tinyint(1) 被默认当作 boolean 处理
  4. 二进制/枚举类型映射策略与下游期望不一致

解决方案:

  1. 超大日期问题见 SQLServer 3.6,建议源端控制日期范围或目标字段用字符串
  2. Decimal 选择合适的处理模式,避免精度丢失或编码问题: decimal.handling.mode: string (或 double,按精度需求选择)
  3. 控制 tinyint(1) 行为,避免被强转 boolean: tinyInt1isBit=false(JDBC 连接参数)
  4. 二进制类型选择合适的 binary.handling.mode(bytes / base64 / hex)与下游约定一致
2.9 Kafka Sink写入超时/批量过大​

错误信息: (参见本手册"明道云工作表问题 1.1"的 Kafka 异常族)TimeoutException: Expiring records after 30000ms / RecordTooLargeException: The message is larger than the maximum request size.

问题原因:

  1. 单条/单批消息超过 Kafka 的 message.max.bytes / max.request.size
  2. Broker 不可用、网络抖动或分区 leader 选举中
  3. 生产端 buffer 不足或 ack 等待超时
  4. 一次同步的数据量过大(大字段、多字段宽表)

解决方案:

  1. 增大生产端与 Broker 的消息上限(两侧都要调): max.request.size、message.max.bytes、replica.fetch.max.bytes
  2. 适当增大超时与重试:request.timeout.ms、delivery.timeout.ms、retries
  3. 减小单批数据量、裁剪不必要的大字段(见"任务创建问题 1.3 消息大小超限")
  4. Broker/重平衡类问题按本手册 1.1 的"重新发布 + 运维支持"流程处理
2.10 数据序列化/反序列化失败​

错误信息: com.esotericsoftware.kryo.KryoException / Could not forward element to next operator / SerializationException。

问题原因:

  1. 数据中包含连接器无法识别的类型或脏数据(编码异常、非法字符)
  2. 上下游 Schema 不一致导致字段错位
  3. 自定义类型未注册序列化器,回退到 Kryo 失败
  4. 源端字符集与解析配置不匹配(见本手册 MySQL 1.8 字符集问题)

解决方案:

  1. 定位报错的具体记录(开启 source 端日志或抽样),确认是否为脏数据
  2. 统一上下游 Schema 与字段类型映射
  3. 自定义 POJO 提供明确的 TypeInformation,避免回退 Kryo
  4. 校正源端字符集/时区配置(参见 MySQL 1.7、1.8)
  5. 对个别脏数据可在 Source 端做容错过滤,避免单条数据拖垮整个任务
2.11 多表/分库分表合并同步问题​

问题描述: 将多张分表/分库表合并到一张下游表时,出现主键冲突、数据错乱或部分表不同步。

问题原因:

  1. 各分表主键在合并后不再全局唯一,产生主键冲突
  2. 表名正则未覆盖全部分表,遗漏部分表
  3. 各分表结构存在细微差异,合并时字段不对齐
  4. 重复发布导致全量重新写入(参见"明道云工作表 1.2/1.4"重复发布问题)

解决方案:

  1. 合并场景为下游设计全局唯一键(如 库名+表名+原主键 或新增分布式ID)
  2. 用正则正确匹配所有分库分表(database-name / table-name 支持正则)
  3. 确认所有分表结构一致,差异字段做统一处理
  4. 重新发布前评估是否会触发全量,避免重复全量写入造成冲突

3. 部署运维与诊断​

3.1 类加载冲突(LinkageError/NoSuchMethod)​

错误信息: java.lang.LinkageError / NoSuchMethodError / java.lang.NoSuchFieldError / loader constraint violation。

问题原因:

  1. 用户 jar 与 Flink lib 中存在同一依赖的不同版本(如 guava、jackson、netty)
  2. 连接器 jar 重复放置(既在 lib 又打进作业 jar)
  3. 子类优先/父类优先的类加载策略与依赖打包方式不匹配

解决方案:

  1. 排查冲突依赖,对作业 jar 中与 Flink 自带冲突的库做 shade(重定位)或 provided
  2. 避免把 flink 核心、连接器同时打入作业 jar,连接器统一放 lib 或统一打包,二选一
  3. 必要时调整类加载顺序: classloader.resolve-order: parent-first (默认 child-first,冲突时可试 parent-first)
  4. 确认 lib 下无同一连接器的多个版本 jar
3.2 依赖jar缺失(ClassNotFound/NoClassDefFound)​

错误信息: java.lang.ClassNotFoundException / NoClassDefFoundError,常见于找不到连接器或 JDBC 驱动类。

问题原因:

  1. 对应连接器/数据库驱动 jar 未放入 Flink lib 或未打进作业 jar
  2. SQL 作业缺少对应的 connector 依赖
  3. 驱动 jar 版本与数据库不匹配
  4. jar 放置位置不被类加载器加载

解决方案:

  1. 将所需连接器 jar(如 flink-sql-connector-mysql-cdc)与 JDBC 驱动放入 $FLINK_HOME/lib 后重启集群
  2. 确认 jar 与 Flink、数据库版本相互兼容
  3. Application/Per-Job 模式下确认依赖随作业一并分发到各节点
  4. 放置 lib 后必须重启 TaskManager/JobManager 才会加载
3.3 JobManager HA与Zookeeper异常​

错误信息: Connection to ZooKeeper suspended / Could not retrieve the leader address / leader election 反复切换。

问题原因:

  1. Zookeeper 集群不稳定或网络抖动,导致 leader 会话超时
  2. HA 存储路径(high-availability.storageDir)不可写或被清理
  3. 多个集群误用同一 HA cluster-id,相互干扰
  4. JM GC 过长导致 ZK 会话超时丢失 leader

解决方案:

  1. 检查 Zookeeper 集群健康与网络连通,确保会话稳定
  2. 确认 HA 存储目录可访问、有写权限、空间充足
  3. 为每个集群配置唯一的 high-availability.cluster-id
  4. 适当增大 ZK 会话超时以容忍偶发抖动: high-availability.zookeeper.client.session-timeout: 60000
  5. 排查 JM GC(见 1.15),避免长 STW 丢 leader
3.4 任务提交失败/Web UI无法访问​

错误信息: 提交任务报连接被拒、上传 jar 失败、或 Web UI(默认 8081)打不开。

问题原因:

  1. JobManager 未启动或已崩溃
  2. REST/Web 端口被占用、被防火墙拦截或映射错误
  3. 上传 jar 超过大小限制或上传目录无写权限
  4. 集群与集成中心之间网络不通(参见"任务创建问题 1.2 文件上传失败")

解决方案:

  1. 确认 JobManager 进程存活,查看其启动日志是否报错
  2. 检查 rest.port / rest.address 配置与端口连通性(telnet 测试)
  3. 上传相关:检查 web.upload.dir 权限与磁盘空间,必要时调大上传大小限制
  4. 打通集群与集成中心网络(防火墙、端口、安全组),与本手册 1.2 配合排查

五、排查方法论与故障处理建议​

说明:本章为通用排查指引,适用于全文各类数据源/目的地/引擎问题。建议先做前置检查(1),按方法论分层定位(2),再对照参数调优清单(3)与自助排查速查表(4)处理。绝大多数连接、权限、位点、类型、参数类问题均可自助解决;仅当需要调整集群参数(flink-conf.yaml)、扩容资源或确认平台侧缺陷时,再携带任务ID与完整堆栈联系研发/运维。

1. 前置检查​

1.1 数据源配置检查​

检查要点:

  1. 数据库配置:
  • 确认数据库版本是否符合要求
  • 验证数据库用户权限是否完整
  • 检查所需功能是否开启(如binlog、CDC、补充日志、复制槽等)
  1. 连接参数:
  • 检查连接地址和端口是否正确
  • 确认账号密码是否正确
  • 验证连接参数格式是否规范(如 SSL、时区、字符集、zeroDateTimeBehavior 等)
  1. 数据库状态:
  • 检查数据库运行状态
  • 确认数据库负载情况
  • 验证数据库连接数是否充足
  • ......
1.2 权限完整性检查​

检查要点:

  1. MySQL权限要求:
  • SELECT权限(读取数据)
  • REPLICATION CLIENT(读取binlog)
  • REPLICATION SLAVE(订阅binlog)
  • SHOW DATABASES(库表结构)
  1. Oracle权限要求:
  • SELECT ANY TABLE
  • EXECUTE_CATALOG_ROLE
  • SELECT ANY TRANSACTION
  • LOGMINING
  1. SQLServer权限要求:
  • db_owner角色
  • CDC相关权限
  • 数据库级别的读写权限
  1. 目的地写入权限:
  • 目标表的 INSERT / UPDATE / DELETE 权限(避免 command denied,见二.2.4)
1.3 网络连通性检查​

检查要点:

  1. 网络环境:
  • 确认防火墙配置
  • 检查端口开放情况
  • 验证网络延迟情况
  1. 连通性测试:
  • telnet测试端口连通性
  • ping测试网络可达性
  • 使用客户端工具测试连接
  1. 网络稳定性:
  • 检查网络波动情况
  • 验证带宽是否足够
  • 确认是否存在网络丢包

2. 故障定位与日志排查​

2.1 日志排查方法论​

排查任何同步异常时,建议遵循固定顺序,避免被"重启""超时"等表象误导:

  1. 保留关键信息:记录错误发生时间点、保存完整错误信息与堆栈、任务ID;必要时保留 heap dump / GC log 等现场证据。
  2. 分层看日志:
    • 任务/运行日志:任务启动日志、运行状态变更、异常中断记录
    • 系统日志:系统资源使用情况、系统异常信息、关键时间点
  3. Flink 引擎类问题先看 Web UI:
    • Overview 看任务状态与 failover 次数
    • Exceptions 页看 Root Exception 与 timeline(第一条根因最重要)
    • Checkpoints 页看成功率、耗时、最慢 subtask
    • Backpressure 页自上而下定位瓶颈算子
  4. 再看 JobManager 日志:定位作业级别的调度、failover、资源、leader 等问题。
  5. 然后看出问题的 TaskManager 日志:定位算子级别的异常、OOM、连接错误、GC。
  6. 抓住"第一现场":循环重启时,永远找第一次 FAILED 的 root cause,而不是最后一次。
  7. GC 与内存:开启 GC 日志,结合第四章 1.11~1.15 判断是堆、Metaspace、直接内存还是托管内存问题。
2.2 常见问题排查​

排查步骤:

  1. 连接问题:
  • 验证数据源是否可访问
  • 检查认证信息是否正确
  • 确认网络环境是否稳定
  1. 同步异常:
  • 检查源表结构是否变更
  • 验证数据一致性
  • 查看增量数据捕获状态
  1. 性能问题:
  • 检查资源使用情况
  • 分析任务执行瓶颈
  • 评估优化可能性

3. 关键参数调优清单​

以下为同步任务最常调整的参数(具体以所用 Flink 版本为准;集群级参数改动通常需运维介入):

  1. 内存类:
    • taskmanager.memory.process.size(TM 总内存,最常上调)
    • taskmanager.memory.managed.fraction(RocksDB/批处理托管内存占比)
    • taskmanager.memory.jvm-metaspace.size(Metaspace)
    • taskmanager.memory.network.fraction / .max(网络 buffer)
    • jobmanager.memory.process.size(JM 总内存)
  2. Checkpoint 类:
    • execution.checkpointing.interval(间隔)
    • execution.checkpointing.timeout(超时)
    • execution.checkpointing.tolerable-failed-checkpoints(容忍失败次数)
    • execution.checkpointing.unaligned(非对齐,缓解反压下的 Checkpoint)
    • state.backend: rocksdb / state.backend.incremental: true(大状态)
  3. 容错类:
    • restart-strategy(fixed-delay / exponential-delay)
    • restart-strategy.fixed-delay.attempts / .delay
    • heartbeat.timeout / heartbeat.interval
    • akka.ask.timeout
  4. 资源/并行度:
    • parallelism.default(默认并行度)
    • taskmanager.numberOfTaskSlots(单 TM Slot 数)
  5. CDC 连接器类:
    • scan.incremental.snapshot.chunk.size(chunk 大小)
    • scan.incremental.snapshot.chunk.key-column(无主键时指定 chunk key)
    • server-id(唯一/区间)
    • scan.startup.mode(initial / latest-offset 等)
    • heartbeat.interval(连接保活)
    • decimal.handling.mode / debezium.* 类型处理

4. 自助排查速查表​

下表"对应小节"中的引擎类问题(1.x / 2.x / 3.x)指向第四章 Flink 引擎异常排查。

现象优先怀疑对应小节
Checkpoint 频繁失败/超时反压、状态过大、状态后端四.1.1 1.2 1.3 1.6
任务不停重启找第一次 FAILED 根因四.1.7
启动报 NoResourceAvailableSlot 不足,需扩容或降并行度四.1.8
TM 频繁失联/被 KillOOM、GC、容器超 limit四.1.9 1.11~1.15
各种 OutOfMemoryError区分堆/Metaspace/直接/托管四.1.11~1.14
同步变慢、延迟升高反压、数据倾斜四.1.6 1.16
全量快照很久不动大表/反压/chunk 不均四.2.1 2.2
增量突然断且无法续传binlog 位点失效四.2.3
连接被反复断开server-id 冲突、空闲超时四.2.4 2.5
字段值为 NULL / 类型乱码补充日志/类型处理模式四.2.8(及一.Oracle 2.10)
ClassNotFound / NoSuchMethod缺 jar 或版本冲突四.3.1 3.2
Web UI 打不开/提交失败JM 状态、端口、网络四.3.4
数据源连接/认证/位点类对应数据库专项一、各库小节
目的地写入冲突/超长/权限对应目的地专项二、各目的地小节

自助排查建议:先用本章 2.1 的方法论锁定"第一现场"根因,再对照本速查表跳转到对应小节。

這篇文件對你有幫助嗎?