首批通过分布式安全可靠测评,为关键业务系统打造
LOAD DATA
更新时间:2025-05-07 10:31:45
描述
该语句用于从外部导入数据。
注意
- 带有触发器(Trigger)的表禁止使用
LOAD DATA语句。 - 要从外部文件导入数据,您需要具有
FILE权限及以下设置:- 加载服务器端文件时,需要提前设置系统变量 secure_file_priv,配置导入或导出文件时可以访问的路径。
- 加载客户端本地文件时,需要在启动 MySQL/[OBClient](https://www.oceanbase.com/softwarecenter-cloud) 客户端时添加
--local-infile[=1]选项来启用从本地文件系统加载数据的功能。
OceanBase 数据库 LOAD DATA 语句支持加载以下输入文件:
服务器端(OBServer 节点)文件:文件位于 OceanBase 数据库的 OBServer 节点上。可以使用
LOAD DATA INFILE语句,将服务器端文件中加载数据到数据库表中。客户端(本地)文件:文件位于客户端本地文件系统中。可以使用
LOAD DATA LOCAL INFILE语句,将客户端本地文件中的数据加载到数据库表中。说明
OceanBase 数据库在执行
LOAD DATA LOCAL INFILE命令时,系统会自动添加IGNORE选项。OSS 文件:文件位于 OSS 文件系统。可以使用
LOAD DATA REMOTE_OSS INFILE语句,将 OSS 文件中的数据加载到数据库表中。
LOAD DATA 目前可以对 CSV 格式的文本文件进行导入,整个导入的过程可以分为以下的流程:
解析文件:OceanBase 数据库会根据用户输入的文件名,读取文件中的数据,并且根据指定的并行度来决定并行或者串行解析输入文件中的数据。
分发数据:由于 OceanBase 是分布式数据库,各个分区的数据可能分布在各个不同的 OBServer 节点,
LOAD DATA会对解析出来的数据进行计算,决定数据需要被发送到哪个 OBServer 节点。插入数据:当目标 OBServer 节点收到数据后,在本地执行
INSERT操作将数据插入到对应的分区当中。
语法
LOAD DATA
[/*+ PARALLEL(N) [load_batch_size(M)] [APPEND | direct(bool, int, [load_mode])] */]
[REMOTE_OSS | LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE table_name
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(column_name_var
[, column_name_var] ...)]
load_mode:
'full'
| 'inc_replace'
参数解释
| 参数 | 描述 |
|---|---|
| parallel(N) | 加载数据的并行度,N 默认为 4。 |
| load_batch_size(M) | 指定每次插入的批量大小,M 默认为 100。推荐取值范围为 [100,1000]。 |
| APPEND | direct() | 使用 Hint 启用旁路导入功能。
注意在执行旁路导入任务的过程中,不建议同时进行 OceanBase 数据库的升级操作,因为这可能导致旁路导入任务失败。
LOAD DATA 旁路导入的信息,参见 使用 LOAD DATA 语句旁路导入数据/文件。 |
| REMOTE_OSS | LOCAL | 可选项,
|
| file_name | 指定输入文件的路径和文件名。 file_name 有以下格式:
说明在导入 OSS 上的文件时,需要确保以下信息:
|
| REPLACE | IGNORE | 如果遇到唯一键冲突,REPLACE 表示覆盖冲突行,IGNORE 表示忽略冲突行。LOAD DATA 通过表的主键来判断数据是否重复,如果表不存在主键,则 REPLACE 与 IGNORE 选项没有区别。缺省时,遇到重复数据的时候,LOAD DATA 会将出现错误的数据记录到日志文件中。
注意
|
| table_name | 导入数据的表的名称,支持分区表与非分区表。 |
| FIELDS | COLUMNS | 指定字段的格式。
|
| LINES STARTING BY | 指定行起始符。 |
| LINES TERMINATED BY | 指定行结束符。 |
| IGNORE number { LINES | ROWS } | 忽略前几行,LINES 表示文件的前几行,ROWS 表示由字段分隔符指定的前几行数据。缺省时,会将输入文件中的字段逐个与表中的列进行对应。如果输入文件中并没有包含所有的列,那么缺少的列按照以下的规则会被默认填充:
|
| column_name_var | 指定导入的列名。 |
注意事项
进行旁路导入时的通配符规则
LOAD DATA 语句中,使用 Hint direct 指明是否进行旁路导入。在进行旁路数据导入时,来源于云对象存储服务(OSS)的文件只能指定一个;若需导入多个文件,必须分别使用多条 load data 语句。对于存储于集群内文件系统(server_disk)的数据文件,为便于多文件导入,引入文件通配符功能,适用于 server_disk 和 OSS 类型的文件源,不适用于客户端磁盘(client_disk)。
集群内文件系统(server_disk)旁路导入使用方法
server_disk 示例:
匹配文件名:
load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.*.csv' replace into table t1 fields terminated by '|';匹配目录:
load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.1.csv' replace into table t1 fields terminated by '|';同时匹配目录和文件名:
load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.*.csv' replace into table t1 fields terminated by '|';
server_disk 注意事项:
必须存在至少一个匹配的文件,否则报错
OB_FILE_NOT_EXIST。对
load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.1*.csv,/xxx/test.6*.csv' replace into table t1 fields terminated by '|';的输入,/xxx/test.1*.csv,/xxx/test.6*.csv会被认为是整体匹配,若无匹配则报错OB_FILE_NOT_EXIST。只支持 POSIX 的 GLOB 函数能支持的通配符,例如
test.6*(6|0).csv和test.6*({0.csv,6.csv}|.csv)尽管可通过ls命令查找,但 GLOB 函数无法匹配,会报OB_FILE_NOT_EXIST。
云对象存储服务(OSS)旁路导入使用方法
oss 示例:
- 匹配文件名:
load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://xxx/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|';
- 匹配文件名:
oss 注意事项:
不支持目录匹配。例如:
load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://aa*bb/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|';会返回OB_NOT_SUPPORTED。文件名通配符只支持
*和?。其他通配符虽然允许输入,但无法匹配任何结果。
更多信息,参见使用 LOAD DATA 语句旁路导入数据/文件
示例
说明
LOAD DATA 加载数据时支持使用 \N 代表 NULL。
从服务器端文件导入数据
示例 1:服务器端文件导入数据。
设置全局安全路径。
obclient> SET GLOBAL secure_file_priv = "/" Query OK, 0 rows affected obclinet> \q Bye说明
由于
secure_file_priv是GLOBAL变量,所以需要执行\q退出使之生效。重连数据库后,从外部文件导入数据。
obclient> LOAD DATA INFILE 'test.sql' INTO TABLE t1; Query OK, 0 rows affected
示例 2:使用 APPEND Hint 启用旁路导入功能。
LOAD DATA /*+ PARALLEL(4) APPEND */
INFILE '/home/admin/a.csv'
INTO TABLE t;
示例 3:使用 direct(bool, int) Hint 启用旁路导入功能,旁路导入文件可在 oss 上。
load data /*+ parallel(1) direct(false,0)*/ remote_oss infile 'oss://antsys-oceanbasebackup/backup_rd/xiaotao.ht/lineitem2.tbl?host=***.oss-cdn.***&access_id=***&access_key=***' into table lineitem fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';
从客户端(本地)文件导入数据
示例 4:使用以下语句,从本地文件导入数据至 OceanBase 数据库表中。
打开终端或命令提示符窗口,并输入以下命令来启动客户端。
obclient --local-infile -hxxx.xxx.xxx.xxx -P2881 -uroot@mysql001 -p****** -A -Dtest返回结果如下:
Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221719526 Server version: OceanBase 4.2.2.0 (r100000022023121309-f536833402c6efe9364d5a4b61830a858ef24d82) (Built Dec 13 2023 09:58:18) Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. obclient [test]>注意
为了使用
LOAD DATA LOCAL INFILE功能,请使用 V2.2.4 或之后的版本的 OBClient 客户端。如果您没有要求版本的 OBClient 客户端,也可以使用 MySQL 客户端来连接数据库。在客户端中,执行
LOAD DATA LOCAL INFILE语句来加载本地数据文件。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/test_data/tbl1.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',';返回结果如下:
Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
从 OSS 文件导入数据
注意
使用对象存储路径时,对象存储路径的各项参数由 & 符号进行分隔,请确保您输入的参数值中仅包含英文字母大小写、数字、\/-_$+= 以及通配符。如果您输入了上述以外的其他字符,可能会导致设置失败。
使用 direct(bool, int) Hint 启用旁路导入功能,导入文件可在 OSS 上。
LOAD DATA /*+ direct(true,1024) parallel(16) */ REMOTE_OSS INFILE 'oss://antsys-oceanbasebackup/backup_rd/xiaotao.ht/lineitem2.tbl?host=***.oss-cdn.***&access_id=***&access_key=***' INTO TABLE tbl1 FIELDS TERMINATED BY ',';
相关文档
- 更多有关连接 OceanBase 数据库的信息,请参见 连接方式概述。
- 更多有关使用
LOAD DATA语句的示例信息,请参见 使用 LOAD DATA 语句导入数据。 - 更多有关使用
LOAD DATA旁路导入的示例信息,请参见 使用 LOAD DATA 语句旁路导入数据。