ERROR 1045是认证失败(user@host不匹配或插件不兼容),ERROR 1148是local_infile被服务端/客户端双端禁用;FILE权限仅用于LOAD DATA INFILE且需GRANT FILE ON .显式授予,而LOCAL版本需两端开启local_infile并绕过secure_file_priv限制。

为什么给用户配了 INSERT 权限还是报 ERROR 1045 或 ERROR 1148?
因为 LOAD DATA INFILE 和 LOAD DATA LOCAL INFILE 不走普通权限体系——FILE 权限是独立的全局权限,且默认不授予任何用户;而 ERROR 1148 根本不是权限问题,是服务端/客户端双端禁用 local_infile 导致的拦截。
如何正确授予 FILE 权限(仅限 LOAD DATA INFILE,非 LOCAL)
只有当文件放在 MySQL 服务端本地、且你执行的是不带 LOCAL 的 LOAD DATA INFILE 时,才需要这个权限。操作要点:
-
FILE权限必须用GRANT FILE ON *.* TO 'user'@'host'显式授予,GRANT ALL PRIVILEGES不包含它 - 授予后需执行
FLUSH PRIVILEGES生效 - 该权限无法限定到库或表,属于高危权限,生产环境慎用
- 非 root 用户即使有
FILE权限,仍受secure_file_priv路径限制:只能从该目录下读取文件
如何启用 LOAD DATA LOCAL INFILE(推荐日常使用)
绝大多数场景其实该用 LOCAL 版本:文件在你本地机器上,MySQL 服务在远程,这时不依赖 FILE 权限,但必须两端解锁:
- 服务端:修改
my.cnf,在[mysqld]和[client]段都加local_infile=1,然后重启mysqld - 或运行时临时开启(需 SUPER 权限):
SET GLOBAL local_infile = ON - 客户端连接时必须显式启用:
mysql --local-infile=1 -u user -p,或 Python 中pymysql.connect(..., local_infile=True) - 云数据库(如阿里云 RDS)通常禁止
local_infile且不开放 SUPER,此时别硬刚,改用mysqlimport或分批INSERT
secure_file_priv 路径不匹配导致“文件找不到”
这不是路径写错了,而是 MySQL 只认一个目录。查当前限制:
SELECT @@secure_file_priv;
返回 NULL 表示完全禁用导入导出;返回具体路径(如 /var/lib/mysql-files/)表示只允许操作该目录下的文件;返回空字符串 '' 表示不限路径(但 MySQL 进程仍需有对应目录读写权限)。
- 修改方式:在
my.cnf的[mysqld]段添加secure_file_priv = "/your/path"或secure_file_priv = "" - Windows 下注意路径分隔符用正斜杠
/或双反斜杠\,单反斜杠会解析失败 - Linux 下确保 MySQL 进程用户(通常是
mysql)对该路径有读权限,chmod 755 /your/path && chown mysql:mysql /your/path
实际最难缠的从来不是 SQL 语法,而是 local_infile 开关没对齐、secure_file_priv 目录没权限、或者云环境里连 SET GLOBAL 都被锁死——这些地方一卡,再标准的 LOAD DATA 也动不了。


















