错误:禁用本地数据加载 - 必须在客户端和服务器端都启用。

99

除了最明显的答案,例如下面这个答案,我不理解其他人对类似问题提供的答案。

mysql> SET GLOBAL local_infile=1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'local_infile';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
1 row in set (0.01 sec)

我的意思是提供了确切的代码。如果有人能够逐步为我解释,使我能够在“客户端”和“服务器端”启用本地数据,我将不胜感激。似乎我已经在客户端启用了本地数据,但我不知道需要给电脑什么指令才能启用“服务器端”。我对技术一窍不通,我只想达到这样一个目标:将数据上传到MySQL Workbench。

ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides
CREATE TABLE toys (
uniq_id VARCHAR(1000),
product_name VARCHAR(1000),
manufacturer VARCHAR(1000),
price VARCHAR(1000),
number_available_in_stock VARCHAR (1000),
number_of_reviews INT,
number_of_answered_questions INT,
average_review_rating VARCHAR(1000),
amazon_category_and_sub_category VARCHAR(1000),
customers_who_bought_this_item_also_bought VARCHAR(1000),
description VARCHAR(1000),
product_information VARCHAR(1000),
product_description VARCHAR(1000),
items_customers_buy_after_viewing_this_item VARCHAR(1000),
customer_questions_and_answers VARCHAR(1000),
customer_reviews VARCHAR(1000),
sellers VARCHAR(1000)
);

LOAD DATA LOCAL INFILE ‘/Users/BruddaDave/Desktop/amazonsample.csv’ INTO TABLE toys
FIELDS TERMINATED BY ‘,’
LINES TERMINATED BY ‘\n’
IGNORE 1 LINES
(uniq_id, product_name, manufacturer, price, number_available_in_stock, number_of_reviews, number_of_answered_questions, average_review_rating, amazon_category_and_sub_category, customers_who_bought_this_item_also_bought, description, product_information, product_description, items_customers_buy_after_viewing_this_item, customer_questions_and_answers, customer_reviews, sellers)
;

我只想能够使用命令行 shell 将 .csv 文件导入到 MySQL 中。


这个回答解决了你的问题吗?MySQL:启用LOAD DATA LOCAL INFILE重置 - danblack
15个回答

145
如果禁用了LOCAL功能,无论是在服务器端还是客户端端,试图执行LOAD DATA LOCAL语句的客户端会收到以下错误信息:

如果禁用了LOCAL功能,无论是在服务器端还是客户端端,试图执行LOAD DATA LOCAL语句的客户端会收到以下错误信息:

ERROR 3950 (42000): Loading local data is disabled; this must be
enabled on both the client and server side

当我按照Mysql教程https://dev.mysql.com/doc/refman/8.0/en/loading-tables.html想要将文本文件pet.txt加载到宠物表时,遇到了同样的问题。

在网上搜索后,我通过以下步骤解决了该问题:

  1. 使用此命令设置全局变量:
mysql> SET GLOBAL local_infile=1;
Query OK, 0 rows affected (0.00 sec)
  1. 退出当前服务器:
mysql> quit
Bye
  1. 使用local-infile系统变量连接到服务器:
mysql --local-infile=1 -u root -p1

该变量控制LOAD DATA语句在服务器端的LOCAL功能。根据local_infile设置,服务器拒绝或允许启用客户端的本地数据加载。
为了明确地使服务器拒绝或允许LOAD DATA LOCAL语句(无论客户端程序和库在构建时或运行时如何配置),请分别禁用或启用local_infile来启动mysqld。 local_infile也可以在运行时设置。
4. 使用您的数据库并将文件加载到表中:
mysql> use menagerie
Database changed
mysql> load data local infile '/path/pet.txt' into table pet;
Query OK, 8 rows affected, 7 warnings (0.00 sec)

它能工作吗?
参考资料: https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html https://dev.mysql.com/doc/refman/8.0/en/source-configuration-options.html#option_cmake_enabled_local_infile https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_local_infile

1
很多人在更新到“Focal”后遇到了此问题。这导致许多实用脚本和报告出现故障。2020年10月,该问题成为谷歌搜索消息的首要问题。 - mckenzm
如果客户端是本地主机,那么是否可以在没有 --local-infile=1 的情况下工作?对我们来说,这意味着本地脚本无需进行任何代码更改,这很好。 - mckenzm

55

您可以检查 local_infile 是否被禁用或启用。因此,您可以尝试执行以下操作 -

mysql> show global variables like 'local_infile';

如果它显示 -

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  |  OFF  |
+---------------+-------+
(this means local_infile is disable)

然后使用以下方式启用 -

mysql> set global local_infile=true;

然后再次检查,使用以下命令退出mysql服务器-

mysql> exit

现在您需要使用本地文件连接/登录服务器。为此,请从终端命令行运行以下代码-

mysql --local_infile=1 -u root -ppassword DB_name

现在从本地文件加载数据-

mysql> load data local infile 'path/file_name.extention' into table table_name;

它在我的电脑上工作。你可以尝试这个。谢谢。


1
永远不要在命令行中传递密码!只使用 -p 选项,并等待它提示您输入密码。 - Rodrigo

18

