MySQL Load

SinceVersion dev

该语句兼容MySQL标准的LOAD DATA语法,方便用户导入本地数据,并降低学习成本。

MySQL Load 同步执行导入并返回导入结果。用户可直接通过SQL返回信息判断本次导入是否成功。

MySQL Load 主要适用于导入客户端本地文件,或通过程序导入数据流中的数据。

基本原理

MySQL Load和Stream Load功能相似, 都是导入本地文件到Doris集群中, 因此MySQL Load实现复用了StreamLoad的基础导入能力:

  1. FE接收到客户端执行的MySQL Load请求, 完成SQL解析工作

  2. FE将Load请求拆解,并封装为StreamLoad的请求.

  3. FE选择一个BE节点发送StreamLoad请求

  4. 发送请求的同时, FE会异步且流式的从MySQL客户端读取本地文件数据, 并实时的发送到StreamLoad的HTTP请求中.

  5. MySQL客户端数据传输完毕, FE等待StreamLoad完成, 并展示导入成功或者失败的信息给客户端.

支持数据格式

MySQL Load 支持数据格式:CSV(文本)。

基本操作举例

客户端连接

  1. mysql --local-infile -h 127.0.0.1 -P 9030 -u root -D testdb

注意: 执行MySQL Load语句的时候, 客户端命令必须带有--local-infile, 否则执行可能会出现错误. 如果是通过JDBC方式连接的话, 需要在URL中需要加入配置allowLoadLocalInfile=true

创建测试表

  1. CREATE TABLE testdb.t1 (pk INT, v1 INT SUM) AGGREGATE KEY (pk) DISTRIBUTED BY hash (pk) PROPERTIES ('replication_num' = '1');

导入客户端文件

假设在客户端本地当前路径上有一个CSV文件, 名为client_local.csv, 使用MySQL Load语法将表导入到测试表testdb.t1中.

  1. LOAD DATA LOCAL
  2. INFILE 'client_local.csv'
  3. INTO TABLE testdb.t1
  4. PARTITION (partition_a, partition_b, partition_c, partition_d)
  5. COLUMNS TERMINATED BY '\t'
  6. LINES TERMINATED BY '\n'
  7. IGNORE 1 LINES
  8. (k1, k2, v2, v10, v11)
  9. set (c1=k1,c2=k2,c3=v10,c4=v11)
  10. PROPERTIES ("strict_mode"="true")
  1. MySQL Load以语法LOAD DATA开头, 指定LOCAL表示读取客户端文件.
  2. INFILE内填写本地文件路径, 可以是相对路径, 也可以是绝对路径.目前只支持单个文件, 不支持多个文件
  3. INTO TABLE的表名可以指定数据库名, 如案例所示. 也可以省略, 则会使用当前用户所在的数据库.
  4. PARTITION语法支持指定分区导入
  5. COLUMNS TERMINATED BY指定列分隔符
  6. LINES TERMINATED BY指定行分隔符
  7. IGNORE num LINES用户跳过CSV的num表头.
  8. 列映射语法, 具体参数详见导入的数据转换 的列映射章节
  9. PROPERTIES导入参数, 具体参数详见MySQL Load 命令手册。

导入服务端文件

假设在FE节点上的/root/server_local.csv路径为一个CSV文件, 使用MySQL客户端连接对应的FE节点, 然后执行一下命令将数据导入到测试表中.

  1. LOAD DATA
  2. INFILE '/root/server_local.csv'
  3. INTO TABLE testdb.t1
  4. PARTITION (partition_a, partition_b, partition_c, partition_d)
  5. COLUMNS TERMINATED BY '\t'
  6. LINES TERMINATED BY '\n'
  7. IGNORE 1 LINES
  8. (k1, k2, v2, v10, v11)
  9. set (c1=k1,c2=k2,c3=v10,c4=v11)
  10. PROPERTIES ("strict_mode"="true")
  1. 导入服务端本地文件的语法和导入客户端语法的唯一区别是LOAD DATA关键词后面是否加入LOCAL关键字.
  2. FE为多节点部署, 导入服务端文件功能只能够导入客户端连接的FE节点, 无法导入其他FE节点本地的文件.
  3. 服务端导入默认是关闭, 通过设置FE的配置mysql_load_server_secure_path开启, 导入文件的必须在该目录下.

返回结果

由于 MySQL Load 是一种同步的导入方式,所以导入的结果会通过SQL语法返回给用户。 如果导入执行失败, 会展示具体的报错信息. 如果导入成功, 则会显示导入的行数.

  1. Query OK, 1 row affected (0.17 sec)
  2. Records: 1 Deleted: 0 Skipped: 0 Warnings: 0

异常结果

如果执行出现异常, 会在客户端中出现如下异常显示

  1. ERROR 1105 (HY000): errCode = 2, detailMessage = [DATA_QUALITY_ERROR]too many filtered rows with load id b612907c-ccf4-4ac2-82fe-107ece655f0f

当遇到这类异常错误, 可以找到其中的loadId, 可以通过show load warnings命令在客户端中展示详细的异常信息.

  1. show load warnings where label='b612907c-ccf4-4ac2-82fe-107ece655f0f';

异常信息中的LoadId即为Warning命令中的label字段.

配置项

  1. mysql_load_thread_pool控制单个FE中MySQL Load并发执行线程个数, 默认为4. 线程池的排队队列大小为mysql_load_thread_pool的5倍, 因此默认情况下, 可以并发提交的任务为 4 + 4*5 = 24个. 如果并发个数超过24时, 可以调大该配置项.
  2. mysql_load_server_secure_path服务端导入的安全路径, 默认为空, 即不允许服务端导入. 如需开启这个功能, 建议在DORIS_HOME目录下创建一个local_import_data目录, 用于导入数据.
  3. mysql_load_in_memory_record失败的任务记录个数, 该记录会保留在内存中, 默认只会保留最近的20. 如果有需要可以调大该配置. 在内存中的记录, 有效期为1天, 异步清理线程会固定一天清理一次过期数据.

注意事项

  1. 如果客户端出现LOAD DATA LOCAL INFILE file request rejected due to restrictions on access错误, 需要用mysql --local-infile=1命令来打开客户端的导入功能.

  2. MySQL Load的导入会受到StreamLoad的配置项限制, 例如BE支持的StreamLoad最大文件量受streaming_load_max_mb控制, 默认为10GB.

更多帮助

  1. 关于 MySQL Load 使用的更多详细语法及最佳实践,请参阅 MySQL Load 命令手册。