ERROR 1148是因MySQL 5.7默认禁用LOAD DATA LOCAL INFILE,需服务端(SET GLOBAL local_infile=ON或my.cnf配置)和客户端(--local-infile=1或pymysql中local_infile=True)同时启用才可执行。

MySQL 5.7 中用 LOAD DATA 导入 CSV 大文件,只要避开权限、路径、编码、换行这四类硬性拦路虎,100 万行通常 3–8 秒能跑完;卡住不是语法问题,而是配置或格式没对齐。
为什么执行 LOAD DATA LOCAL INFILE 直接报错 ERROR 1148?
这不是你 SQL 写错了,是 MySQL 5.7 默认关死了这个功能。必须两端同时“解锁”:
- 服务端:登录后执行
SET GLOBAL local_infile = ON;(需要SUPER权限);或者在my.cnf的[mysqld]和[client]段都加local_infile=1,然后重启 mysqld - 客户端:命令行连接时加
--local-infile=1,例如mysql --local-infile=1 -u root -p;Python 用pymysql.connect(..., local_infile=True) - 云数据库(如阿里云 RDS、腾讯云 CDB)基本不开放
SUPER权限,也禁用local_infile,此时别折腾,改用mysqlimport或分批INSERT
secure_file_priv 报错:文件找不到或权限被拒
MySQL 5.7 强制校验文件读取路径,不是你路径写错,而是它只认一个目录:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 查当前允许路径:
SHOW VARIABLES LIKE 'secure_file_priv';,返回值类似/var/lib/mysql-files/ - 必须把 CSV 文件拷到那个目录下(Linux),Windows 是
C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\或配置中指定的路径 - 想临时放开?改
my.cnf,在[mysqld]下加secure_file_priv = "",但生产环境严禁这么做——会绕过安全隔离 - 注意:即使用了
LOCAL,某些旧版客户端仍会检查服务端secure_file_priv,所以两端配置最好保持一致
中文乱码、字段错位、导入中断在第 N 行
CSV 格式和表结构之间差一个空格、一个引号、一个换行,整批就挂,错误提示却只说 “line 123456”:
- 字符集必须显式声明:
CHARACTER SET utf8mb4(不是utf8),且建表时也要用DEFAULT CHARSET=utf8mb4 - 先看真实分隔符:
head -n 1 data.csv | od -c,Excel 导出常用;,有些工具用\t,别默认逗号 - 含换行符的字段(如用户评论)必须加
OPTIONALLY ENCLOSED BY '"',否则 MySQL 把换行当新记录 - 时间字段不能直塞:
SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s');空字符串进NOT NULL列要SET col = NULLIF(@col, '') - 第一行是标题?加
IGNORE 1 LINES;Windows 记事本保存的 CSV 行尾是\r\n,得写LINES TERMINATED BY '\r\n'
百万行导入慢?不是语句问题,是索引和缓冲区拖了后腿
MySQL 5.7 的 InnoDB 在大批量写入时,默认行为会严重拖慢速度:
- 导入前关检查:
SET unique_checks=0; SET foreign_key_checks=0;;导入完再开回=1 - 增大关键缓冲区:在
my.cnf中调高read_buffer_size = 8M、bulk_insert_buffer_size = 64M(对 MyISAM 无效,但 InnoDB 有效) - 别指望
DISABLE KEYS—— 这是 MyISAM 专用,InnoDB 不认;它靠的是关闭唯一性检查 + 调大缓冲区 - 单文件超 100MB 容易超时或内存溢出,用
split -l 50000 data.csv chunk_拆成小块,逐个导入更稳
真正卡住的地方往往不在 SQL 本身,而在你没看到的配置项、没验证的文件头、没意识到的字符集继承链——比如客户端连接时没传 charset=utf8mb4,哪怕表和文件都是 utf8mb4,中间一环断掉就全乱。

















