在 MySQL 中加载数据 infile 的访问被拒绝

问题描述 投票:0回答:12

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

LOAD DATA INFILE

我收到以下错误

#1045 - 用户 'user'@'localhost' 的访问被拒绝(使用密码:是)

有谁知道这是什么意思吗?

mysql load-data-infile mysql-error-1045
12个回答
239
投票

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

LOCAL

例如,这给出了权限问题:

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

LOCAL
添加到您的声明中,权限问题应该消失。像这样:

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

38
投票

我有这个问题。我四处寻找,没有找到满意的答案。我在下面总结了我的搜索结果。

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

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

21
投票

尝试使用这个命令:

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

这应该有效。它适用于我的情况。


11
投票

确保您的 MySQL 用户具有授予的 FILE 权限。

如果您使用的是共享虚拟主机,您的托管服务提供商可能会阻止它。


4
投票

如果您使用命令行,我发现了一个简单的方法

登录为

mysql -u[username] -p[password] --local-infile

然后

SET GLOBAL local_infile = 1;

通过

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;


3
投票

Lyon 的字符串给了我一个很好的提示:在 Windows 上,我们需要使用斜杠而不是反斜杠。此代码对我有用:

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

3
投票

如果你在 MySQL Workbench 上尝试这个,

转到连接 -> 编辑连接 -> 选择高级选项卡

并在“其他”文本字段中添加

OPT_LOCAL_INFILE=1

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


2
投票

我遇到了同样的问题,并按照这些步骤解决了它:

  • 激活 load_infile 变量
  • 我的自定义 mysql 用户的大文件权限
  • 停用 secure_file_priv 变量(我的文件由网络服务器上传到 /tmp 文件夹,这当然不是 myslq /var/lib/mysql-file 的安全目录)

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

BR,

广告


2
投票

这也发生在我身上,尽管遵循了 Yamir 在他的帖子中描述的所有步骤,但我无法让它工作。

文件位于 /tmp/test.csv 中,权限为 777。 MySQL 用户有文件权限,我的 MySQL 版本不允许 LOCAL 选项,所以我卡住了。

最后我能够通过运行解决问题:

sudo chown mysql:mysql /tmp/test.csv

0
投票

我发现加载 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/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
    -> ;
Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)

3)改变列:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

瞧!


0
投票

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

  1. 使用 pymysql 或 MySQL.connector 在 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()


-6
投票

这可能意味着您为

'user'@'localhost'
提供的密码不正确。

© www.soinside.com 2019 - 2024. All rights reserved.