質問: こんにちは 今大量のsqlファイル(1ファイル300MBほどのもの)をmysqlにリストアしているのですが、show processlistをすると、たまあにinsert文が表示されて、その後Waiting for table flushがずっと表示されているのですが、これは中で何をやっているのでしょうか。 tableに書き込み中とかなのでしょうか。
回答: おっしゃる通り、データベースへの書き込み待ちだと思われます。 sql 文の書き方にもよりますが、大きな sql ファイルを実行しようとした場合、その変更内容のすべてを一旦 mysql はメモリ上に保持する、というような動作を行う気がします。 flush を行う、というのは、そこまでメモリ上に保持していたデータをすべてディスクに書き出す、という操作です。これは、たとえばスワップを利用しているシステム上で、かつこの操作がスワップに乗っかってしまっていた場合、かなり遅くなることが懸念されます。というのも、メモリの内容をすべてディスクに書き出す、という作業は、一旦スワップから読み出して、それをディスクに書き直す、という作業になり、大きなファイルのコピー作業それ自体にかかる時間、が随時必要になると考えられるからです。 参考までに flush とは、データベースが、そのメモリ上の内容を、電源が落ちても復旧できるようにするために、ディスクへ永続化する作業のことを指します。 今回のように、データベースのパフォーマンスに関わる部分で不便な思いをする場合、まずその原因を特定する必要があります。 Linux をお使いである場合は、 ``` vmstat 1 ``` を実行すると、システムのパフォーマンスにまつわるメトリクスが、1秒ごとに画面に表示されるようになります。 コメントにおいて、メモリを増やしたら解決した、とのことですが、だとするとおそらく、 `vmstat 1` を実行してみていた場合、それは si/so (スワップイン・スワップアウト kb 数) の上昇、という形で認識できてたかな、と思います。