ERROR 1148报错主因是服务端local_infile=OFF且客户端未启用--local-infile=1,需两端同时开启;云数据库默认禁用且不可改,应改用mysqlimport或分批INSERT。

LOAD DATA INFILE 能快 5–20 倍,但不配对参数、不处理文件格式、不绕过约束检查,它连第一行都进不去。
为什么执行就报 ERROR 1148 或 “command not allowed”?
这不是你 SQL 写错了,是 MySQL 明确拒绝执行该命令。核心卡点就两个:
- 服务端
local_infile必须为ON:在my.cnf的[mysqld]和[client]段都加local_infile = 1,或启动时带--local-infile=1 - 客户端连接必须显式启用:用命令行要加
--local-infile=1参数;Python 用pymysql.connect(local_infile=True)或mysql.connector.connect(local_infile=True) - 云数据库(如阿里云 RDS、AWS RDS)默认禁用且不可改,此时别试
LOAD DATA LOCAL INFILE,直接换mysqlimport或分批INSERT
secure_file_priv 限制路径,怎么绕过又不炸库?
MySQL 只允许从 secure_file_priv 指定目录读文件,硬改为空字符串 secure_file_priv = "" 虽能解燃眉之急,但会打开安全缺口。更稳妥的做法是:
- 先查当前值:
SHOW VARIABLES LIKE 'secure_file_priv'; - 把 CSV 文件拷到返回的路径下(如
/var/lib/mysql-files/或 Windows 下C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\) - 用
LOAD DATA INFILE '/var/lib/mysql-files/data.csv'(注意:不是LOCAL,路径是服务器上的绝对路径) - 如果必须用本地文件且不能改配置,就放弃
INFILE,改用LOAD DATA LOCAL INFILE并确保客户端和服务端都开了开关
字段错位、时间导入失败、空字符串报错怎么办?
百万行里只要一行格式崩了,整个导入就中断,错误提示只说“line 123456”,根本看不出哪错了。关键预处理和映射逻辑得写死:
- 先用
head -n 1 data.csv | od -c看真实分隔符——Excel 导出常用;,不是逗号;Windows 行尾是\r\n,不是\n - 含换行或逗号的字段必须加引号,并配
OPTIONALLY ENCLOSED BY '"' - 时间字段如
"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, '') - 列顺序不匹配表结构?显式列出目标列:
LOAD DATA ... INTO TABLE t (a, @dummy, b, c),其中@dummy跳过第 2 列
导入慢、卡死、半途崩溃,优化点在哪?
速度瓶颈从来不在网络或磁盘,而在 MySQL 自身的校验与刷盘策略。真正起效的不是调大缓冲区,而是关掉“检查”:
- 导入前执行:
SET unique_checks=0; SET foreign_key_checks=0;(InnoDB 有效);导入完立刻恢复:SET unique_checks=1; SET foreign_key_checks=1; - 删掉所有非主键索引,导入完再重建——比边插边维护索引快 3 倍以上
- 拆大文件:
split -l 100000 data.csv chunk_,每块控制在 50MB 内,避免单次超时 - 别碰
innodb_buffer_pool_size这种全局参数去“优化”,临时调高bulk_insert_buffer_size到64M更直接
最后提醒一句:它不支持断点续传,也没有事务级回滚。一旦失败,要么清空表重来,要么提前用小样本 + IGNORE + SHOW WARNINGS 验证字段映射是否真对得上。


















