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 指定到具体文件

-f是到我备份的data路径,还是单个sql文件?

刚刚试了一下,发现–mix的方法会耗时更久,时间上跟–sql差了很多很多,具体内容是否正确,后续我再确认一下

–mix导入的速度确实很慢 这是预期内的

用了–mix之后,就能正常导入了,但是时间从40s增加到了30min,我还是用我之前的解决方案吧

多谢

发现一个新的问题,obdumper在导出数据的时候,会把里面的分号自动换行,导致我后续用obclient单独执行的时候,分号换行的位置被当成了单条sql执行进去了

是的会将分号换行,是你数据里面有分号么
设置一下换行符
image

是的,有分号,设置完之后就可以了,感谢