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

我不理解其他人对类似问题的回答,除了一些最明显的问题,比如下面这个:

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 工作台的程度。

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 中。

189215 次浏览

my.cnf文件:

[client]
local_infile=1

来自官方的 MySQL 8.0文档

如果在服务器端或客户端禁用 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 加载到 pet 表中时,遇到了同样的问题

在网上搜索之后,我通过以下步骤修复了它:

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

此变量控制 LOADDATA 语句的服务器端 LOCAL 功能。根据 LOCAL _ file 设置,服务器拒绝或允许客户端启用 LOCAL 的客户端加载本地数据。 为了显式地导致服务器拒绝或允许 LOAD DATA LOCAL 语句(不管在构建时或运行时如何配置客户机程序和库) ,分别在禁用或启用 LOCAL _ file 的情况下启动 mysqld。也可以在运行时设置 local _ file。

  1. 使用数据库并将文件加载到表中:
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

默认安装 MySQL 8.0.20:

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

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

Iii)在 CLIENT 部分和 SERVER 部分下查找头文件[ CLIENT ]、[ mysql ]和[ mysqld ]。

Iv)在每个标题下加入以下语句:

Local _ file = ON

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

应该可以。

这就是我在 Ubuntu 20.04/MySQL 8上要解决的问题:

  1. nano /etc/mysql/mysql.conf.d/mysqld.cnf
  2. [mysqld]部分添加这一行:
local_infile    = 1
  1. 在文件底部添加以下两行:
[client]


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

注意: 修订了上述包括额外的步骤,以确保 local_infile=1被添加到 [mysqld]部分。这样我就不必在每次重新启动后都运行 SET GLOBAL local_infile=1;

您可以检查 本地文件是否已禁用或启用

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;

这是我电脑上的工作。你可以试试这个。谢谢。

在尝试了上面列出的所有步骤之后,我仍然得到了 错误代码: 2068。由于访问限制,LOAD DATA LOCAL INFILE 文件请求被拒绝。。解决方案是在 SQL 语句中去掉“ LOCAL”这个词:

加载数据文件..。

对于那些停留在第三步的人:

Mysql —— local-infile = 1-u root-p1

就像我一样,这就是我所做的:

  1. 类型

Cd“ C: Program Files MySQL MySQL Server 8.0 bin”

在命令提示符中。

  1. 类型

Mysql —— local _ infile = 1-u root-pABC menagerie

ABC 是 MySQL 的密码,动物园是你正在处理的数据库吗 (将 ABC & menagerie 分别替换为您的密码和数据库名称)

  1. MySQL 将在命令提示符中打开。您可以键入如下命令:

使用动物园

数据库改变了

将数据本地文件“/path/pet.txt”加载到 table pet;

查询 OK,8行受影响,7个警告(0.00秒)

应该能行。

在终端上键入以下命令-

SHOW GLOBAL VARIABLES LIKE 'local_infile';

如果是 0或者 false,那么键入以下命令-

SET GLOBAL local_infile = TRUE;

在 Ubuntu 20.04/MySQL 8上: 这种方法为我解决了问题:

  1. Systemctl 停止 mysql
  2. Nano/etc/mysql/mysql.con.d/mysqld.cnf
  3. 在[ mysqld ]下添加 local _ file = 1
  4. Systemctl 启动 mysql,如果停止,则重新启动 mysql。

在 SQL 脚本中执行此全局设置更改应该会有所帮助

SET GLOBAL local_infile=1;

我只是在 PyMySQL 和 SQLAlchemy 上遇到了这个问题。

  1. 下面是我如何连接数据库引擎..。

     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. 加载数据时,我必须运行以下..。

     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))
    

当我尝试不使用 SETGLOBAL 命令时,我会收到“必须在客户端和服务器端启用”的消息。

正如问题所说,这必须在客户端和服务器都启用,所以在我的情况下,我能够在服务器端启用

SET GLOBAL local_infile = true;

使用上面的命令(重新启动服务器时它不是永久的,它是 OFF 状态) ,所以我在 my.cnf 中添加以下命令

[mysqld]
local-infile

这个工作和服务器端是可以接受的,所以在客户端(我的是一个春季应用程序) ,我必须添加

allowLoadLocalInfile=true

这在连接字符串的结尾。后添加此工作良好 下面是我的连接字符串(你可以看到在字符串的末尾)

jdbc.url=jdbc:mysql://127.0.0.1:<port>/<dbname>?autoReconnect=true&zeroDateTimeBehavior=convertToNull&useUnicode=yes&characterEncoding=UTF-8&allowLoadLocalInfile=true

像“ local _ file”这样的全局变量;

+---------------+-------+
| 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';