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


105

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

LOAD DATA INFILE

我收到以下错误

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

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

Answers:


197

我也刚遇到这个问题。我必须添加LOCAL到我的SQL语句中。

例如,这带来了权限问题:

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

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

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

12
这是另一回事。它将您的文件上传到临时目录中的服务器。有时候这是必要的,但是如果infile已经在MySQL服务器上,那么您就在做多余的工作。
jeffcook2150,2012年

1
是的,这确实帮了我大忙,我正在通过ssh转发数据库服务器端口,我想它正在寻找没有本地部分的远程数据库服务器上的文件
Mike

2
对我来说,@ jeremysawesome会产生以下错误:错误代码:1148此MySQL版本不允许使用的命令。我尝试了一些针对此问题的答案,例如将mysql文件修改为local-infile = 1,但同样失败。
OrwellHindenberg

mySQL更新到6.2.5为我解决了这个问题
OrwellHindenberg

4
您可能还需要使用该--local-infile选项来调用mysql 。
shabbychef

32

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

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

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

+1:这对我有用:尝试加载的文件不可读(您需要该文件和所有父目录都可读):chmod 755目录;以及chmod 744 file.dat)。我没有更改所有目录的权限
gavdotnet

1
用户Tatiana指出,您不能仅对整个服务器授予每个数据库FILE特权。grant命令会“上获得文件用户@‘localhost’的IDENTIFIED BY‘密码’);”
2013年

3
@JAL我认为您的意思是“将GRANT FILE ON *。*发送给用户...”-可能删除了星号字符
Eugene M


19

尝试使用以下命令:

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

这应该工作。就我而言,它奏效了。


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
斯图尔特

@Stewart,请从上述命令中删除“ local”。全局变量'local_infile'变量设置为'ON'时,更高的mysql版本似乎不支持该标志(如下所示)。因此,该命令将是:mysql>将文件“ home / data.txt”中的数据加载到表customer中;+ --------------- + ------- + | 变量名| 价值| + --------------- + ------- + | local_infile | 开| + --------------- + ------- +
Kamran Hyder

@KamranHyder听起来您对我有很好的答案。为什么不将其添加为完整答案?
斯图尔特

10

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

如果您使用共享的Web托管,则托管服务提供商可能会阻止它。


在共享的虚拟主机上:使用“ LOAD DATA LOCAL INFILE”是否有帮助?
彼得

3

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

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


2

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

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

最终,我能够通过运行来解决问题:

sudo chown mysql:mysql /tmp/test.csv

2

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

登录为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;


添加--local-inline对我有帮助。但是,在我的情况下,local_infile全局变量已设置为ON。我认为用户最好先弄清楚自己在此变量中写了什么值,然后再进行修改。
尤金·梅瑟克

对于RDS用户=>添加--local-infile在RDS上对我有帮助,但是SET GLOBAL local_infile = 1;在RDS中似乎不起作用,但是无论如何,这--local-infile确实起到了作用
事实

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;

瞧!


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.