secure_file_priv 是 MySQL 强制启用的安全围栏,非可选策略:设为 NULL 则完全禁止导入导出;设为空字符串('')允许任意路径但已弃用且危险;设为具体路径(如/var/lib/mysql-files/)则仅该目录及其显式授权子目录可读写,且需确保 mysql 用户有权限,否则报错。

secure_file_priv 不是用来“限制导出路径”的可选策略,而是 MySQL 强制启用的硬性安全围栏——它直接决定 SELECT ... INTO OUTFILE 和 LOAD DATA INFILE 能不能执行、在哪执行。设错值或忽略权限细节,命令必报 ERROR 1290 (HY000) 或 ERROR 1 (HY000): Can't create/write to file,不是语法问题,是权限和路径双重拦截。
查当前值:别信配置文件,只信 SELECT @@secure_file_priv
配置文件里写的不等于实际生效值。动态参数、启动命令行参数(如 mysqld --secure-file-priv=/tmp)会覆盖配置。运行以下语句获取真实值:
SELECT @@secure_file_priv;
返回结果只有三种可能:
-
NULL→ 所有导入导出操作被彻底禁用,连INTO OUTFILE都会直接报错 - 空字符串(
'')→ 允许任意路径(MySQL 5.7 兼容,但 8.0+ 启动时会警告secure_file_priv is set to empty string, which is deprecated,不推荐) - 具体路径(如
/var/lib/mysql-files/)→ 唯一合法根目录,且必须严格匹配字面量
改配置:只能写进 [mysqld] 段,重启才生效
secure_file_priv 是只读变量,SET GLOBAL secure_file_priv = ... 会报错 ERROR 1238 (HY000): Variable 'secure_file_priv' is a read only variable。必须修改配置文件:
- 常见路径:
/etc/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf(Debian/Ubuntu)、/usr/local/etc/my.cnf(macOS Homebrew) - 在
[mysqld]段下添加一行:secure_file_priv = /data/mysql-export/(结尾斜杠可选,但路径必须存在) - 改完必须
sudo systemctl restart mysql(或mysqld),reload无效
路径匹配:MySQL 不解析软链、不展开 ..、不自动补斜杠
即使你设了 secure_file_priv = /data/mysql-export,下面这些都会失败:
-
INTO OUTFILE '/data/mysql-export/sub/data.csv'→ 子目录未显式授权,除非你把值设成/data/mysql-export/并确保子目录存在且mysql用户可写 -
INTO OUTFILE '/data/mysql-export/../tmp/data.csv'→ 上级路径被拒绝,MySQL 不做路径规范化 -
INTO OUTFILE 'data.csv'→ 必须是绝对路径,相对路径直接报错 -
INTO OUTFILE '/data/mysql-export/data.csv'但目录属主是root:root→ 报ERROR 1 (HY000): Can't create/write to file,因为 MySQL 进程以mysql用户身份运行
修复方法:创建目录并赋权:sudo mkdir -p /data/mysql-export && sudo chown mysql:mysql /data/mysql-export
绕过限制?别设 secure_file_priv = '' 或 /
网上有些教程教你在配置里写 secure_file_priv = "/" 或留空来“放开限制”,这等于主动拆除安全围栏:
- 设为
/→ MySQL 允许写入任意路径,包括/etc/passwd、/root/.bash_history等敏感位置(只要 MySQL 进程有权限) - 设为空字符串(
'')→ MySQL 8.0+ 启动时警告,且一旦数据库被攻破,攻击者可直接导出系统文件或写入 Webshell - 真正安全的做法是:指定一个专用目录(如
/var/lib/mysql-export/),仅对该目录开放读写,并通过 OS 层权限控制访问范围
复杂点在于:这个目录既要被 MySQL 进程写入,又不能暴露给其他用户;既要满足业务导出需求,又不能成为提权跳板——路径本身只是第一道锁,权限才是第二道。


















