MySQL 全局配置 --secure-file-priv
文章目录
一则问题
在执行导出 INFORMATION_SCHEMA.OPTIMIZER_TRACE
内容到本地文件时:
|
|
报错提示如下:
|
|
原因分析
查看系统变量 secure_file_priv
:
|
|
MySQL 对于导入导出的目录是有限制的,只允许指定的目录才能导入导出。
此处变量值为 NULL
,即没设置允许操作的目录,所以没法导出到文件。
知识解读
名词 | 含义 |
---|---|
Command-Line Format | --secure-file-priv=dir_name |
System Variable | secure_file_priv |
Scope | Global |
Dynamic | No |
Type | String |
Default Value | platform specific |
Valid Values | empty string 、dirname 、NULL |
secure_file_priv
这个变量被用于限制导入和导出的数据目录,比如 LOAD DATA
和 SELECT ... INTO OUTFILE
语句,以及 LOAD_FILE()
函数。这些操作限制了哪些用户拥有文件操作权限。
secure_file_priv
有些设置选项:
- 如果为空,不做目录限制,即任何目录均可以。
- 如果指定了目录,MySQL 会限制只能从该目录导入、或导出到该目录。目录必须已存在,MySQL 不会自动创建该目录。
- 如果设置为
NULL
,MySQL 服务器禁止导入与导出功能。
该变量的默认值,是由编译时的 CMake
选项而定,具体可参考官方文档。
MySQL 服务器在启动时,会检查 secure_file_priv
变量值,如果值不安全会在错误日志中写一个 WARNING 级别的日志。以下情况属于不安全的设置:
- 值为空
- 值为
--datadir
目录或其子目录 - 所有用户均有权限访问的目录
比如当我设置为空时,错误日志中就多了这么条:
|
|
如果配置的目录并不存在,MySQL 服务器也会写一条错误日志。例如:
|
|
解决方案
-
如果变量值为
NULL
,那么只能修改服务器配置:修改
my.cnf
文件,在[mysqld]
块下,如果没有secure_file_priv
则新增指定目录:
secure_file_priv=/path/to/data
不限目录:
secure_file_priv=
禁止操作:
secure_file_priv=NULL
-
如果变量值为具体目录,则可以考虑导出到指定目录,或者从指定目录导出。
-
如果变量值为空,则可以使用任意目录。