error 1148是因mysql默认禁用load data local infile,需服务端(set global local_infile=on或my.cnf配置)和客户端(--local-infile=1或pymysql中local_infile=true)同时启用;云数据库不支持则改用mysqlimport或分批insert。

LOAD DATA INFILE 本身不慢,卡住的几乎全是配置、路径或格式问题——不是语法写错了,而是 MySQL 主动拦住了你。
为什么执行就报 ERROR 1148?
这是 MySQL 默认禁用 LOAD DATA LOCAL INFILE 导致的硬性拦截,和你的 SQL 语句无关。必须同时满足两个条件:
- 服务端开启:
SET GLOBAL local_infile = ON(需SUPER权限),或在my.cnf的[mysqld]和[client]段都加local_infile=1并重启 - 客户端启用:命令行连接加
--local-infile=1,例如mysql --local-infile=1 -u root -p;Python 用pymysql.connect(..., local_infile=True) - 云数据库(如阿里云 RDS、腾讯云 CDB)通常不开放
SUPER权限,也无法改my.cnf,此时直接放弃这条路,改用mysqlimport或分批INSERT
secure_file_priv 报错:文件找不到或 Permission denied
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\) - 别试图设
secure_file_priv = ""绕过——生产环境严禁,会破坏安全隔离 - 即使用了
LOCAL,某些旧客户端仍会校验服务端该变量,建议两端配置保持一致
字段错位、导入中断、中文乱码怎么防?
百万级 CSV 导入失败,90% 出在格式没对齐。关键点不是“怎么写”,而是“怎么验”:
- 真实分隔符 ≠ 逗号:用
head -n 1 data.csv | od -c看第一行原始字节,Excel 导出常用;,某些工具用\t - 含换行符的字段(如用户评论)必须加
OPTIONALLY ENCLOSED BY '"',否则 MySQL 把换行当新记录 - 时间字段如
"2024-03-15 14:22:08"直接进DATETIME列会失败,得用SET created_at = STR_TO_DATE(@created_at, '%Y-%m-%d %H:%i:%s') - 空字符串
""往NOT NULL列导会报错,加SET col = NULLIF(@col, '') - 中文乱码优先检查连接字符集:
SET NAMES utf8mb4,且 CSV 文件本身保存为 UTF-8 编码(别用 Excel 默认的 ANSI)
性能差、超时、内存溢出怎么办?
导入慢不是因为数据多,而是索引和缓冲区没调好:
- InnoDB 表导入前关检查:
SET unique_checks=0; SET foreign_key_checks=0;,完事后记得开回来 - 大文件务必拆分:用
split -l 100000 data.csv chunk_拆成约 50MB 的块,避免单次超时或客户端内存爆掉 - 调大服务端参数(需重启或动态 SET):
innodb_buffer_pool_size(至少 4GB)、read_buffer_size(8M)、bulk_insert_buffer_size(64M) - 别信
DISABLE KEYS:那是 MyISAM 专用,InnoDB 下无效;LOW_PRIORITY反而拖慢,除非你真需要让读请求优先
最常被忽略的一点:导入前用 head -n 5 data.csv 和 od -c 看真实结构,比反复试错快十倍。格式不对,再快的命令也白搭。










