为什么导入12 GB .SQL文件需要超过36个小时?
题
我现在一直在等待36小时,以用简单的简单导入12 GB .SQL文件 type site.sql | mysql
命令。我可以看到 ibdata1
正在增长,目前将近40 GB。
考虑到触发器和存储过程在.sql的末尾,我只认为MySQL应该添加数据和密钥索引。
使用来自另一台服务器的此命令生成site.sql:
mysqldump -R -e --databases site --add-drop-database --add-create-database --add-drop-table -C --single-transaction --triggers
什么要花这么长时间?
解决方案
尝试这个:
$ ps -ef|grep [m]ysql
然后确定过程ID
$ strace -cp <pid>
离开10秒或一分钟 ^C
. 。这会告诉您该过程在哪里花费时间,例如,如果您看到的话,它可能只是在等待磁盘 read
和 write
支配。
其他提示
您是否有任何InnoDB表和主键
- 包含多个列?
- 有一个宽阔的瓦尔查尔奇?
- 还有很多非唯一索引?
- 一个或多个具有宽钥匙的非唯一索引?
这些条件中的任何一个可能会导致您的索引中的大BTREE节点在每个BTREE节点中都有很少的叶子。主键中的群集键也附加到非聚集密钥中的每个非唯一键条目。
另一个考虑因素:InnoDB数据页面的总和是否明显少于InnoDB索引页面?
您可以通过此查询(在MB中)找到该问题:
SELECT SUM(data_length)/POWER(1024,2) InnoDBData,
SUM(index_length)/POWER(1024,2) InnoDBIndexes
FROM information_schema.tables WHERE engine='InnoDB';
其他考虑因素:您是否正在加载DB服务器中启用了二进制记录?如果是,请在您正在加载的服务器上执行此操作:
mysql -h... -u... -p... -A -e"SET sql_log_bin=0; source site.sql"
我希望这有帮助 !!!
您确定您正在阅读的表是否没有触发器,索引和约束?您正在运行什么硬件和操作系统?您的存储如何配置?
我更熟悉Oracle,但是在没有触发器,索引和约束的情况下,12G导入了200GB/h。一个单个扳机可以将过程变成蜗牛,具体取决于触发器的作用...
我希望这有帮助
不隶属于 dba.stackexchange