本文主要介绍 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 格式的文本文件进行导入,整个导入的过程可以分为以下的流程:
-
解析文件:OceanBase 数据库会根据用户输入的文件名,读取文件中的数据,并且根据指定的并行度来决定并行或者串行解析输入文件中的数据。
-
分发数据:由于 OceanBase 是分布式数据库,各个分区的数据可能分布在各个不同的 OBServer,
LOAD DATA
会对解析出来的数据进行计算,决定数据需要被发送到哪个 OBServer。
-
插入数据:当目标 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 才会完全结束。