MySQL默认禁用LOCAL INFILE,需服务端设local_infile=ON、客户端加--local-infile=1;FILE权限仅适用于服务端LOAD DATA INFILE且受secure_file_priv路径限制。

LOAD DATA LOCAL INFILE 报错 ERROR 1148: The used command is not allowed with this MySQL version
这不是权限问题,而是服务端禁用了 LOCAL INFILE 功能。MySQL 默认关闭该选项,客户端即使有权限也无法触发本地文件读取。
- 检查服务端是否启用:连接后执行
SHOW VARIABLES LIKE 'local_infile';,返回OFF即被禁用 - 临时开启(需 SUPER 权限):
SET GLOBAL local_infile = ON; - 永久生效:在
my.cnf的[mysqld]段加local_infile = ON,重启 mysqld;同时确保[client]或[mysql]段有local_infile = 1 - 使用 mysql 命令行时,必须显式加
--local-infile=1参数,否则即使服务端开了也不生效
用户有 FILE 权限但 LOAD DATA INFILE 仍报 ERROR 1045 或 ERROR 1142
FILE 权限只对 LOAD DATA INFILE(服务端读取)有效,且仅允许读取服务器本地文件(如 /var/lib/mysql-files/),不作用于 LOCAL 版本。错误提示里出现 Access denied for user ... (using password: YES) 或 SELECT command denied,说明权限没给全或路径越界。
- 确认已授予
FILE权限:GRANT FILE ON *.* TO 'username'@'host'; FLUSH PRIVILEGES; -
LOAD DATA INFILE要求文件必须位于服务端可访问路径,且 MySQL 进程有读权限;常见安全路径是/var/lib/mysql-files/(由secure_file_priv变量指定) - 查当前限制路径:
SELECT @@secure_file_priv;,若返回NULL表示完全禁用INFILE,只能用LOCAL方式(前提已开启) - 不要尝试把文件放 /tmp 或用户 home 目录下直接读——大概率被
secure_file_priv拦截
LOAD DATA LOCAL 需要客户端和服务端双重授权
即使 local_infile 开了、用户也有 FILE 权限,MySQL 8.0+ 还默认拒绝非 localhost 连接的 LOCAL 请求,防止中间人窃取客户端文件。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 服务端需额外设置:
local_infile = ON(已在前文提过),且skip_show_database不影响此行为 - 客户端连接时必须启用 LOCAL 功能:JDBC 要加
参数;Python 的 pymysql 需显式传local_infile=True;命令行必须带--local-infile=1 - MySQL 8.0.27+ 引入更细粒度控制:可通过
LOAD DATA LOCAL白名单机制限制哪些用户能用(需配置local_infile_whitelist),但默认未启用
绕过权限限制的替代方案
当无法修改服务端配置或没有 SUPER 权限时,硬扛权限不是唯一出路。
- 改用
INSERT ... VALUES批量插入:把 CSV 转成 SQL 插入语句(注意单次不超过max_allowed_packet) - 用
mysqlimport工具:它底层调用LOAD DATA INFILE,但会自动适配secure_file_priv路径(需文件先复制到对应目录) - 通过应用层流式解析 + 批量
INSERT:例如 Python 用pandas.read_csv+to_sql(..., if_exists='append', chunksize=1000) - 注意:所有绕过方式都会丢失
LOAD DATA的原生性能优势,尤其百万级以上数据时延迟明显
真正卡住人的往往不是“没给 FILE 权限”,而是 secure_file_priv 的路径锁定、local_infile 的双端开关不同步,或者客户端驱动默认禁用 LOCAL。调试时优先查这三个值:@@local_infile、@@secure_file_priv、客户端连接参数是否含 local_infile 启用标识。










