崩壊し始めたアプリケーション/ MySQLサーバーの組み合わせがあります。現在、1億2500万行のMySQL MyISAMテーブルのコピーでスタックしています(INSERT INTO a_copy SELECT * FROM a
with KEYS DISABLED
オン a_copy
)。複製された本番VMの本番データについて、このクエリが1時間弱の一部であるジョブのベンチマークを行いました。ただし、このジョブを本番環境で実行すると、コピークエリが終了せずに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/s r/s w/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/s r/s w/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/s r/s w/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/s r/s w/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/s r/s w/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
これをどのように解釈すればよいですか?
私が見つけ、本番環境で解決した最良の解決策は、 http://www.mysqldiary.com/if-you-copy-a-myisam-table-with-primary-key-don%E2)で見つかりました。 %80%99t-forget-to-order-the-rows-first / 。
SHOW INDEX IN a WHERE Key_name='PRIMARY'
を使用して、テーブルの主キーを識別し、クエリにORDER BY
を追加します。最終的な解決策はINSERT INTO a_copy SELECT * FROM a ORDER BY aID, aOtherColumn
のようになります。ここで、aの主キーは(aID, aOtherColumn
)です。
私はそれに完全に満足しているわけではありませんが、それはかなりうまく機能し、何よりも、元のバージョンよりもはるかに優れています。
編集:エラーは正しく識別されますが、この解決策は役に立ちません。 MySQLがADD PRIMARY KEY
sの場合、テーブルをINSERT INTO a_copy SELECT * FROM a
に類似してコピーします。これにより、同じ問題が再び発生します。このスレッドで私の他の応答を確認してください。
そこで、/var/lib/mysql/<mydb>/a*
のファイルサイズを調べて、インデックスファイル(.MYI
)のファイルサイズが大幅に増加していることを確認しました。
DISABLE KEYS
は、一般に非一意キーのみを無効にし、特に主キーをアクティブのままにします。基本的に、125M行のINSERT INTO
は、ディスクへのランダム書き込みとして現れるジョイントPRIMARY KEYへの125Mインデックス挿入をケースに入れました。これは、ディスクで実行できる最もコストのかかる作業です。
したがって、私の解決策は、コピー中にDROP PRIMARY KEY
テーブルでa_copy
を実行し、コピーが完了したらADD PRIMARY KEY
を実行することです。