mysql dump import在我的开发人员的机器上非常慢


22

我有一个SQL转储,它很大(411 MB),并且在服务器A上花费了10分钟的导入时间,在我的工作站B上的同一次导入,估计(pipeviewer)需要8个小时的时间来导入(它在40分钟内导入了31 MB) ),这是慢53倍。

规格:

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

mysql / maria配置是标准配置。

我昨天切换到工作站上的MariaDB-但是在MariaDB之前,统计数据甚至更糟。

我已经删除了工作站上的所有数据库-没什么不同。

最大的问题是:性能如何会降低53倍?我不能这样工作:-(

我的导入命令:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

服务器A:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

工作站B:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

服务器A:

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

工作站B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

您能描述一下您想如何导入数据库吗?(具体的mysql语句是什么)“显示进程列表”是什么?说?您是否看过该过程在使用strace进行具体操作?如果您的计算机可能正在交换,还可以看看吗?

我编辑了问题。
亚历克斯(Alex)

InnoDB?innodb_buffer_pool_size每台机器上的价值是多少?
里克·詹姆斯

Answers:


47

这个答案大大加快了一切:

/programming//a/2167641/292408

我只是

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

一开始,

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

在末尾。

现在花了3分钟。

(由@andreasemer通过Twitter提供)


很棒的把戏。我需要知道的一点是,这样做有副作用吗?
Dharma Saputra

1
如果您的数据已损坏,则导入后可能无法满足外键约束。
Alex

伟大的工作。您从字面上节省了我几个小时。
Jafo

没有为我提高性能。没有它,它是23分钟,之后是23分钟(3GB .sql文件)。
约书亚·品特

5

补充上面的内容...我的转储文件已经由类似以下内容的文件自动生成:

mysqldump my_db > db-dump-file.sql

我想,所以我创造了我的电脑两个文件名为自动完成这一进口default-start-import.sqldefault-end-import.sql与它们的内容是默认启动import.sql

SET autocommit=0;

default-end-import.sql

COMMIT;
SET autocommit=1;

我运行的脚本是这样的;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

相同的命令,但更易于阅读:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

在这种情况下cat,用于在将这些文件发送到管道之前对其进行串联。我认为所有文件都以换行符结尾(如果从文本编辑器中查看,文件末尾为空行)很重要,这样cat命令就不会在文件之间合并行。

导入工作正常,由于启用和禁用自动提交功能的改进,我还没有测试它是否实际上更快,但是如果这样做会使速度更快,那么此额外的步骤将使事情变得更容易。


1

我也尽力了--compressSET autocommit=0;但是他们提供了一些帮助...

我发现将多个INSERT INTO ...语句转换为一个大型语句的VALUES(...), (...)速度大大提高了。

我正在mysql通过WAN 使用SSL。远程MySQL数据库托管在Amazon上。

有9列和2,100行:

  • 2,100条独立INSERT陈述:82秒
  • 2条合并INSERT报表:<1秒

具有7列和42,000行:

  • 42,000条独立INSERT陈述:1,740个
  • 42综合INSERT报表:105秒

因此,取决于生成数据库转储的工具(或更具体地说,INSERT语句的格式),可以影响速度。

注意:.sql在我的测试中,这也将转储文件减少了60%以上,因此它也将保存在I / O上。

警告:对于那些需要可移植性的用户,此技术mysql存在物理限制。SQLServer 似乎一次只能限制为1,000行

不过,一次执行1,000行,进行42,000行,仍然可以提高1,657%!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.