如何解释一个摇摇欲坠的MySQL服务器的iostat

我们有一个组合的应用程序/ MySQL服务器已经开始崩溃。 现在,它被困在复制一个1.25亿行MySQL MyISAM表( INSERT INTO a_copy SELECT * FROM a with INSERT INTO a_copy SELECT * FROM a a_copy KEYS DISABLED on a_copy )。 我们已经将这个查询所涉及的工作作为一个小时,对克隆的生产虚拟机中的生产数据进行了基准testing。 但是,在生产中运行此作业时,复制查询已经运行了12个多小时,没有完成,随机地使每个MySQL查询比蜜糖慢(60秒以上,没有任何锁)。

iostat输出

 yyyy@xxxx:~$ iostat -mxdc 10 Linux 2.6.32-5-686 (xxxx) 12/24/14 _i686_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 5.24 0.00 1.34 13.43 0.00 80.00 Device: rrqm/s wrqm/sr/sw/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 1.84 232.18 68.24 468.50 1.88 2.74 17.62 47.19 87.87 0.69 36.79 avg-cpu: %user %nice %system %iowait %steal %idle 0.77 0.00 2.26 27.92 0.00 69.05 Device: rrqm/s wrqm/sr/sw/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 6.70 6.10 317.30 208.20 1.37 0.83 8.56 140.26 173.99 1.90 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.81 0.00 2.58 31.64 0.00 64.97 Device: rrqm/s wrqm/sr/sw/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 5.00 11.50 372.80 242.80 1.56 1.00 8.54 146.50 321.34 1.62 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.17 0.00 1.65 39.42 0.00 58.76 Device: rrqm/s wrqm/sr/sw/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 3.00 23.40 226.80 618.00 0.94 2.50 8.34 145.54 171.94 1.18 100.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.22 0.00 1.77 32.23 0.00 65.78 Device: rrqm/s wrqm/sr/sw/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util sda 5.70 22.50 282.10 491.80 1.18 2.02 8.45 145.72 182.10 1.29 100.00 

我应该如何解释?

编辑:虽然错误被正确识别, 这个解决scheme没有帮助 。 当MySQL ADD PRIMARY KEY ,它再次将类似于INSERT INTO a_copy SELECT * FROM a的表拷贝到INSERT INTO a_copy SELECT * FROM a ,这又留在了相同的问题上。 检查我的这个线程中的其他响应。

所以,我已经通过观察/var/lib/mysql/<mydb>/a*中的文件大小来了解索引文件( .MYI )的文件大小。

DISABLE KEYS通常只禁用非唯一键,特别是使主键保持活动状态。 基本上,125M行INSERT INTO引入125M索引插入在一个联合PRIMARY KEY上,performance为对磁盘的随机写入,这反过来又是对磁盘可以做的最昂贵的事情。

所以,我的解决scheme是在复制期间在a_copy表上DROP PRIMARY KEY ,然后在完成后ADD PRIMARY KEY

我发现并find了最好的解决scheme,并在生产中find了解决办法, url是http://www.mysqldiary.com/if-you-copy-a-myisam-table-with-primary-key-don%E2%80%99t -for-the-rows-first / 。

SHOW INDEX IN a WHERE Key_name='PRIMARY'使用SHOW INDEX IN a WHERE Key_name='PRIMARY' ,我确定了表的主键,并将ORDER BY附加到查询中。 最终的解决scheme看起来像INSERT INTO a_copy SELECT * FROM a ORDER BY aID, aOtherColumn ,其中a的主键是( aID, aOtherColumn )。

虽然我对它不是很满意,但它的工作原理相当好,最重要的是比原来的版本更好。