我正在尝试使用将数据加载到mysql数据库中
LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';
这个问题的主题是我得到的回应。我知道默认情况下本地数据卸载是关闭的,我必须使用命令启用它,local-infile=1
但我不知道在哪里放置这个命令。
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
带有默认 MySQL 连接器的 SpringBoot 2.1
要解决此问题,请按照说明操作
要设置此全局变量,请按照 MySQL 文档 https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html中提供的说明进行操作
allowLoadLocalInfile=true 示例:jdbc:mysql://localhost:3306/xxxx?useSSL=false&useUnicode=yes&characterEncoding=UTF-8&allowLoadLocalInfile=true
http://dev.mysql.com/doc/refman/5.6/en/load-data-local.html
把它放在 my.cnf - 该[client]
部分应该已经存在(如果您不太关心安全性)。
[client]
loose-local-infile=1
也为这个问题苦苦挣扎,尝试使用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 连接,如下所示:
- 转到显示所有连接的 MYSQL 的欢迎页面
- 选择管理服务器连接(小扳手图标)
- 选择您的连接
- 选择高级选项卡
- 在“其他”框中,添加 OPT_LOCAL_INFILE=1
现在我可以在 MYSQL RDS 上使用 LOAD DATA LOCAL INFILE 查询。似乎不需要 File_priv 权限。*
在我全新的 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 的另一个问题的答案,它为我解决了这个问题!
在 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
只是一点点补充。
在 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)
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.
使用 docker[1] 加载数据时出现此错误。在我遵循这些后续步骤后,该解决方案起作用了。最初,我创建了数据库和表datavault
以及fdata
. 当我尝试导入数据 [2] 时,出现错误 [3]。然后我做了:
SET GLOBAL local_infile = 1;
SHOW VARIABLES LIKE 'local_infile';
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));
为了完整起见,我会补充说我正在通过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版本)。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';
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;
。上面的答案是正确的。请先在 MySQL CLI 中直接检查它们。如果这解决了那里的问题,您可能希望它在 Python3 中工作,只需将其传递给MySQLdb.connect
as 参数
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)
请参阅 MySQL 8.0 参考手册 -- 6.1.6 LOAD DATA LOCAL 的安全问题
在服务器端,运行
mysql.server start --local-infile
在客户端,运行
mysql --local-infile database_name -u username -p