2018年5月18日金曜日

なるべく負荷をかけずにInnoDBバッファプールに載っているページの情報を見る

TL;DR

  • information_schema.innodb_buffer_page は重い
  • ib_buffer_pool にはテーブルスペースIDが記録されるので、それを使ってほげほげする
  • こんな感じ?
mysql> SET GLOBAL innodb_buffer_pool_dump_now = 1;
mysql> SELECT space, name FROM information_schema.innodb_sys_tablespaces INTO OUTFILE '/tmp/space.txt';

$ awk -F, '{print $1}' /var/lib/mysql/ib_buffer_pool | sort | join - <(sort /tmp/space.txt) | uniq -c | sort -n -r -k 1 | head
  54570 50 hogehoge/fugafuga
  12192 27 hogehoge/message
  10494 31 hogehoge/piyopiyo
   9683 42 hogehoge/magomago
   6103 30 hogehoge/message_inbox

このバグレポートを見て「うん、知ってた」感があって( sys.innodb_buffer_statsu_by_tableinformation_schema.innodb_buffer_page をベーステーブルにした ビュー なので)なんかのたびに「このテーブル刺さるよ」みたいな話もしていた気がするけれど、そういえば最近編み出したワークアラウンドって書いてないなと思ったので書いておく。
で、やることは ib_buffer_pool ファイル(InnoDBの暖気に使うアレ)からテーブルスペースIDを引っ張ってきて、 information_schema.innodb_sys_tablespaces (テーブルスペースIDとテーブル名の紐づけができる)と突き合わせるだけ。
mysql> SET GLOBAL innodb_buffer_pool_dump_now = 1;
mysql> SELECT space, name FROM information_schema.innodb_sys_tablespaces INTO OUTFILE '/tmp/space.txt';

$ awk -F, '{print $1}' /var/lib/mysql/ib_buffer_pool | sort | join - <(sort /tmp/space.txt) | uniq -c | sort -n -r -k 1 | head
  54570 50 hogehoge/fugafuga
  12192 27 hogehoge/message
  10494 31 hogehoge/piyopiyo
   9683 42 hogehoge/magomago
   6103 30 hogehoge/message_inbox
innodb_file_per_table = 0 だとたぶん上手くいかない(共有テーブルスペースに載ったテーブルはスペースID 0で出てくるので join しようがない)
これならほとんど負荷なくInnoDBバッファプールの中身をチラ見することができる。ただし、ページNoとインデックス名を紐づけられるような情報は information_schema にはないので、あくまでテーブル単位。

0 件のコメント :

コメントを投稿