错误1148:此MySQL版本不允许使用的命令


78

我正在尝试使用以下方式将数据加载到mysql数据库中

LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

这个问题的主题是我得到的答复。我了解默认情况下将关闭本地数据卸载,因此我必须使用命令启用它,local-infile=1但是我不知道在何处放置此命令。

Answers:


114

您可以在设置客户端连接时将其指定为附加选项:

mysql -u myuser -p --local-infile somedatabase

这是因为该功能打开了一个安全漏洞。因此,如果您确实要使用它,则必须以显式方式启用它。

客户端和服务器都应启用本地文件选项。否则它将不起作用。要为服务器端服务器上的文件启用它,请在my.cnf配置文件中添加以下内容:

loose-local-infile = 1

错误1045(28000):用户'@'localhost'的访问被拒绝(使用密码:否)
Teja 2015年

1
错误是如上arkascha,..我正在尝试使用LOAD INFILE命令将一个小文件写入mysql表。
2015年

1
@SOaddict嗯,对我来说似乎是普通的身份验证失败?您尝试不使用密码进行连接?您是否可以以相同的方式连接到交互式会话,而无需从文件中加载任何数据?但是无论如何:您正在劫持别人的问题/答案!请另外询问您的问题。您当然会得到很多帮助!
arkascha 2015年

1
@arkascha“打开安全漏洞”是什么意思?编辑:dev.mysql.com/doc/refman/8.0/en/load-data-local.html
user706420

1
Pine-local-infile = 1应该放在my.cnf或my.ini文件的[client]部分下,而不是[mysqld]部分下。您也可以在[mysqld]部分下放置local_infile = 1。
詹姆斯

59

我在这里找到答案。

这是因为服务器变量local_infile设置为FALSE | 0。请参阅文档

您可以执行以下命令进行验证:

SHOW VARIABLES LIKE 'local_infile';

如果您具有SUPER特权,则可以通过执行以下命令启用它(无需使用新配置重新启动服务器):

SET GLOBAL local_infile = 1;

5
刚开始我想为此+1,因为这是唯一成功将local-infile变量设置为ON却没有解决错误的答案。
codehelp4

1
为我工作!但是我没有在给定的方法中更改它。我编辑了服务器的配置文件my.ini并将其设置在其中local_infile=1,然后重新启动了服务器服务。我也用--local-infile dbname选项运行客户端,例如mysql -u root -p --local-infile mydatabase
anddero

1
这是一个奇怪的情况,但是当我的local_infine = on / True时,我继续收到错误消息。这是因为我在MySQL Workbench中创建了表,然后尝试通过cmd添加本地csv数据。我通过删除表并通过cmd创建一个新表并通过cmd添加数据来修复了该问题。
EatSleepCode

13

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

将其放在my.cnf中-该[client]部分应该已经存在(如果您不太担心安全性的话)。

[client]
loose-local-infile=1

1
如果仍然无法解决,该去哪里的任何想法。我在[client],[mysqld]和[mysql]下的my.cnf文件中添加了local-infile = 1,并使用了它们的组合。所有结果相同。我尝试过重新启动工作台,但是没有运气。在每个更改之间,我也停止并启动了mySQL工作台。
OrwellHindenberg

1
mySQL更新到6.2.5为我解决了这个问题
OrwellHindenberg

@OrwellHindenberg-您是否使用了松散的-local-infile = 1-您只有local-infile。
Vérace

在更新之前,我尝试过您原始答案中的内容。我不记得使用“宽松”。但是,更新mySQL对我有用。
OrwellHindenberg

@OrwellHindenberg-检查编辑。它总是宽松的-local-infile。编辑只是纠正了我(当时)新手演示/ dba.se式的错误
Vérace

10

所有这些并没有在我全新的Ubuntu 15.04上为我解决。

我删除了LOCAL并得到了以下命令:

LOAD DATA
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

但是我得到了:

MySQL said: File 'A.txt' not found (Errcode: 13 - Permission denied)

这使我得到了尼尔森的答案这是关于stackoverflow的另一个问题,该问题为我解决了!


1
注意:我很确定这也会将预期的文件位置从客户端计算机移动到服务器计算机。(如果它们是同一台机器,您可能不会注意到。)
ebyrob

MySQL服务器正在使用--secure-file-priv选项运行,因此它无法执行此语句
SmallChess

9

带有默认MySQL连接器的SpringBoot 2.1

要解决此问题,请按照说明进行操作

1. SET GLOBAL local_infile = 1;

要设置此全局变量,请按照MySQL文档https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html中提供的说明进行操作

2.更改MySQL连接器字符串

allowLoadLocalInfile = true示例:jdbc:mysql:// localhost:3306 / xxxx?useSSL = false&useUnicode = yes&characterEncoding = UTF-8&allowLoadLocalInfile = true


5

在AWS MySQL 8.0 RDS中导入CSV文件时遇到了相同的问题。

