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
MySQL Bugs: #90733: TheMySQL server has hanged up when query on the sys.innodb_buffer_stats_by_table
このバグレポートを見て「うん、知ってた」感があって(
sys.innodb_buffer_statsu_by_table
は information_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 件のコメント :
コメントを投稿