MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2044|回复: 0
打印 上一主题 下一主题

InnoDB页面类型统计工具-Perl版

[复制链接]
跳转到指定楼层
1#
发表于 2015-10-15 11:55:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
py_innodb_page_info.py可以用来统计innodb数据文件的每个页面类型和偏移等信息,但在使用该脚本时,偶尔会出现如下错误。

$> ./py_innodb_page_info.py /data1/mysqldata/4444/data/db_felix/tbAccount_99.ibd

Traceback (most recent call last):
  File "./py_innodb_page_info.py", line 3, in ?
    import mylib
  File "/home/mysql/mysql_tools/py_innodb_page_info/mylib.py", line 3, in ?
    import include
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 12-13: unexpected end of data


由于不懂python,没想去深入解决这个问题。鉴于之前看过InnoDB的物理页面结构,刚好可以用熟悉一点的perl来重写这个页面统计的逻辑,把这个报错的问题解决。

简单原理:
           InnoDB 16KB一个页面,页面格式如下:
38B文件头 + 56B页头 + 最大最小值 + 用户记录 + 空闲空间 + 页目录 + 文件结尾信息
只需顺序遍历数据文件,按照页面格式来读取页面,最后列举出每个页面的偏移、页面类型、所属的表空间ID即可;如果是数据页(B-Tree页),也把页面的层级展现出来。
其中,页面偏移、类型、所属表空间等信息,在文件头:


而B-Tree页的页面层级,在页头部分:


下面是所有的InnoDB页面类型:


用perl重写后的代码,执行情况如下:
$> perl innodb_page_info.pl --file=/data1/mysqldata/4444/data/db_felix1/t_202.ibd -v

page_offset[00000000], page_type[File Space Header], space_id[000000cc]
page_offset[00000001], page_type[Insert Buffer Bitmap], space_id[000000cc]
page_offset[00000002], page_type[File Segment inode], space_id[000000cc]
page_offset[00000003], page_type[B-tree Node], space_id[000000cc], page_level[0000]
page_offset[00000000], page_type[Freshly Allocated Page], space_id[00000000]
page_offset[00000000], page_type[Freshly Allocated Page], space_id[00000000]

----------------- innodb page info ----------------
File /data1/mysqldata/4444/data/db_felix1/t_202.ibd, Total Page is 6
Type File Space Header, Cnt: 1
Type Freshly Allocated Page, Cnt: 2
Type Insert Buffer Bitmap, Cnt: 1
Type File Segment inode, Cnt: 1
Type B-tree Node, Cnt: 1


这里需要注意,InnoDB存储采用大端存储,使用perl的unpack去读取时,如果需要转化为整数,需要使用unpack("n*", $_) 或 unpack("N*", $_) ,其中,n代表大端存储的unsigned short整型,N代表大端存储的unsigned long整型,具体可以perldoc –f pack看下。

最后,如果对实现代码有兴趣的tx,可以下载附件。
innodb_page_info.zip (1.86 KB, 下载次数: 1534)
转载自:http://tencentdba.com/blog/innodb_stat_tool/
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-25 21:57 , Processed in 0.071983 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表