OceanBase 数据库中的 LOAD DATA 语句的使用方式是什么?

本文主要介绍 OceanBase 数据库中 LOAD DATA 语句的使用方式。

适用版本

OceanBase 数据库 V2.X 版本

语法

LOAD DATA

的语法如下所示。

LOAD DATA [/*+ parallel(N) load_batch_size(M)*/] INFILE ‘file_name’ [REPLACE | IGNORE] INTO TABLE tbl_name [{FIELDS | COLUMNS} [TERMINATED BY ‘string’] [[OPTIONALLY] ENCLOSED BY ‘char’] [ESCAPED BY ‘char’] ] [LINES [STARTING BY ‘string’] [TERMINATED BY ‘string’] ] [IGNORE number {LINES | ROWS}] [(col_name_var [, col_name_var] …)]

说明

目前,OceanBase 数据库不支持 MySQL 数据库中

LOCAL INFILE

的语法加载数据文件。这是由于 OceanBase 是分布式数据库,读写数据由 Leader 节点进行,而 CSV 文件需要上传到 Leader 节点所在服务器才能加载,因此需要提供 NAS 文件系统进行文件存放。OceanBase 数据库中的

LOAD DATA

语句仅支持加载 OBServer 本地的输入文件。因此,用户需要在导入之前将文件拷贝到某台 OBServer 上。

LOAD DATA

目前可以对 CSV 格式的文本文件进行导入,整个导入的过程可以分为以下的流程:

  1. 解析文件:OceanBase 数据库会根据用户输入的文件名,读取文件中的数据,并且根据指定的并行度来决定并行或者串行解析输入文件中的数据。

  2. 分发数据:由于 OceanBase 是分布式数据库,各个分区的数据可能分布在各个不同的 OBServer,

    LOAD DATA

    会对解析出来的数据进行计算,决定数据需要被发送到哪个 OBServer。

  3. 插入数据:当目标 OBServer 收到数据后,在本地执行

    INSERT

    操作将数据插入到对应的分区当中。

为了提高

LOAD DATA

语句的性能,可以通过调整

load_batch_size

控制加载数据的并行度,

LOAD DATA

在解析文件、计算分区、数据分发阶段都可以多个线程并行工作。 但是,为了避免分布式事务对性能的影响,

LOAD DATA

会将每个 OBServer 上插入数据的过程作为一个事务进行提交,因此不建议在

LOAD DATA

过程中取消操作,如果在

LOAD DATA

语句执行过程中出现了错误,需要手动删除已经被加载的数据。

如果导入数据文件很大,每个节点插入数据的时间可能会很长,可根据需要调整

ob_query_timeout

变量,避免数据导入因超时而回滚。有关

ob_query_timeout

变量的详细信息,请参见《OceanBase 数据库 参考指南》中的 **系统变量 **章节。

参数

参数

描述

load_batch_size

加载数据的并行度。

REPLACE | IGNORE

如果遇到唯一键冲突,REPLACE 表示覆盖冲突行,IGNORE 表示忽略冲突行。

tbl_name

导入数据的表的名称。

TERMINATED BY

指定字段分隔符。

ENCLOSED BY

指定字段引用符。

ESACPED BY

指定转义字符。

LINES STARTING BY

指定行起始符。

LINES TERMINATED BY

指定行结束符。

IGNORES number { LINES | ROWS }

忽略前几行,

LINES

表示文件的前几行,

ROWS

表示由字段分隔符指定的前几行数据。

col_name_var

指定导入的列名。

异常处理

  • 如果导入的过程中出现了错误,出现错误的

    INSERT

    语句会被回滚,并且

    LOAD DATA

    语句会在 OBServer 安装目录的 log 子目录下产生名称为

    obloaddata.log.

    的日志文件,日志中会包含Load Data 产生的任务的基本信息,包含租户名、输入文件名、目标表名、并行度、使用的

    LOAD DATA

    命令。 并且以行为单位给出具体错误的信息。 日志文件示例如下。

Tenant name: mysql File name: /home/admin/a.csv Into table: `test`.`t` Parallel: 1 Batch size: 1000 SQL trace: YD7A20BA65670-0005AADAAA3CAB52 Start time: 2020-07-29 21:08:13.073741 Load query: load data infile ‘/home/admin/test.csv’ into table t fields terminated by ‘,’ lines terminated by ‘\n’ Row ErrCode ErrMsg 1 1062 Duplicated primary key 2 1062 Duplicated primary key

  • 如果在客户端通过 Ctrl + C 强制停止会话,会话仍旧会继续运行较短时间用于等待子任务结束,在返回

    Query execution was interrupted

    之后,LODA DATE 才会完全结束。

1 个赞

赞!!!

如果输入文件中并没有包含所有的列,那么缺少的列按照以下的规则会被默认填充:

  • 字符类型:空字符串。
  • 数值类型:0。
  • 日期类型:0000-00-00

实际测试的过程中发现,text类型会被补成0,理论上应该是空字符串更加合理吧

使用LOAD DATA INFILE命令把同样的文件加载到MySQL, text类型会被补成空串’’

麻烦请教一下哈
oceanBase ENCLOSE BY 这个语法是不支持吗?

load data语法可以参考这里 LOAD DATA

:clap: :clap: