用flink实时同步原mysql数据到备份表报错

1 篇文章 0 订阅

背景
用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,当再有原表相同主键插入时,由于原表主键已经变化,则重新插入一条新的记录,查询时以未过期数据为准

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值