obloader导入数据时insert语句使用的插入字段用的是当时库中的表字段,而不是导出时data里的表字段

【 使用环境 】测试环境
【 OB or 其他组件 】ob-loader-dumper-4.3.3.1-RELEASE
【 使用版本 】ob-loader-dumper-4.3.3.1-RELEASE
【问题描述】obloader导入数据时insert语句使用的插入字段用的是当时库中的表字段,而不是导出时data里的表字段
【复现路径】
下面是我导出来data中的insert语句

INSERT INTO “TBBANKACC1” (“BANK_NO”,“BANK_ACC”,“TA_CLIENT”,“IN_CLIENT_NO”,“CLIENT_TYPE”,“OPEN_BRANCH”,“ACC_STATUS”,“TRANS_DATE”,“SIGNOFF_DATE”,“TABLE_NUM”,“RESERVE1”,“RESERVE2”,“RESERVE3”,“CARD_TYPE”,“OPEN_NET_NO”,“CURR_TYPE”,“IS_PENSION_ACC”,“MAIN_CARD”,“ACCOUNT_NO”,“MOBILE”,“PRD_TYPES”,“VOUCHER_TYPE”,“REAL_BANK_ACC”,“CONTRACT_NO”,“ACCOUNT_SEQ_NO”) VALUES (‘000’,‘1001GR001’,‘2020012100000097’,‘2020012100000053’,‘1’,‘100’,‘0’,20200121,0,’ ‘,’ ‘,‘0’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ');

假如我这个时候升级了表结构,也就是这个表多了一个字段,然后我再导入data
他会使用当前表里的表字段来进行插入,而不是使用我导出时的表字段,下面是bad日志里的内容

INSERT INTO “TBBANKACC1” (“BANK_NO”,“BANK_ACC”,“TA_CLIENT”,“IN_CLIENT_NO”,“CLIENT_TYPE”,“OPEN_BRANCH”,“ACC_STATUS”,“TRANS_DATE”,“SIGNOFF_DATE”,“TABLE_NUM”,“RESERVE1”,“RESERVE2”,“RESERVE3”,“CARD_TYPE”,“OPEN_NET_NO”,“CURR_TYPE”,“IS_PENSION_ACC”,“MAIN_CARD”,“ACCOUNT_NO”,“MOBILE”,“PRD_TYPES”,“VOUCHER_TYPE”,“REAL_BANK_ACC”,“CONTRACT_NO”,“ACCOUNT_SEQ_NO”,“MODIFY_DATE”)VALUES (‘000’,‘1001GR001’,‘2020012100000097’,‘2020012100000053’,‘1’,‘100’,‘0’,‘20200121’,‘0’,’ ‘,’ ‘,‘0’,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ‘,’ ');
Cause: The number of columns parsed does not match the number of columns in the table

但是后面的value还是之前导出时的value个数,他不会在最后自动补上一个字段的默认值
所以如果升级了表结构,就无法用之前导出的数据再进行导入了
我认为正确的情况应该是使用导出时的字段来进行导入,这样就不会有报错了
【附件及日志】

1 个赞

啥意思?没明白,你的意思是你导出的文件内容会发生变化????

就是他obloader导入的时候不是按照我导出的时候的表字段去导入的,而是按照导入的时候库里的表字段来导入的,因为中间的表加了一个字段,这样我之前导出的数据就白费了

你的意思 你修改了表结构 如果按照之前导出的内容导入到修改后的表结构中会报错是么?
ob的版本号查一下 SHOW VARIABLES like ‘version_comment’;

是的,因为obloader不会按照我之前导出的sql文件直接原封不动的刷进去,而是会查到我目前库里对应表的字段,然后拼接sql文件里的value,再刷进去,所以就导致了字段数量跟value值数量对不上
ob for oracle的版本是OceanBase 4.2.1.8 (r108000052024072217-77f9516419866bc291fc79b950b0865f2f4194e0) (Built Jul 22 2024 17:41:00)

所以我目前的处理方式是先导入,导入完之后,把报FAILURE的表重新用obclient -e"source xxx.sql"刷进去

这是预期内的,sql 会重新解析

可以试试把 --sql 改成 --mix,然后 -f 指定到具体文件