上云无忧 > 文档中心 > 百度智能云云数据库RDS local_infile参数使用详解
云数据库 RDS
百度智能云云数据库RDS local_infile参数使用详解

文档简介:
在数据库的使用过程中,经常需要进行批量的数据导入操作,MySQL数据库批量数据导入可以使用LOAD DATA命令,实现大批量数据的快速入库需求。 问题现象: 在使用LOAD DATA命令可能会遇到如下报错情况: 使用 LOAD DATA LOCAL INFILE 命令批量导入数据时,报错: ERROR 1148 (42000): The used command is not allowed with this MySQL version. for MySQL 版
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

背景

在数据库的使用过程中,经常需要进行批量的数据导入操作,MySQL数据库批量数据导入可以使用LOAD DATA命令,实现大批量数据的快速入库需求。

问题现象

在使用LOAD DATA命令可能会遇到如下报错情况:

  • 使用 LOAD DATA LOCAL INFILE 命令批量导入数据时,报错:

    ERROR 1148 (42000): The used command is not allowed with this MySQL version.

  • 使用 LOAD DATA INFILE 命令导入数据时,报错:

    ERROR 1045 (28000): Access denied for user 'xxxx'@'%' (using password: YES)

原因分析

第一种报错是受参数设置的影响:

  • MySQL服务端参数:local_infile 用于控制MySQL Server是否允许使用LOAD DATA LOCAL INFILE命令导入存放于客户端的数据文件。
  • MySQL客户端参数:--local-infile 用于控制MySQL Client是否允许使用LOAD DATA LOCAL INFILE命令导入存放于客户端的数据文件。

第二种报错是命令和账号权限不匹配导致的:

  • LOAD DATA LOCAL INFILE 命令可以导入客户端的数据文件,使用具有普通写权限的账号即可。
  • LOAD DATA INFILE 命令可以导入服务端的数据文件,需要使用具备FILE权限的账号(出于安全考虑不建议放开FILE权限)。

解决方案

  • 第一种报错解决方案:确保MySQL客户端登录时开启参数--local_infile,且确保MySQL服务端开启参数local_infile。
  • 第二种报错解决方案:使用LOAD DATA命令时注意添加LOCAL关键字。

案例复现

  1. 创建测试表

    CREATE TABLE tb_01 (
    id int(11) NOT NULL AUTO_INCREMENT,
    age int(11) NOT NULL DEFAULT '0',
    name varchar(64) NOT NULL DEFAULT '',
    PRIMARY KEY (id)
    ) ENGINE=InnoDB;
  2. 构造测试数据

    Age Name
    15 Zhangsan
    28 Lisi
    21 Wangwu
    11 Zhaoliu
    33 Dingyi
  3. 测试结果
  • 场景1:正常情况

    执行如下SQL命令:

    LOAD DATA LOCAL INFILE 'testdata.csv' INTO TABLE tb_01 FIELDS TERMINATED BY ','  LINES TERMINATED BY '\n' (age,name);

    输出结果:

  • 场景2:MySQL客户端关闭参数--local-infile

    登录MySQL客户端:

    bin/mysql -h HOST -P PORT -u USER -p PASSWORD --local-infile=0

    执行如下SQL命令:

    LOAD DATA LOCAL INFILE 'testdata.csv' INTO TABLE tb_01 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (age,name);

    输出结果:

  • 场景3:MySQL服务端关闭参数local_infile

    执行如下SQL命令:

    LOAD DATA LOCAL INFILE 'testdata.csv' INTO TABLE tb_01 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (age,name);

    输出结果:

  • 场景4:去掉LOCAL关键字

    执行如下SQL命令:

    LOAD DATA INFILE 'testdata.csv' INTO TABLE tb_01 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (age,name);

    输出结果:

总结建议

  • 百度云RDS默认开启local_infile参数,如果需要限制使用LOAD DATA命令,请提交工单进行修改。
  • 使用LOAD DATA命令需要注意添加LOCAL关键字,避免执行报错。
相似文档
  • 百度云支持更改数据库表的大小写设置参数,该参数修改后需要重启实例生效: lower_case_table_names=0,表示区分大小写,创建的库表会原样大小写保存在磁盘上。 lower_case_table_names=1,表示不区分大小写,创建库表时MySQL会将所有的库表名转换成小写字母保存在磁盘上,且SQL语句中涉及到库表无论写成大写或者小写,都会被转化成小写进行查询和写入。 for MySQL 版
  • MySQL中有这样的一个默认行为:一行数据中的某些列被更新了,如果这一行中有timestamp类型的列,那么这个timestamp列会自动更新时间戳。这个行为是由explicit_defaults_for_timestamp参数控制的。在实际使用过程中经常会遇到一些非预期的异常情况,这给数据库使用过程带来诸多不便,本文重点介绍参数explicit_defaults_for_timestamp使用过程中的常见问题和注意事项。 for MySQL 版
  • MySQL数据库可以通过参数sql_mode来控制数据库的行为,本文介绍sql_mode的取值之一:NO_ENGINE_SUBSTITUTION。它的用途是:当CREATE TABLE或ALTER TABLE之类的语句指定一个已禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。 for MySQL 版
  • disabled_storage_engines参数是5.7.8版本新引入的参数,它用来设置在CREATE TABLE时被禁用的存储引擎。 举例:创建新表时禁用MyISAM和MEMORY引擎。 [mysqld] disabled_storage_engines="MyISAM,MEMORY" for MySQL 版
  • 客户反馈,应用程序经常会报连接失效需要重新建立连接。连接超时主要由interactive_timeout和wait_timeout影响,本篇文章针对这两个参数进行详细介绍。 for MySQL 版
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部