GBase 8a 数据库集群通过LOAD方式加载入库到一张表里面,当用户数据和表列定义出现不匹配是,会生成错误数据被忽略掉 skipped records, 用户可以通过max_bad_records参数设定最多错误行数,默认为不限制,如果超过则报Too many bad records错误。
目录导航
测试表
3个列的表,其中故意将name放在第一个,id放在第二个。
gbase> create table t_load5(name varchar(100),id int, birth date);
Query OK, 0 rows affected (Elapsed: 00:00:00.10)
测试数据
数据第一列数数字,第二列是字符串,与表定义不一致
cat /home/gbase/tload.txt
3,Third,2020-01-02
4,Fouth,2020-14-16
9999999999,MAX,2020-12-13
运行结果
加载时,我们指定了参数 max_bad_records 0, 也就是不允许一行错误数据。
看报错的核心信息 :DETAIL: (GBA-01-600) Gbase internal error: Task 1572915, Too many bad records!
base> load data infile 'sftp://gbase:gbase1234@10.0.2.107/home/gbase/tload.txt' into table t_load5 fields terminated by ',' max_bad_records 0;
ERROR 1733 (HY000): (GBA-01EX-700) Gbase general error: Task 1572915 failed, [10.0.2.107:5050](GBA-02AD-0005)Failed to query in gnode:
DETAIL: (GBA-01-600) Gbase internal error: Task 1572915, Too many bad records!
SQL: LOAD /*+ TID('2294178') */ DATA INFILE 'sftp://gbase:*********@10.0.2.107/home/gbase/tload.txt#offset=0&length=64&firstblock&ffsize=64' INTO TABLE `testdb`.`t_load5_n1` DATA_FORMAT 3 FILE_FORMAT UNDEFINED FIELDS TERMINATED BY ',' MAX_BAD_RECORDS 0 HOST '::ffff:10.0.2.107' CURRENT_TIMESTAMP 1599166897 SCN_NUMBE
解决方案
1、提高数据质量
2、确认加载表和数据的对应关系是否正常
3、提高允许的最大错误记录参数,默认是不限制。
总结
一般情况,都建议用户设置这个max_bad_records 参数,来限定最大的错误数据函数,来提高前端采集的数据质量。
在极端情况,如果用户确认,即使所有数据都无法入库也不影响,那么就不要设置这个最大允许错误记录的参数。 但错误数据的处理和保存,都将额外消耗系统资源。
其它加载相关报错信息,请参考