必须修改配置文件并重启MySQL服务才能生效,否则导出必报ERROR 1290;secure_file_priv值为NULL时完全禁用导出,指定路径时仅限该目录(需提前创建并赋权mysql用户),空字符串在新版已禁用。

你不能动态修改 secure_file_priv,必须改配置文件并重启 MySQL 服务——跳过重启或权限设置,后续所有操作都会报 ERROR 1290。
查当前 secure_file_priv 值,确认它是不是真正在拦你
导出失败时看到 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option...,八成就是它在起作用。连上 MySQL 后立刻执行:
SHOW VARIABLES LIKE 'secure_file_priv';
结果只有三种可能:
-
NULL:所有SELECT ... INTO OUTFILE、LOAD DATA INFILE、LOAD_FILE()全部被硬性拒绝,哪怕用户有FILE权限也没用 -
/var/lib/mysql-files/(或其他具体路径):只允许读写该路径下的文件;子目录必须显式存在,且 MySQL 进程要有写权限 -
''(空字符串):MySQL 8.0.28+ 已移除支持,设了会导致启动失败;旧版虽允许,但生产环境严禁使用
改配置前先建目录、赋权,顺序不能错
很多问题不是配置写错了,而是目录没准备好。操作顺序必须是:
- 选一个绝对路径,比如
/data/mysql-export,先创建:sudo mkdir -p /data/mysql-export - 把属主设为 MySQL 进程用户(通常是
mysql:mysql):sudo chown mysql:mysql /data/mysql-export(不是root,也不是777) - 编辑配置文件(常见位置:
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段下加一行:secure_file_priv = /data/mysql-export - 重启服务:
sudo systemctl restart mysql(Docker 用户需重新构建镜像或挂载对应目录)
重启后务必再执行一次 SHOW VARIABLES LIKE 'secure_file_priv',确认值已更新。改完不重启 = 白改;目录存在但属主不是 mysql = 执行时报 ERROR 1 (HY000)。
导出语句必须用绝对路径,且路径要和 secure_file_priv 完全匹配
SELECT * INTO OUTFILE 不接受相对路径,也不接受通配或变量拼接:
- ✅ 正确:
SELECT * INTO OUTFILE '/data/mysql-export/users.csv' FROM users; - ❌ 错误:
SELECT * INTO OUTFILE 'users.csv' FROM users;(报ERROR 1290) - ❌ 错误:
SELECT * INTO OUTFILE '/tmp/users.csv' FROM users;(即使/tmp可写,只要不在secure_file_priv范围内就拒)
Windows 下注意路径分隔符:配置里写 secure_file_priv = C:/mysql-export,SQL 中也得用正斜杠或双反斜杠,单反斜杠 C:\mysql-export 会解析失败。
Docker 环境下最容易漏掉挂载和用户映射
容器内改了配置,但宿主机没挂载对应目录,等于白搭。两种常用方式:
- 沿用默认路径:启动时加
-v /host/export:/var/lib/mysql-files,并确保容器内secure_file_priv指向该路径 - 自定义路径:挂载
-v /host/mydata:/mydata,再通过环境变量或配置文件设secure_file_priv = /mydata
关键检查点:ls -ld /mydata 看属主是不是 mysql;进容器执行 id -u mysql 确认 UID 是否能写该目录。真正卡住的从来不是哪行配置,而是操作系统层面 MySQL 进程到底有没有那个目录的写权限。


















