标签
列错位 otter cannal 没有主键
版本说明
manager:manager.deployer-4.2.18
bug 复现
首先是两端是库级别的同步,
-----在源端创建一张没有主键的表
---- 插入一些数据
-----otter 管理平台报没有主键 ,数据不能同步
-----源端删除表
-----源端再创建一张有主键的表
-----源端再插入数据
------目标端的列会往下挪一列,并且把最后那一列删掉了。
步骤如下:
创建一张不带主键的表:
CREATE TABLE `org_positionorg_temp` (
`ORGID` decimal(10,0) DEFAULT NULL,
`POSITIONID` decimal(10,0) DEFAULT NULL,
`STARTDATE` date DEFAULT NULL,
`ENDDATE` date DEFAULT NULL,
`ISMAIN` varchar(1) DEFAULT '',
`TENANT_ID` varchar(64) DEFAULT NULL,
`APP_ID` varchar(64) DEFAULT NULL,
`UPDSOURCE` varchar(1) DEFAULT NULL,
`LASTUPDATE` date DEFAULT NULL,
`MANDT` varchar(64) DEFAULT NULL,
`PLVAR` varchar(64) DEFAULT NULL,
`OTYPE` varchar(64) DEFAULT NULL,
`ISTAT` varchar(64) DEFAULT NULL,
`LANGU` varchar(64) DEFAULT NULL,
`SEQNR` varchar(64) DEFAULT NULL,
`RSIGN` varchar(10) DEFAULT NULL,
`RELAT` varchar(10) DEFAULT NULL,
`PRIOX` varchar(10) DEFAULT NULL,
KEY `PK_POSITIONID` (`POSITIONID`) USING BTREE,
KEY `PK_ORGID` (`ORGID`) USING BTREE,
KEY `PK_STARTDATE` (`STARTDATE`) USING BTREE,
KEY `PK_ENDDATE` (`ENDDATE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
插入一些数据:
insert into org_positionorg_temp values(xxx);
开始报错:
pid:8 nid:7 exception:setl:com.alibaba.otter.node.etl.select.exceptions.SelectException: com.alibaba.otter.node.etl.select.exceptions.SelectException: this rowdata has no pks , entry: header {
删除表:
drop table org_positionorg_temp;
创建表:
CREATE TABLE `org_positionorg_temp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ORGID` decimal(10,0) DEFAULT NULL,
`POSITIONID` decimal(10,0) DEFAULT NULL,
`STARTDATE` date DEFAULT NULL,
`ENDDATE` date DEFAULT NULL,
`ISMAIN` varchar(1) DEFAULT '',
`TENANT_ID` varchar(64) DEFAULT NULL,
`APP_ID` varchar(64) DEFAULT NULL,
`UPDSOURCE` varchar(1) DEFAULT NULL,
`LASTUPDATE` date DEFAULT NULL,
`MANDT` varchar(64) DEFAULT NULL,
`PLVAR` varchar(64) DEFAULT NULL,
`OTYPE` varchar(64) DEFAULT NULL,
`ISTAT` varchar(64) DEFAULT NULL,
`LANGU` varchar(64) DEFAULT NULL,
`SEQNR` varchar(64) DEFAULT NULL,
`RSIGN` varchar(10) DEFAULT NULL,
`RELAT` varchar(10) DEFAULT NULL,
`PRIOX` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `PK_POSITIONID` (`POSITIONID`) USING BTREE,
KEY `PK_ORGID` (`ORGID`) USING BTREE,
KEY `PK_STARTDATE` (`STARTDATE`) USING BTREE,
KEY `PK_ENDDATE` (`ENDDATE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;
再插入一些数据:
insert into org_positionorg_temp values(xxx);
开始报列错位了。
---Columns
EventColumn[index=1,columnType=3,columnName=ORGID,columnValue=30946164,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=2,columnType=91,columnName=POSITIONID,columnValue=,isNull=true,isKey=false,isUpdate=true]
EventColumn[index=3,columnType=91,columnName=STARTDATE,columnValue=,isNull=true,isKey=false,isUpdate=true]
EventColumn[index=4,columnType=12,columnName=ENDDATE,columnValue=1,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=5,columnType=12,columnName=ISMAIN,columnValue=default,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=6,columnType=12,columnName=TENANT_ID,columnValue=,isNull=true,isKey=false,isUpdate=true]
EventColumn[index=7,columnType=12,columnName=APP_ID,columnValue=,isNull=true,isKey=false,isUpdate=true]
EventColumn[index=8,columnType=91,columnName=UPDSOURCE,columnValue=,isNull=true,isKey=false,isUpdate=true]
EventColumn[index=9,columnType=12,columnName=LASTUPDATE,columnValue=800,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=10,columnType=12,columnName=MANDT,columnValue=01,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=11,columnType=12,columnName=PLVAR,columnValue=O,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=12,columnType=12,columnName=OTYPE,columnValue=1,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=13,columnType=12,columnName=ISTAT,columnValue=1,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=14,columnType=12,columnName=LANGU,columnValue=000,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=15,columnType=12,columnName=SEQNR,columnValue=B,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=16,columnType=12,columnName=RSIGN,columnValue=003,isNull=false,isKey=false,isUpdate=true]
EventColumn[index=17,columnType=12,columnName=RELAT,columnValue=2020.08.01,isNull=false,isKey=false,isUpdate=true]
---Sql
insert into `eoscommon`.`org_positionorg_temp`(`ORGID` , `POSITIONID` , `STARTDATE` , `ENDDATE` , `ISMAIN` , `TENANT_ID` , `APP_ID` , `UPDSOURCE` , `LASTUPDATE` , `MANDT` , `PLVAR` , `OTYPE` , `ISTAT` , `LANGU` , `SEQNR` , `RSIGN` , `RELAT` , `id`) values (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?) on duplicate key update `ORGID`=values(`ORGID`) , `POSITIONID`=values(`POSITIONID`) , `STARTDATE`=values(`STARTDATE`) , `ENDDATE`=values(`ENDDATE`) , `ISMAIN`=values(`ISMAIN`) , `TENANT_ID`=values(`TENANT_ID`) , `APP_ID`=values(`APP_ID`) , `UPDSOURCE`=values(`UPDSOURCE`) , `LASTUPDATE`=values(`LASTUPDATE`) , `MANDT`=values(`MANDT`) , `PLVAR`=values(`PLVAR`) , `OTYPE`=values(`OTYPE`) , `ISTAT`=values(`ISTAT`) , `LANGU`=values(`LANGU`) , `SEQNR`=values(`SEQNR`) , `RSIGN`=values(`RSIGN`) , `RELAT`=values(`RELAT`) , `id`=values(`id`)
Caused by: java.util.concurrent.ExecutionException: com.alibaba.otter.node.etl.load.exception.LoadException: com.alibaba.otter.node.etl.load.exception.LoadException: com.alibaba.otter.node.etl.load.exception.LoadException: org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [insert into `eoscommon`.`org_positionorg_temp`(`ORGID` , `POSITIONID` , `STARTDATE` , `ENDDATE` , `ISMAIN` , `TENANT_ID` , `APP_ID` , `UPDSOURCE` , `LASTUPDATE` , `MANDT` , `PLVAR` , `OTYPE` , `ISTAT` , `LANGU` , `SEQNR` , `RSIGN` , `RELAT` , `id`) values (? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ?) on duplicate key update `ORGID`=values(`ORGID`) , `POSITIONID`=values(`POSITIONID`) , `STARTDATE`=values(`STARTDATE`) , `ENDDATE`=values(`ENDDATE`) , `ISMAIN`=values(`ISMAIN`) , `TENANT_ID`=values(`TENANT_ID`) , `APP_ID`=values(`APP_ID`) , `UPDSOURCE`=values(`UPDSOURCE`) , `LASTUPDATE`=values(`LASTUPDATE`) , `MANDT`=values(`MANDT`) , `PLVAR`=values(`PLVAR`) , `OTYPE`=values(`OTYPE`) , `ISTAT`=values(`ISTAT`) , `LANGU`=values(`LANGU`) , `SEQNR`=values(`SEQNR`) , `RSIGN`=values(`RSIGN`) , `RELAT`=values(`RELAT`) , `id`=values(`id`)]; Data truncation: Incorrect date value: '1' for column 'ENDDATE' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: '1' for column 'ENDDATE' at row 1
这个报错大概的意思就是:
1 插入的字段是 ENDDATE ,而ENDDATE字段确是date类型,所以报类型不不匹配,而这个1 本来是要插入到ISMAIN 列的,但是却提前了一列,插入到了ENDDATE字段,
解决方案:
把ENDDATE 时间类型的,全部改成varchar类型,为了保证业务连续性,这时候先让数据同步过去,因为这个是临时表,等后续在补这个数据。
alter table org_positionorg_temp
modify column `STARTDATE` varchar(64) DEFAULT NULL,
modify column `ENDDATE` varchar(64) DEFAULT NULL,
modify column`LASTUPDATE` varchar(255) DEFAULT NULL;
暂无答案!
目前还没有任何答案,快来回答吧!