最近一客户在使用obloader工具,做一个表的恢复时,遇到了下面的错误:
$obloader -h xx -P xx -u xxxx - p 'xxxx' -c XXX -t XX - D xx --csv --table xxxx -f xxxxx.csv --external-data
[ERROR] Invalid char between encapsulated token and delimiter. Token Content: ,\E,0,79,\E,\E,. Line[1,18]
[WARN] Ignore parse first record. File : xxxxx..csv . Error : Invalid char between encapsulated token and delimiter. Token Content: ,\E0,79,\E,\E,. Line[1,18]
原因
导出时没有指定分割符,默认使用了“,” 分割,obdumper导出对于空值和空字符串的用\N和\E 默认预留的关键字, 导入时会因为关键字冲突,提示失败。导入时需要手动指定关键字
解决方法
--empty-string=Empty-String --null-string=Null-String
如果字段中的值有分割符或换行符同样会出现数据错乱,对于–line-separator 和–column-separator 需要指定一个特殊字符,值中有引号时,还需要指定一个默认的列定界符–column-delimiter.
和oracle 的sqlldr工具差不多,逻辑数据导入时难免有错误数据,在Oceanbase obloader时也有一些预制的错误日志,只要没有配置忽略选项。通过 OBLOADER 导入数据,并指定 --strict
选项跳过错误并继续进程,--strict
选项可与 --max-discards
或者 --max-errors
选项搭配使用,表示当重复数据量或者错误数在指定范围内,会跳过错误继续进程。
如有以下错误数据时:
错误类型 | 说明 |
---|---|
数据类型不匹配 | 例如:将 VARCHAR 类型数据插入到 INT 类型的列中。 |
非法的 NULL 值 | 设置了非空约束。 |
数据类型溢出 | 字符串超长或者整型超长。 |
预处理数据失败 | 使用控制文件,预处理函数调用失败。 |
列数不匹配 | 文件列数与数据库列数不匹配。 |
主键或者唯一键重复 | 表中的主键或者唯一键出现重复。 |
用户可以在 {ob-loader-dumper}/logs/ob-loader-dumper.bad
文件中查看数据类型不匹配/非法的 NULL 值/数据类型溢出/预处理数据失败/列数不匹配错误;在 {ob-loader-dumper}/logs/ob-loader-dumper.discard
文件中查看主键或者唯一键重复错误。
这个案例因为数据格式的错乱,在数据恢复紧急任务时浪费了大量的时间,建议如果表数据中格式较复杂时或有lob时,在oceanbase做表级导出时生成二进制格式文件,如Apache ORC,Apache Parquet文件。
obdumper和obloader V4支持标准的 CSV、Insert SQL、ORC、Parquet 等格式的数据文件。
我们某个客户大量的表导出使用的parquet格式。
ORC与Parquet对比
Apache Parquet 是一种列式存储格式,专为高效处理大规模数据而设计。它最初由 Twitter 和 Cloudera 开发,现在是 Apache 软件基金会的顶级项目。Apache ORC(Optimized Row Columnar)是一种高效的列式存储格式,由 Google Dremel 格式启发而来的列存格式,专为 Hadoop 生态系统中的大数据处理而设计。
1、orc不支持嵌套结构(但可通过复杂数据类型如map<k,v>间接实现),parquet支持嵌套结构
2、orc与hive的兼容性强,作为hive的常用存储格式
3、ORC支持 ZLIB、Snappy、LZO 等压缩算法,提供了轻量级的压缩元数据存储,压缩效果通常优于 Parquet。
4、orc导入数据和数据查询的的速度比parquet快
5, 生态兼容
- ORC:主要与 Apache Hive 紧密集成,适用于 Hadoop 和 Hive 生态。
- Parquet:广泛支持于 Apache Hadoop、Apache Spark、Apache Drill、Apache Impala、Apache Flink 等大数据工具和框架。
ORC | Parquet | 说明 |
---|---|---|
Footer+Metadata | FileMetadata | 描述每一个 Stripe/RowGroup 的元信息和统计信息。 |
Stripe | Row Group | Stripe 有一个 StripeFooter,而 Row Group 没有。 |
Row Group | Page | 都是最小的读取单位。 |

我们对于同一个14G(7000W记录)大小的表,在oceanbase中使用obdumper和obloader对比不同的参数:
版本 | 格式/参数 | 导出文件大小 | 导出耗时 | 导入耗时 |
4.2.4 | –orc | 743M | 7.956 min | 1.763 min |
4.2.4 | –par | 842M | 4.285 min | 2.333 min |
4.2.4 | –csv | 17G | 5.948 min | 3.178 min |
4.2.4 | –sql | 51G | 11.21 min | 2.740 min |
从 OceanBase 数据库 V4.3.5 版本开始,外表在原有的支持 CSV 格式文件的基础上,还支持读取 orc 和 parquet 格式文件,同时支持了通过Select Into导出Parquet和ORC格式文件的功能。