如何解决"MySQL服务器使用-secure-file-priv"错误运行

时间:2020-02-23 14:32:14  来源:igfitidea点击:

在开始时 mysqld服务器,我们可以在选项文件或者命令行上指定程序选项。
这些选项旨在解锁其他MySQL功能,更改变量或者强制限制。

这就是在MySQL Server中读取的选项:MySQLD读取选项 [mysqld][server]groupsmysqld_safe从中读取选项 [mysqld][server][mysqld_safe], 和 [safe_mysqld]groupsmysql.server从中读取选项 [mysqld][mysql.server]团体。

我们可以使用以下内容查看MySQL支持的选项简要摘要:

$mysqld --help

要查看完整列表,请使用命令:

$mysqld --verbose --help

可以在服务器启动时设置的系统变量中的一个 mysqld_secure-file-priv

什么是mysqld_secure-file-priv变量?

变量 secure_file_priv用于限制数据导入和导出操作的效果。
受影响的操作的示例是由此执行的操作 LOAD DATASELECT ... INTO OUTFILE陈述和功能 LOAD_FILE()
这些操作仅允许拥有的用户 FILEprivilege.to查看运行时的当前设置,使用 SHOW VARIABLES语句。
作为root用户的mysql shell

$mysql -u root -p

然后运行

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/|
+------------------+-----------------------+
1 row in set
Time: 0.023s

我们可以看到目录集是 /var/lib/mysql-files/

更改安全文件 - 权力变量目录

可以在[MySQLD]部分下的MySQL选项文件上更改此值。

sudo vim /etc/my.cnf

设置变量下 [mysqld]部分

[mysqld]
secure-file-priv=/mysqlfiles

然后创建配置的目录

sudo mkdir /mysqlfiles
sudo chown -R mysql:mysql  /mysqlfiles/

重新启动MySQL服务以使更改生效

sudo systemctl restart mysqld

再次登录以确认新设置

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+--------------+
| Variable_name    | Value        |
+------------------+--------------+
| secure_file_priv | /mysqlfiles/|
+------------------+--------------+
1 row in set (0.00 sec)

让我们测试来确认我们可以导出到指定的路径。

mysql> SELECT * FROM information_schema.processlist into outfile '/tmp/mysql_processes.txt';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

让我们再试一次写入正确的路径。

mysql> SELECT * FROM information_schema.processlist into outfile '/mysqlfiles/mysql_processes.txt';
Query OK, 1 row affected (0.00 sec)

验证安全文件 - 权力变量

要禁用它,请将变量设置为空值。

[mysqld]
secure-file-priv = ""

重启MySQLD服务

sudo systemctl restart mysqld

重新启动服务后确认

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1 row in set (0.00 sec)

尝试将查询内容保存到其他路径

mysql> SELECT * FROM information_schema.processlist into outfile '/tmp/mysql_processes.txt';
Query OK, 1 row affected (0.00 sec)