+
30
-

回答

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分钟,具体取决于服务器配置。

重要提示:在生产环境操作前,请先在测试环境验证流程!

网友回复

我知道答案,我要回答