mysql执行load data报权限拒绝,绝大多数情况不是真缺权限,而是配置没对齐或路径越界——真正该查的不是grant语句,而是local_infile开关、secure_file_priv路径、连接方式这三处。

MySQL执行LOAD DATA报权限拒绝,绝大多数情况不是真缺权限,而是配置没对齐或路径越界——真正该查的不是GRANT语句,而是local_infile开关、secure_file_priv路径、连接方式这三处。
ERROR 1148 / ERROR 3948:客户端没开local_infile
这是最常被误判为“权限不足”的错误。报错如ERROR 1148 (42000): The used command is not allowed with this MySQL version或Loading local data is disabled,本质是客户端禁止发起LOAD DATA LOCAL INFILE请求。
- 命令行连接必须显式加参数:
mysql -u user -p --local-infile=1 - Python(pymysql)需在
connect()中传local_infile=1,仅服务端SET GLOBAL local_infile = ON无效 - Navicat等GUI工具需在连接配置里勾选“Allow local file import”或类似选项
- Java JDBC连接串要加
allowLoadLocalInfile=true,否则即使服务端全开也失败
ERROR 1290:文件路径撞上secure_file_priv限制
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option...说明你指的文件路径不在白名单内,和用户有没有FILE权限完全无关。
- 先查当前限制:
SHOW VARIABLES LIKE 'secure_file_priv'; - 返回值为
/var/lib/mysql-files/?那就必须把文件放进去,且LOAD DATA INFILE里写绝对路径:LOAD DATA INFILE '/var/lib/mysql-files/data.csv' - 返回值为
NULL?表示禁用所有导入导出,只能改配置文件my.cnf,加secure_file_priv = ''后重启mysqld - 注意:
secure_file_priv是只读变量,SET GLOBAL无法修改
ERROR 1045:真缺FILE权限,但仅影响LOAD DATA INFILE
这个错误明确指向权限缺失,但只发生在不带LOCAL的LOAD DATA INFILE场景——即文件在MySQL服务器本地磁盘上,且由服务端直接读取。
- 检查权限:
SHOW GRANTS FOR 'user'@'host';,确认含GRANT FILE ON *.* -
FILE是全局权限,不能按库或表授予,GRANT ALL ON db.*不包含它 - 非root用户若没
FILE,又不想开,就改用LOAD DATA LOCAL INFILE(前提是客户端和服务端都允许) - 注意:
DEFINER用户权限不足也会在存储过程/触发器中触发此错,但触发器里根本不能用LOAD DATA(见ERROR 1314)
ERROR 1314:别在触发器里写LOAD DATA,语法层直接拒
这个错误最容易让人困惑:“我权限全开了、路径也对、local_infile也ON了,怎么还报错?” 因为ERROR 1314 (42000): LOAD DATA is not allowed in stored procedures, functions, triggers, or events是MySQL硬编码的语法拦截,从5.0起就没变过。
- 触发器、存储过程、函数、事件——全部禁止出现
LOAD DATA INFILE或LOAD DATA LOCAL INFILE - 动态SQL(
PREPARE/EXECUTE)也绕不过,解析阶段就报错 -
FILE权限、local_infile设置、secure_file_priv路径,全都不参与校验 - 真要自动加载数据,得移出数据库:用应用层监听业务事件后调用
LOAD DATA LOCAL INFILE,或用Event Scheduler轮询标志表再执行(Event本身不受1314限制)
真正麻烦的不是报错本身,而是不同错误共用相似关键词(比如都带“access denied”),容易让人反复折腾权限却漏掉local_infile=1这种客户端开关,或者死磕触发器想绕过1314。盯住错误码,比猜权限更省时间。











