Men*_*Of2 6 mysql parallel-processing import
我正在为大型网站迁移做一些准备工作。
该数据库的大小约为10GB,几个表包含超过1500万条记录。不幸的是,由于我的职权范围之外的客户关系,它仅以SQL格式出现在一个大的mysqldump文件中,但是您知道如何进行。我的目标是最大程度地减少停机时间,从而尽快导入数据。
我试图像这样使用标准的MySQL CLI接口:
$mysql database_name < superhuge_sql_file -u username -p
Run Code Online (Sandbox Code Playgroud)
但是,这非常慢。
为了加快处理速度,我使用awk将文件与相关数据一起拆分为每个表的块,并构建了一个小shell脚本来尝试并行导入表,如下所示:
#!/bin/sh
awk '/DROP TABLE/{f=0 ;n++; print >(file="out_" n); close("out_" n-1)} f{ print > file}; /DROP TABLE/{f=1}' superhuge.sql
for (( i = 1; i <= 95; i++ ))
do
mysql -u admin --password=thepassword database_name < /path/to/out_$i &
done
Run Code Online (Sandbox Code Playgroud)
值得一提的是,这是一个“使用一次并销毁”脚本(脚本中的密码等)。
现在,这可以正常工作,但在四核服务器上目前尚需3个多小时才能完成。这些表确实是并行导入的,但不是一次全部导入,在此过程中尝试通过CLI获取MySQL服务器信息非常缓慢。我不知道为什么,但是在此过程中尝试使用相同的mysql用户帐户访问表时挂起。max_user_connections是无限的。
我已在my.cnf中将最大连接数设置为500,但未在此服务器上配置MySQL。
我四处寻找,但是想知道是否有任何MySQL配置选项可以帮助加快此过程,或者我错过的任何其他方法都可以更快地完成。
如果可以考虑使用GNU parallel,请检查wardbekker gist上的以下示例:
# Split MYSQL dump file
zcat dump.sql.gz | awk '/DROP TABLE IF EXISTS/{n++}{print >"out" n ".sql" }'
# Parallel import using GNU Parallel http://www.gnu.org/software/parallel/
ls -rS *.sql | parallel --joblog joblog.txt mysql -uXXX -pYYY db_name "<"
Run Code Online (Sandbox Code Playgroud)
它将大文件拆分为单独的SQL文件,然后运行parallel以进行并行处理。
因此,要在GNU并行中运行10个线程,可以运行:
ls -rS data.*.sql | parallel -j10 --joblog joblog.txt mysql -uuser -ppass dbname "<"
Run Code Online (Sandbox Code Playgroud)
在OS X上,它可以是:
gunzip -c wiebetaaltwat_stable.sql.gz | awk '/DROP TABLE IF EXISTS/{n++}{filename = "out" n ".sql"; print > filename}'
Run Code Online (Sandbox Code Playgroud)
相关:在Unix.SE上使用xargs导入sql文件
转储中的sql是否插入多行?转储是否使用多行插入?(或者也许你可以对其进行预处理?)
这个人涵盖了很多基础知识,例如:
禁用 MySQL 索引,因此在导入之前运行:
ALTER TABLE `table_name` DISABLE KEYS;
Run Code Online (Sandbox Code Playgroud)
然后导入后将其改回:
ALTER TABLE `table_name` DISABLE KEYS;
Run Code Online (Sandbox Code Playgroud)当使用MyISAM表类型时,改为使用MySQL的INSERT DELAYED命令,这样就鼓励MySQL在数据库空闲时将数据写入磁盘。
对于 InnoDB 表,使用这些额外的命令来避免大量的磁盘访问:
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
Run Code Online (Sandbox Code Playgroud)
最后是这些:
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
COMMIT;
Run Code Online (Sandbox Code Playgroud)