mysql> LOAD DATA LOCAL INFILE'/tmp/your.csv'到表test.demo2字段以','封闭'''以'\ n'结尾的行忽略1行;

错误1148(42000):此MySQL版本不允许使用的命令

1)检查local_infile参数

mysql> SHOW VARIABLES LIKE 'local_infile';

2)从客户端注销,然后使用以下参数重新登录。

mysql -u root -p -h rdsendpoint --local-infile=1

3)运行相同的命令

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;


Query OK, 300 rows affected (0.01 sec)

Records: 300  Deleted: 0  Skipped: 0  Warnings: 0

4

还遇到了这个问题,尝试使用Windows上的MySQL Workbench从本地计算机将.csv数据上传到AWS RDS实例。

我需要添加的内容OPT_LOCAL_INFILE=1是:连接>高级>其他。注意CAPS是必需的。

在AWS Developer Forums中找到了PeterMag的答案。


有关更多信息:

SHOW VARIABLES LIKE 'local_infile';已经返回ON ,查询为:

LOAD DATA LOCAL INFILE 'filepath/file.csv' 
    INTO TABLE `table_name`
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS;

从上面引用的答案源进行复制:

显然,这是MYSQL Workbench V8.X中的错误。除了此线程前面显示的配置之外,您还需要按如下所示更改Workbench中的MYSQL连接:

  1. 转到MYSQL的“欢迎”页面,其中显示了所有连接
  2. 选择“管理服务器连接”(小扳手图标)
  3. 选择你的连接
  4. 选择高级选项卡
  5. 在“其他”框中,添加OPT_LOCAL_INFILE = 1

现在,我可以在MYSQL RDS上使用LOAD DATA LOCAL INFILE查询。似乎不需要File_priv权限。*


3

只是一点点补充。

在mysql.connector ver 8.0.16中找到了另一个轮回,它现在需要allow_local_infile = True,否则您将看到上述错误。在以前的版本中工作。

conn = mysql.connector.connect(host=host, user=user, passwd=passwd, database=database, allow_local_infile=True)

2

如果您正在使用Java8或+版本,JDBC和MySql8并遇到此问题,请尝试以下操作:

将参数添加到连接字符串:

jdbc:mysql://localhost:3306/tempDB?allowLoadLocalInfile=true

另外,设定

local_infile = 1

在my.cnf文件中。

最新版本的mysql-java-connector可能不允许直接连接到本地文件。因此,使用此参数,您可以启用它。这对我有用。


1

使用docker [1]加载数据时出现此错误。在执行以下后续步骤后,该解决方案开始工作。最初,我创建了数据库,表datavaultfdata。当我尝试导入数据[2]时,出现了错误[3]。然后我做了:

  • SET GLOBAL local_infile = 1;
  • 确认使用 SHOW VARIABLES LIKE 'local_infile';
  • 然后,我重新启动了mysql会话:mysql -P 3306 -u required --local-infile=1 -p,有关创建用户的信息,请参见[4]。
  • 重新创建了表格,因为这样可以解决我的问题:
    • use datavault;
    • drop table fdata;
    • CREATE TABLE fdata (fID INT, NAME VARCHAR(64), LASTNAME VARCHAR(64), EMAIL VARCHAR(128), GENDER VARCHAR(12), IPADDRESS VARCHAR(40));
  • 最后,我使用[2]导入了数据。

为了完整起见,我会添加我正在通过容器内部运行mysql版本docker exec -it testdb sh。mysql版本是x86_64上用于Linux的mysql Ver 8.0.17(MySQL Community Server-GPL)对于Win64(x86_64),这是WAMP64的另一种mysql版本,使用mysql.exe版本14.14 Distrib 5.7.14进行了测试。在[5]中列出了使用的相关命令。


[1] docker run --name testdb -v //c/Users/C/Downloads/data/csv-data/:/var/data -p 3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:latest

[2] load data local infile '/var/data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n' IGNORE 1 ROWS;

[3]错误1148(42000):此MySQL版本不允许使用的命令

[4]使用以下方法创建了所需的客户端:

  • CREATE USER 'required'@'%' IDENTIFIED BY 'password';
  • GRANT ALL PRIVILEGES ON * . * TO 'required'@'%';
  • FLUSH PRIVILEGES;
  • ALTER USER 'required'@'%' IDENTIFIED WITH mysql_native_password BY 'password';如果遇到此错误,则可能需要此行:Authentication plugin ‘caching_sha2_password’ cannot be loaded

[5]从WAMP64使用mysql的命令:

  • mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile=1其中端口是您所描述的映射到主机的端口,docker ps -a并且使用来获得主机ip docker-machine ip(这取决于操作系统以及Docker版本)。
  • 如上所述创建数据库datavault2和表fdata
  • load data local infile 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n';
  • 以我的记录,在我先前创建datavault3fdata之后,另一种加载文件的方法起作用了:mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile datavault3 -e "LOAD DATA LOCAL INFILE 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' REPLACE INTO TABLE fdata FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS"它成功加载了运行后易于检查的数据select * from fdata limit 10;


0

最重要的答案是正确的。请首先直接在MySQL CLI中检查它们。如果此方法解决了该问题,则可能需要使其在Python3中运行,只需将其传递给MySQLdb.connectas参数即可

self.connection = MySQLdb.connect(
                    host=host, user=settings_DB.db_config['USER'],
                    port=port, passwd=settings_DB.db_config['PASSWORD'], 
                    db=settings_DB.db_config['NAME'],
                    local_infile=True)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.