使用LOAD DATA INFILE导入数据时遇MySQL 'Table %s is full'错误求助
解决MySQL导入大文件时出现ERROR 1114 (HY000): The table 'lista' is full 的问题
你遇到的这个错误通常是磁盘空间不足、MySQL表空间配置限制,或是32位程序本身的内存/文件大小限制导致的。结合你的环境(32位WAMP+MySQL5.7.14+Win7 64位),我整理了几个针对性的解决方案:
1. 先检查磁盘剩余空间
3000万行的CSV导入后会占用大量磁盘空间,首先确认MySQL数据目录(默认路径是wamp\bin\mysql\mysql5.7.14\data)所在的磁盘有没有足够剩余空间。如果磁盘快满了,清理出足够空间后再尝试导入。
2. 调整InnoDB表空间配置(默认引擎)
MySQL 5.7默认使用InnoDB引擎,而32位程序对单个文件的大小有限制(通常在2GB左右),如果你的ibdata1文件已经接近这个上限,就会触发"表已满"的错误。
打开my.ini(WAMP托盘右键→MySQL→my.ini),修改以下配置:
- 调整
innodb_data_file_path,将单数据文件改为多文件自动扩展:
这样当第一个文件(ibdata1)达到1GB后,会自动创建ibdata2并继续扩展,突破单文件大小限制。innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend - 确保
innodb_file_per_table = ON(默认应该已开启),这个配置让每个InnoDB表拥有独立的.ibd数据文件,避免所有表数据都挤在ibdata1里导致快速膨胀。
修改后重启MySQL服务(WAMP托盘→MySQL→Restart Service)。
3. 适配32位MySQL的内存限制
32位程序在Windows下的虚拟内存上限通常是2GB,你用的中型配置(1-2G内存)可能超出了32位MySQL的实际承载能力,导致内存分配异常,间接影响表空间扩展。
可以适当降低内存相关参数:
- 调整
innodb_buffer_pool_size,比如从1GB降到512MB:
这个参数是InnoDB最核心的内存缓冲池,32位环境下设置过大可能导致其他内存分配失败。innodb_buffer_pool_size = 512M
4. 如果是MyISAM表的额外配置
如果你的lista表是MyISAM引擎,需要检查临时排序文件的限制:
- 增大
myisam_max_sort_file_size,允许更大的临时排序文件:
导入大文件时MyISAM会创建临时排序文件,这个参数限制了文件的最大大小,超过就会报错。myisam_max_sort_file_size = 10G
5. 分批导入数据(兜底方案)
如果以上配置调整后还是无法解决,可以把3000万行的CSV拆分成多个小文件(比如每个100万行),分批执行LOAD DATA命令:
LOAD DATA LOCAL INFILE 'import_part1.csv' INTO TABLE lista FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; LOAD DATA LOCAL INFILE 'import_part2.csv' INTO TABLE lista FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; -- 依次导入所有分片文件
分批导入可以避免一次性占用过多资源,降低触发限制的概率。
最后,调整配置后建议先导入一小部分数据测试,确认配置生效后再导入完整数据。
内容的提问来源于stack exchange,提问作者Bit Locker
相关产品推荐
相关产品推荐

