

こんにちは  
今大量のsqlファイル(1ファイル300MBほどのもの)をmysqlにリストアしているのですが、show
processlistをすると、たまあにinsert文が表示されて、その後Waiting for table
flushがずっと表示されているのですが、これは中で何をやっているのでしょうか。  
tableに書き込み中とかなのでしょうか。


CC BY-SA 3.0
2018-04-06T05:58:46.727
42995
2019-12-14T21:01:50.273
10222
question
mysql
mysqlに大量のdumpファイルをリストアしているが、Waiting for table flushがずっと出ている


おっしゃる通り、データベースへの書き込み待ちだと思われます。 sql 文の書き方にもよりますが、大きな sql
ファイルを実行しようとした場合、その変更内容のすべてを一旦 mysql はメモリ上に保持する、というような動作を行う気がします。 flush
を行う、というのは、そこまでメモリ上に保持していたデータをすべてディスクに書き出す、という操作です。これは、たとえばスワップを利用しているシステム上で、かつこの操作がスワップに乗っかってしまっていた場合、かなり遅くなることが懸念されます。というのも、メモリの内容をすべてディスクに書き出す、という作業は、一旦スワップから読み出して、それをディスクに書き直す、という作業になり、大きなファイルのコピー作業それ自体にかかる時間、が随時必要になると考えられるからです。

参考までに flush とは、データベースが、そのメモリ上の内容を、電源が落ちても復旧できるようにするために、ディスクへ永続化する作業のことを指します。

今回のように、データベースのパフォーマンスに関わる部分で不便な思いをする場合、まずその原因を特定する必要があります。 Linux をお使いである場合は、

[code]

    vmstat 1
    
[/code]

を実行すると、システムのパフォーマンスにまつわるメトリクスが、１秒ごとに画面に表示されるようになります。

コメントにおいて、メモリを増やしたら解決した、とのことですが、だとするとおそらく、 `vmstat 1` を実行してみていた場合、それは si/so
(スワップイン・スワップアウト kb 数) の上昇、という形で認識できてたかな、と思います。


CC BY-SA 4.0
2019-06-22T03:04:38.573
56000
2019-06-22T03:17:02.467
2019-06-22T03:17:02.467
754
754
42995
answer