更新时间:2024-04-01 GMT+08:00

LOAD DATA

标准示例

LOAD DATA LOCAL INFILE '/data/data.txt' IGNORE INTO TABLE test CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (id, sid, asf);

如果数据中包含一些特殊字符,比如分隔符、转义符等,建议用引号扩起来,通过OPTIONALLY ENCLOSED BY '"'指定。

示例:

下面的一段数据中包含了分隔符(,)则需要用引号括起来。

"aab,,,bba,ddd"

如果数据中包含了引号字符,则上述方法可能不会生效,此时可以把数据中引号字符替换成\"。例如:"aab,,,bba,ddd\"ddd\"bb,ae"

  • 如果指定LOCAL关键词,则表明从客户端主机读文件。如果local没指定,出于安全考虑不支持此功能。
  • 可以通过FIELDS TERMINATED BY指定字符之间的分割符号,默认值为\t 。
  • 通过OPTIONALLY ENCLOSED BY忽略数据源字段中的符号。
  • 通过LINES TERMINATED BY可以指定行之间的换行符,默认为\n。

    有些windows上的文本文件的换行符可能为\r\n,由于是不可见字符,所以请小心检查。

  • 通过CHARACTER SET指定文件的编码,建议跟RDS for MySQL实例上物理库(分片)的编码一致,否则可能乱码。其中字符集编码必须用引号扩起来,否则会解析出错。
  • 通过IGNORE或者REPLACE指定遇到重复记录是替换还是忽略。
  • 目前列名必须指定,且必须包括分片字段,否则没办法确定路由。
  • 其他参数参考MySQL的load data infile官方文档说明。其他参数的先后顺序不能乱,顺序参考官方说明
  1. 数据导入阶段会在一定程度上影响DDM以及RDS for MySQL实例性能,请选择在业务低峰时间导入。
  2. 建议不要同时发起多个LOAD DATA请求。多个LOAD DATA同时进行,数据高并发写入,表锁竞争以及系统IO抢占会影响总体效率,可能会出现SQL事务超时现象,导致LOAD DATA全部失败。
  3. 由于分布式事务的特性,使用LOAD DATA导入数据时,需要设置手动提交事务,以确保数据记录改动的准确无误。

    例如客户端可进行如下设置:

    mysql> set autocommit=0; 
    mysql> LOAD DATA LOCAL INFILE '/data/data.txt' IGNORE INTO TABLE test CHARACTER SET 'utf8' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' (id, sid, asf);
    mysql> commit;

使用限制

  • 不支持LOW_PRIORITY。
  • 不支持CONCURRENT。
  • 不支持PARTITION (partition_name [, partition_name] ...)。
  • 不支持LINES STARTING BY 'string'。
  • 不支持用户变量。
  • ESCAPED BY 只支持'\\'。
  • 如果导入数据时没有指定自增键的值,DDM不会填充自增值,自增能力使用的是底层DN的自增能力,因此自增值会重复。
  • 如果主键或者唯一索引值经过路由后不在同一张物理表,REPLACE不生效。
  • 如果主键或者唯一索引值经过路由后不在同一张物理表,IGNORE不生效。
  • 不支持对含有全局二级索引的表执行LOAD DATA的操作。