如何纠正MySQL加载错误

26

我不太确定是否有类似的问题被关闭,但我正在尝试执行以下MySQL程序。

mysql -e "load data local infile \
'/tmp/ept_inventory_wasp_export_04292013.csv' into \
table wasp_ept_inv fields terminated by ',' \
lines terminated by '\n' ;"

在bash命令行中执行此命令时出现以下错误:

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

如何解决这个问题?

实际上,我是从Python程序中运行此命令,但将其取出来以在bash命令行中进行调试。

我知道可以修改my.cnf(local-infile),但如果可以避免全局更改,则不想这样做。

这是MySQL版本:

mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

4个回答

48

解决方法是修改命令行mysql -e,将--local-infile=1参数传递进去,如下所示:

这个问题的解决方法是修改mysql -e命令行,添加--local-infile=1参数:

mysql --local-infile=1 -u username -p `

然后再次运行 LOAD DATA LOCAL INFILE 命令。


这个命令可以正常工作:mysql -u username -p --local-infile db -A - Snow

30

使用 LOAD DATA LOCAL 存在的安全问题所述:

为了解决这些问题,自MySQL 3.23.49和MySQL 4.0.2(Windows上为4.0.13)起,我们改变了如何处理LOAD DATA LOCAL
  • 默认情况下,所有二进制发行版中的MySQL客户端和库都使用--enable-local-infile选项编译,以兼容MySQL 3.23.48及之前的版本。

  • 如果您从源代码构建MySQL,但没有使用--enable-local-infile选项调用configure,则除非显式编写以调用mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0)的客户端,否则无法使用LOAD DATA LOCAL。请参阅Section 20.6.6.49,“mysql_options()

  • 您可以通过启动mysqld时添加--local-infile=0选项来禁用服务器端的所有LOAD DATA LOCAL语句。

  • 对于mysql命令行客户端,请通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用它。对于mysqlimport,默认情况下关闭本地数据文件加载;使用--local-L选项启用它。无论如何,成功使用本地加载操作需要服务器允许。

  • 如果您在读取选项文件中的[client]组的Perl脚本或其他程序中使用LOAD DATA LOCAL,则可以向该组添加local-infile=1选项。但是,为了避免对不理解local-infile的程序造成问题,请使用loose-前缀指定它:

    [client]
    loose-local-infile=1
    
  • 如果LOAD DATA LOCAL被禁用,无论是在服务器端还是在客户端,试图发出此类语句的客户端会收到以下错误消息:

    ERROR 1148: The used command is not allowed with this MySQL version


1
这完全没有帮助。我想要一个解决方法。我在my.cnf中加入了local-infile,但是错误并没有改变。我使用安装时提供的语句启动MySQL。我没有做任何特殊的操作。你的答案仍然没有提供解决方法,因为我没有明确禁用任何东西。 - octopusgrabbus
@octopusgrabbus 如果回答一点也没有帮到你,那你为什么接受这个答案呢?为什么不接受自己的答案呢? - Tomas

10

local-infile需要在服务器和客户端上启用。您可以通过在每个端的 my.cnf (Unix)或 my.ini (Windows)文件的适当部分中添加 local-infile = 1 来实现此目标。例如,在客户端:

[client]
local-infile = 1

您还可以通过设置系统变量 local_infile 在服务器上运行时启用此功能:

SET GLOBAL local_infile=1;

但是,您仍然需要在客户端上启用它。您可以通过向mysql命令添加一个命令行参数来在运行时执行此操作:

然而,您仍需要在客户端启用它。您可以通过向mysql命令添加一个命令行参数,在运行时进行操作:

mysql --local-infile=1 ...

如果你正在使用亚马逊网络服务 RDS,你可以通过编辑或创建参数组来配置服务器设置。查找 local_infile 参数。应用更改后,你可能需要重新启动服务器。


1
SET local_infile=1; 在新版的MySQL中会失败。 - Ain Tohvri
SET GLOBAL local_infile=1; 对我来说起了作用。 - Matt Cremeens

0

我猜测你的MySQL服务器没有启用LOAD DATA LOCAL。请参考MySQL文档中的这一部分:

如果在服务器或客户端中禁用了LOAD DATA LOCAL,则尝试发出此类语句的客户端将收到以下错误消息:

ERROR 1148: The used command is not allowed with this MySQL version

这是我从页面上得到的链接:

http://dev.mysql.com/doc/refman/5.5/en/load-data-local.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接