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


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


77
2018-02-08 11:54


起源




答案:


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

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

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


148
2017-11-12 06:59



这是另一回事。它将您的文件上传到临时目录中的服务器。这有时是必要的,但如果infile已经在MySQL服务器上,那你只是做了多余的工作。 - jeffcook2150
是的,这对我有用,我是通过ssh转发数据库服务器端口,我猜它是在没有LOCAL部分的远程数据库服务器上查找文件 - mike
@jeremysawesome对我来说这会产生以下错误:错误代码:1148此MySQL版本不允许使用该命令。我为这个问题尝试了一些答案,例如将mysql文件修改为local-infile = 1,但也失败了。 - OrwellHindenberg
将mySQL更新到6.2.5为我解决了这个问题 - OrwellHindenberg
你可能也必须用mysql调用mysql --local-infile 选项。 - shabbychef


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

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

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

22
2018-05-27 01:42



+1:这对我有用: 您尝试加载的文件不是世界可读的(您需要文件和所有父目录是世界可读的:chmod 755目录;以及,chmod 744 file.dat)。我没有更改所有目录的权限 - gavdotnet
用户Tatiana指出,您无法为每个数据库授予FILE权限,仅适用于整个服务器。 grant命令将是“GRANT FILE on” 。 用户@'localhost'IDENTIFIED BY'password');“ - JAL
@JAL我认为你的意思是“授予用户...... * *给用户......” - 可能是星号字符被剥离了 - Eugene M
正如@Eugene M所说,这给出了错误 DB GRANT和GLOBAL PRIVILEGES的使用不正确 - Accountant م


尝试使用此命令:

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

这应该工作。它适用于我的情况。


12
2018-04-02 17:36



这对我有用,不知道为什么它被downvoted - metaprogrammer
ERROR 1148 (42000): The used command is not allowed with this MySQL version - Stewart


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

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


8
2018-02-08 23:46



在共享的虚拟主机上:使用“LOAD DATA LOCAL INFILE”会有帮助吗? - Peter


来自里昂的字符串给了我一个非常好的提示:在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();

3
2017-08-09 17:50





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

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

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

BR,

广告


2
2018-05-11 10:21





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

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

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

sudo chown mysql:mysql /tmp/test.csv

1
2017-08-21 15:02



这个解决方案对我来说就像一个魅力。投票 - zhilevan


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


-4
2018-02-08 11:55



我不这么认为。我可以使用相同的密码进行其他查询。 - Brian