access denied for load data infile in MySQL

我在 PHP 中一直使用 MySQL 查询,但是当我尝试

LOAD DATA INFILE

我得到以下错误

# 1045-拒绝访问用户‘ user’@‘ localhost’(使用密码: YES)

有人知道这意味着什么吗?

122501 次浏览

这可能意味着您为 'user'@'localhost'提供的密码不正确。

确保您的 MySQL 用户拥有授予的 FILE 特权。

如果你使用的是共享网站托管服务,这有可能被你的托管服务提供商阻止。

我也遇到了这个问题,我不得不在 SQL 语句中添加 LOCAL

例如,这就产生了许可问题:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

LOCAL添加到语句中,权限问题应该消失。如下所示:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

我有个问题。我四处寻找,没有找到一个令人满意的答案。我将搜索结果总结如下。

拒绝访问错误可能意味着:

  • “ user”@“ localhost”没有文件特权(GRANT FILE on *.* to user@'localhost') ; 或者,
  • 您试图加载的文件在运行 mysql 服务器的计算机上不存在(如果使用 LOAD DATA INFILE) ; 或者,
  • 试图加载的文件在本地计算机上不存在(如果使用 LOAD DATA LOCAL INFILE) ; 或者,
  • 您试图加载的文件不是世界可读的(您需要文件 and所有父目录都是世界可读的: chmod 755目录; 和 chmod 744 file.dat)

The string from Lyon gave me a very good tip: On Windows, we need to use slahes and not backslashes. This code works for me:

    File tempFile = File.createTempFile(tableName, ".csv");
FileUtils.copyInputStreamToFile(data, tempFile);


JdbcTemplate template = new JdbcTemplate(dataSource);
String path = tempFile.getAbsolutePath().replace('\\', '/');
int rows = template.update(MessageFormat
.format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
path, tableName));
logger.info("imported {} rows into {}", rows, tableName);


tempFile.delete();

尝试使用以下命令:

load data local infile 'home/data.txt' into table customer;

This should work. It worked in my case.

我遇到了同样的问题,并通过以下步骤解决了它:

  • 激活 load _ infile 变量
  • 我的自定义 mysql 用户的大文件权限
  • 禁用 security _ file _ priv 变量(我的文件被 webserver 上传到/tmp 文件夹,这当然不是 myslq/var/lib/mysql-file 的安全目录)

关于这第三点,你可以参考: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

AD

这种情况也发生在我身上,尽管我遵循了亚米尔在他的帖子中描述的所有步骤,我还是无法做到这一点。

The file was in /tmp/test.csv with 777 permissions. The MySQL user had file permissions, LOCAL option was not allowed by my MySQL version, so I was stuck.

Finally I was able to solve the problem by running:

sudo chown mysql:mysql /tmp/test.csv

我发现加载 MySQL 表可以快速且无痛(我使用的是 python/Django 模型管理器脚本) :

1)创建所有列为 VARCHAR (n) NULL 的表,例如:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);

2)从 csv 中删除标题(第一行) ,然后加载(如果你忘记了 LOCAL,你会得到“ # 1045-拒绝访问用户‘ user’@‘ localhost’(使用密码: YES)”) :

Mysql > LOAD DATA LOCAL INFILE”/home/magula6/cogswatch 2/well2.csv”加载到表 cw _ well2字段中,以’,’行结束,以’n’结束 - 查询 OK,119426行受影响,19962警告(3.41秒)

3)更改栏目:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

就是这样!

如果您使用的是命令行,那么我找到了一个简单的方法

登入为 mysql -u[username] -p[password] --local-infile

然后是 SET GLOBAL local_infile = 1;

select your database by use [db_name]

最后是 LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;

If you are trying this on MySQL Workbench,

Go to connections -> edit connection -> select advanced tab

并在「其他」文字栏内加入 OPT_LOCAL_INFILE=1

现在重新启动连接并尝试。

enter image description here

我试图使用 python 将数据从 CSV 插入到 MYSQL DB。 可以尝试下面的方法将数据从 CSV 加载到 Database。

  1. 使用 pymysql 或 MySQL. 连接器在 python 中建立所需的任何库与数据库的连接。
  2. 确保在连接时能够使用内联,同时提供主机、用户和密码尝试添加 local _ inline = True。

跳转到加载数据部分。 sql = f'''LOAD DATA LOCAL infile "filename.csv" INTO TABLE schema.tablename FILED TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'''' Note: If you have column names in CSV, use IGNORE ROW 1 LINES. The execute the sql by: cursor.execute(sql) conn.commit() conn.close()