背景
用flink实时同步原mysql表数据到备份表,其中处理某一条数据时报了如下异常
switched from RUNNING to FAILED on org.apache.flink.rutime.jobmaster.slotpool.SingleLoginSlot
com.mysql.cj.jdbc.exceptions.MysqlDataTraction:Out of range value for column 'type' at row 1
原表与备份表建表语句一致为
CREATE TABLE `rule_filter` (
`id` bigint(30) NOT NULL AUTO_INCREMENT,
`platform` varchar(100) NOT NULL DEFAULT '',
`ver` int(4) NOT NULL DEFAULT '0',
`channel` int(4) DEFAULT '0',
`type` tinyint(3) unsigned NOT NULL DEFAULT '0',
`value` varchar(200) NOT NULL DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`expired` tinyint(3) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `p_c_v_s` (`platform`,`channel`,`ver`,`type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;
将报错的那条数据找出来分析发现,原表中这条数据是首次创建,而备份表中的数据由唯一键限制的已经存在,奇怪的是备份表的数据都是由原表用flink实时同步而来,跟开发业务开发人员确认后发现,原表他们采用的是物理删除,某一条数据过期失效则先失效再物理删除,这样就会导致某一条数据过期备份表中数据已经同步入库且原表中主键已经变化,而原表再增加唯一主键的一条记录就无法同步至备份表中,更新备份表中的数据,解决办法是删除备份表中的唯一主键,当数据过期时,将过期标记置1,当再有原表相同主键插入时,由于原表主键已经变化,则重新插入一条新的记录,查询时以未过期数据为准