能,但需服务端和客户端均启用local_infile、文件路径合规、编码无BOM、字段格式精准;ERROR 1148因任一端未开启local_infile,ERROR 1290因secure_file_priv路径限制。

能,但前提是服务端和客户端都开了 local_infile,文件路径合规、编码无BOM、字段格式严丝合缝——漏掉任一环节,LOAD DATA LOCAL INFILE 会直接报错或静默失败。
为什么 LOAD DATA LOCAL INFILE 总是报 ERROR 1148 或 ERROR 1290
这两个错误不是权限问题,而是配置断点。ERROR 1148(command not allowed)说明客户端或服务端任一端没开 local_infile;ERROR 1290(--secure-file-priv)则代表你试图从非法路径读文件。
- 服务端必须在
my.cnf的[mysqld]和[client]段都加local_infile = ON,然后重启 MySQL(仅SET GLOBAL local_infile = 1不够,部分版本不持久) - 客户端连接必须显式启用:用命令行就加
--local-infile=1,Python 用pymysql.connect(local_infile=True),否则即使服务端开了也无效 -
secure_file_priv若为具体路径(如/var/lib/mysql-files/),文件必须放进去;设为空字符串secure_file_priv = ""可绕过限制,但需重启生效
FIELDS TERMINATED BY 和 LINES TERMINATED BY 怎么写才不翻车
别凭感觉写 ',' 和 '\n'。Windows 下 Excel 导出的 CSV 实际是 ',' + '\r\n',Linux 下可能是 '\t' 或 ';'。错一个字符,整批导入就会字段偏移。
- 先用
head -n 1 data.csv | od -c(Linux/macOS)或certutil -encodehex -f data.csv 4(Windows)看真实分隔符 - 含换行符的字段(如用户评论)必须配
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, '')
InnoDB 表导入前必须关哪几项检查
ALTER TABLE t DISABLE KEYS 对 InnoDB 完全无效,别再用了。真正起效的是三件事:关外键、关唯一性校验、删非主键索引——顺序不能乱,否则速度提不起来。
- 执行
SET FOREIGN_KEY_CHECKS = 0和SET UNIQUE_CHECKS = 0(注意是SET,不是ALTER) - 用
DROP INDEX idx_name ON t删掉所有非主键索引;提前用SHOW CREATE TABLE t备份建表语句,把索引 DDL 单独存好 - 导入完成后,先
SET UNIQUE_CHECKS = 1(触发全表唯一性校验),再重建索引;SET FOREIGN_KEY_CHECKS = 1可稍后执行 - 如果源数据本身含重复唯一键,
SET UNIQUE_CHECKS = 1会卡住并报错,必须提前清洗
百万级导入卡在 30% 就不动了?调这几个参数
默认缓冲区太小,大文件会反复刷盘、内存溢出或超时。不用改全局配置,临时 SET 就行,导入完自动恢复。
-
SET sort_buffer_size = 256M(按物理内存 25% 设,别超) -
SET read_buffer_size = 8M、bulk_insert_buffer_size = 64M -
SET autocommit = 0,语句末尾加COMMIT;避免每行都刷 redo log - 单个 CSV 文件别超 50MB,用
split -l 100000 data.csv chunk_拆分,防超时
最易被忽略的一点:UNIQUE_CHECKS = 0 期间不校验唯一性,但导入后设回 = 1 会触发全表扫描——若数据量真到千万级,这一步可能耗时数分钟,且无法中断。务必在导入前确认源数据干净,别等最后卡住才返工。


















