otter 列不一致的问题

fafcakar  于 2021-12-26  发布在  Java
关注(0)|答案(0)|浏览(667)
标签

列错位 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;

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题