对于MySQL中的加载数据infile,访问被拒绝

时间:2010-02-08 11:54:55

标签: mysql load-data-infile mysql-error-1045

我在PHP中一直使用MySQL查询,但是当我尝试LOAD DATA INFILE时,我收到以下错误#1045 - Access denied for user 'user'@'localhost' (using password: YES) 有谁知道这意味着什么?

11 个答案:

答案 0 :(得分:170)

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

例如,这会产生权限问题:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

在您的对帐单中添加“LOCAL”,权限问题应该消失。像这样:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

答案 1 :(得分:27)

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

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

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

答案 2 :(得分:18)

尝试使用此命令:

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

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

答案 3 :(得分:9)

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

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

答案 4 :(得分:3)

来自里昂的字符串给了我一个非常好的提示:在Windows上,我们需要使用slach而不是反斜杠。这段代码适合我:

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

答案 5 :(得分:2)

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

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

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

BR,

AD

答案 6 :(得分:2)

这也发生在我身上,尽管Yamir在他的帖子中描述了所有步骤,但我无法使其发挥作用。

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

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

sudo chown mysql:mysql /tmp/test.csv

答案 7 :(得分: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'的访问被拒绝(使用密码:是)”):

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;

瞧瞧!

答案 8 :(得分:0)

如果您使用命令行,我发现很简单

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;

答案 9 :(得分:0)

如果您在 MySQL Workbench 上尝试此操作,

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

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

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

enter image description here

答案 10 :(得分:-4)

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