优化MySQL以并行导入海量数据文件。每表1个连接

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配置选项可以帮助加快此过程,或者我错过的任何其他方法都可以更快地完成。

ken*_*orb 5

如果可以考虑使用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)

资料来源:wardbekker / gist:964146


相关:在Unix.SE上使用xargs导入sql文件


Ala*_*ins 0

转储中的sql是否插入多行?转储是否使用多行插入?(或者也许你可以对其进行预处理?)

这个人涵盖了很多基础知识,例如: