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
这个答案大大加快了一切:
我只是
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 通过推特提供)
为了补充 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命令就不会合并文件之间的行。
导入工作正常,我没有测试它是否真的更快,因为对启用和禁用自动提交的改进,但如果这使事情变得更快,那么这个额外的步骤会使事情变得更容易。
| 归档时间: |
|
| 查看次数: |
61802 次 |
| 最近记录: |