MySQL 8.0 导出失败主因是 secure_file_priv 安全围栏拦截:值为 NULL 则完全禁止;为具体路径(如 /var/lib/mysql-files/)则仅允许该目录及显式存在的子目录;为空字符串('')才允任意绝对路径(但 8.0+ 启动警告已弃用)。

MySQL 8.0 导出失败,不是你 SQL 写错了,而是 secure_file_priv 拦住了——它不认你写的路径,只认自己配置的“安全根目录”。
SELECT INTO OUTFILE 报错 1290 的真实原因
错误信息 The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 不代表权限没开、文件名不对或语法有误,而是 MySQL 内核在语句执行前就做了路径拦截。只要 secure_file_priv 不是空字符串(''),你就必须把 INTO OUTFILE 后面的路径写成它的子路径(且是绝对路径)。
-
secure_file_priv值为NULL→ 所有INTO OUTFILE直接拒绝,连语法检查都不进 - 值为
/var/lib/mysql-files/→ 只允许写入该目录或其**显式存在的子目录**,比如/var/lib/mysql-files/export/(但需确保 mysql 用户有写权限) - 值为
''(空字符串)→ 允许任意绝对路径,但 MySQL 8.0 启动时会警告secure_file_priv is set to empty string, which is deprecated,不推荐
show variables like 'secure_file_priv' 返回空字符串却仍报错?
Windows 下常见:你看到返回结果是空行或空字符串,但实际生效值仍是 NULL 或某个路径——因为 MySQL 没读到你改的配置。它按固定顺序找配置文件:C:Windowsmy.ini → C:my.ini → MySQL 安装目录my.ini → C:ProgramDataMySQLMySQL Server 8.0my.ini,只取第一个合法的。
- 别只改
C:Program FilesMySQL...下的my.ini,先查服务用的是哪个:mysqld --verbose --help | findstr "Default options" - 确认配置写在
[mysqld]段下,且格式是secure_file_priv =(等号后直接换行或留空,**不要加引号**) - 改完必须彻底停止服务:
net stop mysql,再net start mysql;reload或systemctl reload无效
导出语句里路径怎么写才不被拒
即使 secure_file_priv 设成了 D:mysql-export,下面这些写法全会失败:
-
INTO OUTFILE 'users.csv'→ 必须是绝对路径,相对路径直接报错 -
INTO OUTFILE 'D:mysql-exportusers.csv'→ 看似对,但 Windows 路径反斜杠会被 MySQL 解析为转义符,得写成双反斜杠D:\mysql-export\users.csv或正斜杠D:/mysql-export/users.csv -
INTO OUTFILE 'D:/mysql-export/../tmp/users.csv'→ MySQL 不做路径规范化,..被视为越界 -
INTO OUTFILE '/data/users.csv'→ 即使该路径存在,只要不在secure_file_priv指定根目录下,一律拦截
正确写法示例:SELECT * FROM users INTO OUTFILE 'D:/mysql-export/users.csv' FIELDS TERMINATED BY ',';
为什么改了配置、重启了、路径也对,还是报 Can't create/write to file
这是权限问题,不是配置问题。secure_file_priv 只管“能不能进这个门”,不管“门里有没有钥匙”。MySQL 进程(通常是 mysql 用户或 SYSTEM 账户)必须对目标目录有写权限。
- Linux:运行
sudo chown mysql:mysql /path/to/export/dir+sudo chmod 755 /path/to/export/dir - Windows:右键目录 → 属性 → 安全 → 编辑 → 添加
SYSTEM或mysql用户,并勾选“写入” - 别忽略子目录:如果导出路径是
D:/mysql-export/2026/,那2026/目录必须已存在,且权限已设好
最常被忽略的一点:MySQL 不会自动创建缺失的子目录层级,INTO OUTFILE 'D:/mysql-export/a/b/c.csv' 要求 a/b 都已存在且可写。











