Mysql导出文件时显示:
mysql> select * from users into outfile '/root/users.txt'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
原因不太清楚,网上说可能是像 INTO 这些操作只允许有FILE权限的用户使用。总之就是权限问题,这里需要用到一个表,这个表存放着Mysql的系统参数,:
mysql> show variables like 'secure_file_priv'; +------------------+-----------------------+ | Variable_name | Value | +------------------+-----------------------+ | secure_file_priv | /var/lib/mysql-files/ | +------------------+-----------------------+ 1 row in set (0.01 sec)
这里我的secure_file_priv 字段是有值的,且固定在/var/lib/mysql-files/中,代表Mysql导出数据只能导到这个目录中,导在其他地方都是没有权限的:
mysql> select * from users into outfile '/var/lib/mysql-files/users.txt'; Query OK, 6 rows affected (0.00 sec)
这里的secure_file_priv字段是值是可以设置的(怎么改我也不知道,自己百度)
- 如果为空,则该变量无效,可以无限制导出,这不是一个安全的设置
- 如果设置为目录的名称,服务器会将导入和导出操作限制为仅处理该目录中的文件。目录必须存在;服务器不会创建它。
- 如果设置为NULL,服务器将禁用导入和导出操作。
修改系统变量
mysql> set global secure_file_priv = ''; ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable //直接修改显示read only,所以只能从配置文件下手
另开一个窗口,直接修改配置文件my.cnf。我这里省略了很多注释,这里修改时需要注意的是,不能直接在最后一行添加:secure_file_priv=‘’ ,这样是不对的,因为最后一行在[mysql]一栏。变量是需要加到[mysqld]下的
[root@VM-0-7-centos mysql-files]# vim /etc/my.cnf …… [mysqld] …… datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock …… secure_file_priv = '' //正确的添加位置在这里,[mysqld]的里面 [mysqld_safe] …… [mysql] ……
添加后重启mysql服务
[root@VM-0-7-centos mysql-files]# service mysqld restart Redirecting to /bin/systemctl restart mysqld.service
重启后重新登陆Mysql,发现已经改好了:
mysql> show variables like 'secure_file_priv'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | secure_file_priv | | +------------------+-------+ 1 row in set (0.00 sec)