2010-02-08 102 views
69

我一直在PHP中使用MySQL查询,但是当我尝试LOAD DATA INFILE时,出现以下错误#1045 - Access denied for user 'user'@'localhost' (using password: YES) 有没有人知道这意味着什么?访问被拒绝在MySQL中加载数据infile

回答

-4

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

+1

我不这么认为。我可以使用相同的密码进行其他查询。 – Brian 2010-02-08 11:56:50

8

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

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

+0

在共享虚拟主机上:使用“LOAD DATA LOCAL INFILE”会有帮助吗? – Peter 2016-10-25 18:21:42

137

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

例如,这给人的权限问题:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

添加“本地”你的语句和权限问题就会消失。像这样:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

+8

这是做不同的事情。它将您的文件上传到临时目录中的服务器。这有时是必需的,但如果infile已经在MySQL服务器上,那么你只是在做冗余工作。 – jeffcook2150 2012-10-11 05:07:22

+0

是的,这是为我做的伎俩,我通过ssh转发数据库服务器端口,我想它是在远程数据库服务器上查找没有本地部分的文件 – mike 2013-09-10 05:40:51

+0

@jeremysawesome对我来说这会产生以下错误:错误代码:这个MySQL版本不允许使用命令。我尝试了一些解决这个问题的方法,比如将mysql文件修改为local-infile = 1并且失败了。 – OrwellHindenberg 2015-07-20 19:37:01

20

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

访问被拒绝的错误可能意味着:(GRANT FILE数据库*用户@ 'localhost' 的IDENTIFIED BY '密码')

  • '用户' @ 'localhost' 的没有FILE权限;或者,
  • 您尝试加载的文件在运行mysql服务器的机器上不存在(如果使用LOAD DATA INFILE);或者,
  • 您尝试加载的文件在本地计算机上不存在(如果使用LOAD DATA LOCAL INFILE);或者,
  • 你要加载的文件不是全局可读(您需要的文件所有的父目录成为世界可读权限:chmod 755目录;以及,搭配chmod 744 FILE.DAT)
+0

+1:这对我有效:_您正在尝试的文件加载不是世界可读的(你需要文件和所有父目录是世界可读的:chmod 755目录;以及,chmod 744 file.dat)_。我没有更改我的所有目录的权限 – gavdotnet 2013-07-04 11:53:32

+1

用户Tatiana指出,您不能授予每个数据库的FILE权限,仅针对整个服务器。授予命令将是“授予文件在*。*到user @'localhost'IDENTIFIED BY'密码');” – JAL 2013-12-27 06:51:23

+2

@JAL我认为你的意思是“授予文件在\ *。\ *到用户...”“ - 可能是星号字符被删除 – 2014-06-06 20:27:18

3

来自里昂的字符串给了我一个非常好的提示:在Windows上,我们需要使用slahes而不是反斜杠。此代码的工作对我来说:使用此命令

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

尝试:

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

这应该工作。它在我的情况下工作。

+0

这对我有用,不知道为什么它被降低了 – metaprogrammer 2017-04-06 19:34:17

+0

'错误1148(42000):使用的命令不允许这个MySQL版本' – Stewart 2018-02-02 09:20:38

1

这发生在我身上,以及尽管已经跟随我不能使它工作由Yamir在他的岗位描述的所有步骤。

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

最后我通过跑步来解决这个问题:

sudo chown mysql:mysql /tmp/test.csv 
+0

这个解决方案对我来说就像一个魅力。投票 – zhilevan 2017-10-07 12:21:19