下面是我在Ubuntu 20.04 / MySQL 8上解决此问题的步骤:

  1. nano /etc/mysql/mysql.conf.d/mysqld.cnf
  2. [mysqld] 部分添加以下行:
local_infile    = 1
  • 将以下两行代码添加到文件底部:
[client]

local_infile    = 1
  1. 从我的客户端运行以下命令:SET GLOBAL local_infile=1;

注意:为了确保将local_infile=1添加到[mysqld]部分,已对上述内容进行修改。这可以避免每次重启后都要运行SET GLOBAL local_infile=1;命令。


10
在终端中输入以下命令:
SHOW GLOBAL VARIABLES LIKE 'local_infile';

如果它是0false,则输入以下命令 -
SET GLOBAL local_infile = TRUE;

8

MySql文档并不是很清晰。你设置了[client],怎么使得服务器端和客户端都正确呢?在使用MySql 8的Ubuntu上,my.cnf文件只是两个目录的引用,分别是/etc/mysql/mysql.conf.d和/etc/mysql/conf.d。我正在尝试在mysql.conf.d/mysql.cnf文件中进行设置。但老实说,如何将具有相同名称“mysql.cnf”的文件放置在顶层和每个子目录中的单个文件夹中是有意义的呢?而且对服务器也没有任何改变? - pauljohn32
1
找到带有标签[mysqld]并正在使用的任何配置文件。在该标签下添加相同的全局配置,以及在[client]标签下添加。 - Adam Friedman
2
@AdamFriedman 感谢你的建议!对我来说,服务器配置文件位于 /etc/mysql/mysql.conf.d/mysqld.cnf,我在 [mysqld] 下添加了 local_infile=1,现在它可以正常工作了!我目前无法编辑此答案,因为编辑队列已满,但没有 mysqld 对是不完整的。 - aderchox

6

对于MySQL 8.0.20的默认安装:

i) 寻找位于C:\ProgramData\MySQL\MySQL Server 8.0\my.ini的初始化文件。

ii) 使用记事本打开my.ini文件。

iii) 在CLIENT部分下查找[client],[mysql]头和SERVER部分下的[mysqld]头。

iv) 在每个头下面添加以下语句:

local_infile=ON

v) 保存该文件并在Windows本地服务下重新启动MySQL80服务。

这样应该就可以了。


谢谢!这对我有用,结合了这个这个的答案。 - stoneshishang

3

正如问题所述,这必须在客户端和服务器上都启用,因此在我的情况下,我能够在服务器端启用它。

SET GLOBAL local_infile = true;

使用上述命令(但是在重新启动服务器后,状态会变为关闭),因此我在my.cnf文件中添加了以下内容:

[mysqld]
local-infile 

这个可以正常工作,并且服务器端也没有问题,因此在客户端(我的应用程序是spring)中,我需要添加以下内容:

allowLoadLocalInfile=true

在连接字符串的末尾添加这个。添加后正常工作。 以下是我的连接字符串(您可以在字符串的末尾看到它)。
jdbc.url=jdbc:mysql://127.0.0.1:<port>/<dbname>?autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=yes&characterEncoding=UTF-8&allowLoadLocalInfile=true

2

如何使用全局变量,例如'local_infile'?

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+


set global local_infile=true;


exit

如果您的 MySQL 没有设置密码


$->>   sudo mysql --local_infile=1 -u root -p

如果您有 MySQL 的密码


$->>   sudo mysql --local-infile=1 -u root

现在完成你的工作


LOAD DATA LOCAL INFILE  
'/home/soyanswartz/Documents/Study/My_Course/Learn_SQL/05_Day/machine-learning-with-sql/data/weather_data.csv'
INTO TABLE TBL_WEATHER  
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';


1

我曾经遇到过PyMySQL和SQLAlchemy的问题,以下是一些解决方法:

  1. Here is how I connect to the DB Engine...

     connect_args = ssl_args
     connect_args['local_infile'] = True
     qry_engine = create_engine('mysql+pymysql://' + db_uid + ':' + db_pw + '@' + db_addr, connect_args=connect_args,
                                pool_recycle=3600, echo=False)
    
请注意,ssl_args是一个包含我的SSL参数的字典(如果不使用SSL连接,则可以忽略此项,但connect_args需要一个字典)。
  1. When loading data, I have to run the following...

     sql_stmt = 'SET GLOBAL local_infile = TRUE'
     common.qry_engine.execute(text(sql_stmt))
     sql_stmt = "LOAD DATA LOCAL INFILE '" + filepath + "' INTO TABLE " + self.tst_tbl.tbl.fullname
     common.qry_engine.execute(text(sql_stmt))
    
当我没有使用SET GLOBAL命令时,我会收到“必须在客户端和服务器端都启用”的消息。

1
谢谢Ben!我已经按照上面建议的更新了配置(.cnf)文件,但仍然遇到了权限问题。不过你使用SQLAlchemy engine的解决方案解决了它。 - Rony Armon

1
只需在MySQL控制台中设置以下命令
SET GLOBAL local_infile=1;

然后退出控制台。
exit;

现在使用以下命令启动MySQL控制台
mysql --local-infile=1 -u root -p

它对我有用。我希望它对你也有用。

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