MySQL 5.7のsys.innodb_lock_waitsを可視化する

要約

  • MySQLには 現在トランザクションが待機しているロックの要約を見るためのsys.innodb_lock_waitsビューが定義されている。(https://dev.mysql.com/doc/refman/5.7/en/sys-innodb-lock-waits.html)
  • アプリケーションでlock timeoutの前兆を検出し、sys.innodb_lock_waitsに対するselectを発行することで、lock timeoutの原因になっているクエリを特定することができる。
  • sys.innodb_lock_waitsの結果は、人間が見た時に非常にわかりづらく、複雑な依存関係が発生している場合には解読が困難。
  • sys.innodb_lock_waitsの結果を、dot言語に変換し、graphvizレンダリングすれば分かりやすい結果を得ることができる。

コード

  • 入力をparseする箇所は適宜適切な形に読み換える必要がある。(このコードでは、{key=value, key=value, ..., key=value}, ... {key=value, key=value, ..., key=value}のような形式でsys.innodb_lock_waitsのレコードを読み取ることを想定している)

gist.github.com

結果例

  • 実際に取得できた結果の例を示す

gist.github.com

f:id:dasshshsd:20201027001340p:plain
graphvizレンダリングした結果