本番で使うのは想定されていないようだがレプリカラグがひどくて〜とかの場合に一部ケースで使えるかもしれない?クラッシュリカバリできなくなるというが少しでも早く本番投入したいレプリカサーバとかで使うとIOが減ってサービスインまでの時間が短くなるみたいなケースでは使えるのではないだろうか。
【MySQL】参照系のクエリだけで大量にdisk writeを発生させるには
というのを考えてみる。
大量にクエリを実行する
これが一番てっとり速い気がするクエリログを出力させておけばいい感じにディスクに書いてくれるのでwriteが発生するだろう。エラーログをわざと発生させまくるのでもwriteは発生しそう(エラーログの場合はbufferingされないで書き出される気がするのでこっちの方が大量書き込みには向いている???)
create tmp tableが発生するクエリを実行する
CREATE TEMPORARY TABLE
を実行するのは参照系ではないので今回は外れるがサーバーはクエリーの処理中に内部一時テーブルを作成するケースがある。条件は色々あるが参照系クエリという縛りがあるのでUNIONとかサブクエリを大量に実行すればdisk writeが発生する。
一時ファイルを使うクエリを実行する
ORDER BY や GROUP BYのソートで使用される。sort_buffer_sizeを超えてソートしようとするとこれはファイルに書き出された上で処理を行っていくのでdisk writeが発生してく。join_bufferとかも小さくしておくことで一時ファイルが使われそうである。
【Mackerel】仮想メモリのチェックプラグインを書いた
【MySQL】トランザクションの過去のクエリを見たい
現在実行中のトランザクションからtrx_mysql_thread_idをメモする
SELECT trx_id,trx_query,trx_mysql_thread_id FROM information_schema.innodb_trx ORDER BY trx_started;
PROCESSLIST_IDに先ほどのtrx_mysql_thread_idを指定する
SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID =;
THREAD_IDを使ってperformance_schema.events_statements_historyを見ればよい
SELECT * FROM performance_schema.events_statements_history WHERE thread_id = ? ORDER BY TIMER_START