10GB SQL数据文件快速导入MySQL数据库的方法
导入10GB大小的SQL文件到MySQL是一个挑战,但通过以下方法可以显著提高导入速度:
1. 使用命令行直接导入(基础方法)
mysql -u用户名 -p密码 数据库名 < 文件名.sql
优点:简单直接缺点:默认速度较慢,可能需要优化
2. 优化MySQL配置(关键步骤)
在导入前临时修改MySQL配置(my.cnf或my.ini):
[mysqld] # 禁用日志刷新(导入完成后需改回1) innodb_flush_log_at_trx_commit = 2 # 增加批量插入缓冲区 bulk_insert_buffer_size = 256M # 增大允许的包大小 max_allowed_packet = 512M # 禁用唯一性检查 unique_checks = 0 # 禁用外键检查 foreign_key_checks = 0 # 增大InnoDB缓冲池 innodb_buffer_pool_size = 4G # 禁用自动提交 autocommit = 0
导入完成后,记得恢复这些设置!
3. 使用SQL命令临时优化
在导入前执行:
SET unique_checks=0; SET foreign_key_checks=0; SET autocommit=0;
导入完成后执行:
SET unique_checks=1; SET foreign_key_checks=1; COMMIT;
4. 分割大文件导入
将10GB文件分割成更小的部分(如500MB):
# Linux/Mac split -b 500m largefile.sql split_file_ # Windows(使用PowerShell) Get-Content largefile.sql -ReadCount 100000 | % {$i=1} {$_ | Set-Content "split_file_$i.sql"; $i++}
然后逐个导入这些小文件
5. 使用LOAD DATA INFILE(最快方法)
如果SQL文件主要是INSERT语句,转换为CSV格式并使用:
LOAD DATA INFILE '/path/to/data.csv' INTO TABLE 表名 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (列1, 列2, 列3);
速度提升:比INSERT语句快20倍以上
6. 禁用索引再重建
-- 导入前禁用索引 ALTER TABLE 表名 DISABLE KEYS; -- 导入完成后重建索引 ALTER TABLE 表名 ENABLE KEYS;
7. 使用并行导入工具
mydumper/myloader(Percona提供):
myloader -u 用户名 -p 密码 -d 导出目录 -t 8
-t 8表示使用8个线程并行导入
MySQL Shell并行导入(MySQL 8.0+):
util.importTable('file.sql', {threads: 8, dialect: 'csv'})
8. 优化导入脚本
确保SQL文件格式优化:
将多个INSERT语句合并为INSERT INTO table VALUES (...),(...),(...)
删除不必要的SET语句和注释
确保CREATE TABLE语句在INSERT之前
9. 使用专用服务器导入
在导入期间暂停其他数据库操作
确保有足够的内存和磁盘I/O性能
使用SSD硬盘可显著提升速度
10. 监控与调优
使用以下命令监控导入进度:
# 查看MySQL进程 SHOW PROCESSLIST; # 查看导入进度(Linux) pv -petr largefile.sql | mysql -u用户 -p密码 数据库
实际导入流程建议
备份现有数据库
临时优化MySQL配置
如可能,将SQL文件转换为CSV格式
使用LOAD DATA INFILE或并行导入工具
导入完成后恢复MySQL配置
验证数据完整性
预期速度提升:通过上述优化,10GB文件的导入时间可以从数小时缩短到30-60分钟,具体取决于服务器配置。
重要提示:在生产环境操作前,请先在测试环境验证流程!
网友回复