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

Ale*_*lex 31 mysql performance

我有一个 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
Run Code Online (Sandbox Code Playgroud)

mysql/maria 配置是库存配置。

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

我已经删除了工作站上的所有数据库 - 没有区别。

最大的问题是:性能怎么会慢 53 倍?我不能这样工作:-(

我的导入命令:

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

工作站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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

工作站B:

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s
Run Code Online (Sandbox Code Playgroud)

Ale*_*lex 56

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

/sf/answers/151734901/

我只是

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
Run Code Online (Sandbox Code Playgroud)

一开始,和

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;
Run Code Online (Sandbox Code Playgroud)

在末尾。

现在花了 3 分钟。

(由@andreasemer 通过推特提供)


Pad*_*igD 6

为了补充 Alex 上面的答案,您还可以保存并恢复默认变量,而不是盲目地将它们设置为 1。在大多数情况下,将它们设置回 1 是您想要的,但为了以防万一,这里有一种方法可以将它们设置回导入之前的状态:

预导入:

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;
Run Code Online (Sandbox Code Playgroud)

后导入

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;
Run Code Online (Sandbox Code Playgroud)


小智 5

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

mysqldump my_db > db-dump-file.sql
Run Code Online (Sandbox Code Playgroud)

我想自动执行此导入,因此我在我的计算机中创建了两个名为default-start-import.sqland 的文件default-end-import.sql,它们的内容是default-start-import.sql

SET autocommit=0;
Run Code Online (Sandbox Code Playgroud)

default-end-import.sql

COMMIT;
SET autocommit=1;
Run Code Online (Sandbox Code Playgroud)

我运行的脚本是这样的;

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db
Run Code Online (Sandbox Code Playgroud)

相同的命令但更容易阅读:

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db
Run Code Online (Sandbox Code Playgroud)

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

导入工作正常,我没有测试它是否真的更快,因为对启用和禁用自动提交的改进,但如果这使事情变得更快,那么这个额外的步骤会使事情变得更容易。