我正在为大型网站迁移做一些准备工作。
该数据库的大小约为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配置选项可以帮助加快此过程,或者我错过的任何其他方法都可以更快地完成。