禁用安全权限以在 MySQL 上加载数据

问题描述 投票:0回答:7

我在 Windows 10 计算机上运行 MySQL 5.7。我已经阅读了有关此主题的所有 SO 线程,但仍然不知道如何加载我的数据并克服此错误:

Error Code: 1290. The MySQL server is running with the --secure-file-priv 
option so it cannot execute this statement

我1)检查了设置以更改它们以便能够从保存数据集的目录加载,2)以管理员身份打开MySQL并检查命令行并确认安全文件确实指向到我的目录,3) 并在 init 文件中确认它指向包含我的文件的正确目录。我尝试更改数据集的位置,使其位于新文件夹中,并确认已使用上述方法将其移动到那里,但它仍然不起作用。

欢迎任何和所有帮助,谢谢。

mysql sql windows security
7个回答
15
投票

我无法重现该问题。

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.13    |
+-----------+
1 row in set (0,00 sec)

mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| NULL                      |
+---------------------------+
1 row in set (0,00 sec)

-- USE ...

mysql> LOAD DATA INFILE '/var/lib/mysql-files/myfile.csv'
    -> INTO TABLE `test_files`
    -> COLUMNS TERMINATED BY ',' ENCLOSED BY '\"'
    -> LINES TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv
option so it cannot execute this statement

更改文件:

/etc/mysql/my.cnf

[mysqld]
.
.
.
secure_file_priv=/var/lib/mysql-files/
.
.
.

重新启动MySQL。

mysql> SELECT @@GLOBAL.secure_file_priv;
+---------------------------+
| @@GLOBAL.secure_file_priv |
+---------------------------+
| /var/lib/mysql-files/     |
+---------------------------+
1 row in set (0,00 sec)

mysql> LOAD DATA INFILE '/var/lib/mysql-files/myfile.csv'
    -> INTO TABLE `test_files`
    -> COLUMNS TERMINATED BY ',' ENCLOSED BY '\"'
    -> LINES TERMINATED BY '\n';
Query OK, 3 rows affected (0,00 sec)
Records: 3  Deleted: 0  Skipped: 0  Warnings: 0

参见 6.1.4 服务器系统变量:: secure_file_priv


9
投票

这适用于 MacOs Sierra 10.12.6:

使用命令

mysql --help | more

并查找写有以下内容的行:

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf 
~/.my.cnf

就我而言,我尝试在主目录中创建 my.cnf 但它不起作用。我找到的唯一解决方案是使用

在文件夹等中创建文件
sudo vim /etc/my.cnf

然后放进去

[mysqld_safe]
[mysqld]
secure-file-priv = ""

然后您可以检查一切是否正常

select @@GLOBAL.secure_file_priv;

在 mysql 中检查该值是否为空且不同于 NULL。

最后将文件保存在/tmp目录下,然后将其移动到您想要的目录中。或者(但可能不安全)使用

chmod 1777 dir

其中 dir 是您在其中写入文件的目录的名称。


6
投票

在 MACOSX 上,将 .my.cnf 添加到您的主目录,内容为:

[mysqld_safe]
[mysqld]
secure_file_priv=""

https://github.com/Homebrew/homebrew-versions/issues/1552


3
投票

请注意,在 Windows 下,将“secure_file_priv”设置为不同的路径或通过将其设置为完全禁用它:

secure_file_priv=""

如果 MySQL 服务在低权限帐户上运行(默认 5.7 安装),则可能无法工作。您可以通过在属性 -> 登录下的服务中选择“本地系统帐户”来更改它。


0
投票
  1. 检查您从中导入的目录的操作系统权限。
  2. 尝试通过“CVS using LOAD DATA”导入数据时,选择使用本地选项。

0
投票

尝试将 \ 翻转为 / 例如:

'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/'


0
投票

我使用的是 macOS,但无法使用

secure_file_priv
设置修复该问题。 事实上更新设置对我来说根本不起作用.. 我修改了
/opt/homebrew/etc/my.cnf
文件,因为这是我的系统中唯一存在的 my.cnf 文件。我什至添加了
/etc/my.cnf
文件并添加了上述更改,并重新启动了mysql,但它不起作用。

对我有用的解决方案是

  1. 使用
    mysql --local-infile=1 -u <your_username> -p
  2. 启动 mysql 服务器
  3. 在导入查询中使用关键字
    LOCAL
LOAD DATA LOCAL INFILE '/path/to/your/csv/file.csv'
INTO TABLE your_table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

希望这个解决方案有效!

© www.soinside.com 2019 - 2024. All rights reserved.