error 1290 是因 --secure-file-priv 限制导致,必须先执行 show variables like 'secure_file_priv' 查出允许路径(如 /var/lib/mysql-files/),再将文件移入该目录并用相对路径加载;若值为 null 或空字符串,则需调整配置或改用 load data local infile(需服务端启用 local_infile、客户端加 --local-infile=1、sql 中加 local 关键字)。

LOAD DATA INFILE 报 ERROR 1290 怎么办
这是最常卡住人的第一步:不是权限问题,而是 MySQL 明确禁止你读任意路径的文件。它只认 secure_file_priv 配置指定的目录。
必须执行:SHOW VARIABLES LIKE 'secure_file_priv'; 查出实际允许的路径,比如返回 /var/lib/mysql-files/,那你的 CSV 就得放进去,不能放在 /home/user/data.csv 或桌面。
- 如果返回值是空字符串(
''),说明该选项被禁用,LOAD DATA INFILE根本不可用,只能换方案 - 如果返回
NULL,说明服务启动时加了--secure-file-priv=NULL,同样无法使用该命令 - 别试图用
sudo chmod 777绕过——路径对不上,改权限没用
想用本地文件但服务端不许 LOAD DATA INFILE 怎么办
这时得切到 LOAD DATA LOCAL INFILE,但它默认在 MySQL 8.0+ 完全关闭,客户端和服务端双端都要开闸。
三步缺一不可:
- 服务端开启:执行
SET GLOBAL local_infile = ON;(需 SUPER 权限) - 客户端连接时加参数:
mysql --local-infile=1 -u root -p - SQL 中写全
LOCAL关键字:LOAD DATA LOCAL INFILE '/home/user/data.csv' INTO TABLE t1 ...
漏掉任意一个,都会静默失败或报 ERROR 1148(The used command is not allowed with this MySQL version)。
INSERT 多值插入为什么还是慢?关键参数和写法
很多人写了 INSERT INTO t VALUES (),(),()... 就以为够快了,结果百万行仍要几分钟——问题往往出在“批大小”和事务控制上。
- 单条语句别塞超过 5000 行:太大会触发
max_allowed_packet限制(查法:SHOW VARIABLES LIKE 'max_allowed_packet';) - 必须显式包裹事务:
BEGIN; INSERT ... ; INSERT ... ; COMMIT;,否则每批仍按 autocommit 执行,等于变相逐条提交 - 避免 ORM 的
save()或循环调用execute():它们天然不批量,哪怕传入 1000 条,底层也可能拆成 1000 次 round-trip - 字段类型要严格匹配:比如目标列是
DECIMAL(10,2),CSV 里却写"123.456",MySQL 会截断并发出 warning,但不中断,容易漏掉数据异常
字段映射、NULL 和时间格式这些细节怎么不出错
LOAD DATA INFILE 对格式零容忍,错一个字符就停在第一处失败点,且默认不报错只发 warning,非常隐蔽。
实操必须做这几件事:
- 导入前先清空 warning:
FLUSH WARNINGS;,再执行导入,完后立刻SHOW WARNINGS;查有没有1265 Data truncated类提示 - 日期别依赖自动转换:用
SET created_at = STR_TO_DATE(@date_str, '%Y-%m-%d %H:%i:%s')显式解析 - NULL 值必须写成
\N(两个字符:反斜杠 + N),不是NULL、空字符串或"" - 数值字段含逗号?用
SET price = REPLACE(@price_str, ',', '')清洗后再赋值
真正耗时的从来不是写 SQL,而是校验字段对齐、确认换行符是 \n 还是 \r\n、检查文件有没有 BOM 头——这些地方一错,整批导入就“看似成功,实则丢数据”。











