87

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

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

这个问题的主题是我得到的回应。我知道默认情况下本地数据卸载是关闭的,我必须使用命令启用它,local-infile=1但我不知道在哪里放置这个命令。

4

12 回答 12

119

You can specify that as an additional option when setting up your client connection:

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

This is because that feature opens a security hole. So you have to enable it in an explicit manner in case you really want to use it.

Both client and server should enable the local-file option. Otherwise it doesn't work.To enable it for files on the server side server add following to the my.cnf configuration file:

loose-local-infile = 1
于 2013-08-26T06:13:47.420 回答
65

我在这里找到了答案。

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

您可以通过执行来验证:

SHOW VARIABLES LIKE 'local_infile';

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

SET GLOBAL local_infile = 1;
于 2018-08-07T14:50:36.360 回答
16

带有默认 MySQL 连接器的 SpringBoot 2.1

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

1. 设置全局 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

于 2019-03-15T10:15:59.937 回答
13

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

把它放在 my.cnf - 该[client]部分应该已经存在(如果您不太关心安全性)。

[client]
loose-local-infile=1
于 2013-12-21T19:08:00.667 回答
12

也为这个问题苦苦挣扎,尝试使用Windows 上的MySQL Workbench从我的本地计算机将 .csv 数据上传到 AWS RDS 实例。

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

我在 AWS 开发人员论坛中找到了 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 权限。*

于 2020-06-03T23:04:35.703 回答
11

在我全新的 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 的另一个问题的答案,它为我解决了这个问题!

于 2015-06-24T19:33:19.267 回答
6

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

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

ERROR 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
于 2019-07-18T08:13:49.720 回答
4

只是一点点补充。

在 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)
于 2019-07-09T13:47:22.977 回答
2

If you are using Java8 or + version, JDBC and MySql8 and facing this issue then try this:

Add parameter to connection string:

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

Also, set

local_infile = 1

in my.cnf file.

The latest version of mysql-java-connector might be wont allow directly to connect to local file. So with this parameter, you can able to enable it. This works for me.

于 2019-12-22T04:13:19.173 回答
1

使用 docker[1] 加载数据时出现此错误。在我遵循这些后续步骤后,该解决方案起作用了。最初,我创建了数据库和表datavault以及fdata. 当我尝试导入数据 [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] 导入了数据。

为了完整起见,我会补充说我正在通过docker exec -it testdb sh. mysql 版本是mysql Ver 8.0.17 for Linux on x86_64 (MySQL Community Server - GPL)这也使用mysql.exe Ver 14.14 Distrib 5.7.14进行了测试,适用于 Win64 (x86_64) ,这是 WAMP64 的另一个版本的 mysql。使用的相关命令列在 [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] ERROR 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;
于 2019-09-29T15:49:46.843 回答
1

上面的答案是正确的。请先在 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)
于 2019-07-08T11:34:55.500 回答
0

请参阅 MySQL 8.0 参考手册 -- 6.1.6 LOAD DATA LOCAL 的安全问题

在服务器端,运行

mysql.server start --local-infile

在客户端,运行

mysql --local-infile database_name -u username -p
于 2019-07-05T09:41:22.390 回答