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

Posted

技术标签:

【中文标题】在 MySQL 中加载数据 infile 的访问被拒绝【英文标题】:access denied for load data infile in MySQL 【发布时间】:2011-01-14 08:20:16 【问题描述】:

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

LOAD DATA INFILE

我收到以下错误

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

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

【问题讨论】:

【参考方案1】:

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

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

LOAD DATA INFILE '$file' INTO TABLE $table

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

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

【讨论】:

这有不同的作用。它将您的文件上传到服务器的临时目录中。有时这是必要的,但如果 infile 已经在 MySQL 服务器上,那么您只是在做多余的工作。 是的,这对我有用,我通过 ssh 转发数据库服务器端口,我猜它正在远程数据库服务器上寻找没有本地部分的文件 @jeremysawesome 对我来说会产生以下错误:错误代码:1148 此 MySQL 版本不允许使用使用的命令。我尝试了一些解决此问题的方法,例如将 mysql 文件修改为 local-infile=1,但也失败了。 您可能还需要使用--local-infile 选项调用mysql。 并且还使用文件的绝对路径:/home/[currentuser]/filename【参考方案2】:

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

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

'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 文件.dat)。我没有更改所有目录的权限 用户 Tatiana 指出您不能授予每个数据库的 FILE 权限,只能授予整个服务器。授予命令将是“GRANT FILE on . to user@'localhost' IDENTIFIED BY 'password');” @JAL 我想你的意思是“GRANT FILE ON *.* to user ...”——可能星号字符被删除了 正如@Eugene M 所说,这给出了错误Incorrect usage of DB GRANT and GLOBAL PRIVILEGES【参考方案3】:

尝试使用此命令:

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

这应该可行。它在我的情况下有效。

【讨论】:

ERROR 1148 (42000): The used command is not allowed with this MySQL version @Stewart,请从上述命令中删除“本地”。当全局变量 'local_infile' 变量设置为 'ON' 时,更高版本的 mysql 似乎不支持此标志(如下所示)。因此,命令将是; mysql> 将数据 infile 'home/data.txt' 加载到表 customer 中; +---------------+--------+ |变量名 |价值 | +---------------+--------+ |本地文件 |开 | +---------------+--------+ @KamranHyder 听起来你对我的回答很好。为什么不将其添加为完整答案?【参考方案4】:

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

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

【讨论】:

在共享虚拟主机上:使用“LOAD DATA LOCAL INFILE”会有所帮助吗?【参考方案5】:

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

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 就可以了 【参考方案6】:

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

【讨论】:

【参考方案7】:

我遇到了同样的问题,按照以下步骤解决:

激活 load_infile 变量 对我的自定义 mysql 用户的大文件权限 deactivate 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,

广告

【讨论】:

【参考方案8】:

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

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

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

sudo chown mysql:mysql /tmp/test.csv

【讨论】:

【参考方案9】:

我发现加载 MySQL 表可以快速而轻松(我使用的是 python / Django 模型管理器脚本):

1) 创建所有列的表 VARCHAR(n) NULL 例如:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);

2)从csv中删除标题(第一行),然后加载(如果你忘记了本地,你会得到“#1045 - Access denied for user 'user'@'localhost' (using password: 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;

瞧!

【讨论】:

【参考方案10】:

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

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

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

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

【讨论】:

【参考方案11】:

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

【讨论】:

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

以上是关于在 MySQL 中加载数据 infile 的访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql-connector-java上允许LOAD DATA LOCAL INFILE?

JDBC访问数据库

从库中加载用户生成的格式

设备锁定时在 Today 扩展中加载文件

在Arccatalog中加载并查看已经发布的地图服务

Python Mysql 在文件中加载数据