[转帖]py_innodb_page_info.py工具使用
目录
一、Linux安装Python3
1. 解压包
tar -zxvf Python-3.10.5.tgz
2. 安装环境
yum install gcc
yum install libffi-devel -y
3. 生成编译脚本
进入解压目录下,使用下述命令来配置编译目录。注意--prefix路径是当前解压目录。
./configure --prefix=/home/python3/Python-3.10.5

编译并安装,若下图所示:
make & make install

4. 检查python3.10的编译器
进入bin目录下执行以下命令:
./python3.10

5. 建立Python3和pip3的软链
建立Python3和pip3的软链,若以下命令:
ln -s /home/python3/Python-3.10.5/bin/python3 /usr/bin/python3
ln -s /home/python3/Python-3.10.5/bin/pip3 /usr/bin/pip3

6. 添加到PATH
- 进入:vim /etc/profile
- python的bin加入到PATH中:export PATH=$PATH:$JAVA_HOME/bin:/home/python3/Python-3.10.5/bin
- 重启profile:source ~/.bash_profile

7. 验证Python3和pip3是否正常
python3 -V
pip3 -V

二、py_innodb_page_info.py工具
此工具是《MySQL技术内幕 InnoDB存储引擎》作者姜承尧写的用来分析表空间中的各页的类型和信息,用python编写。
此工具由三个文件组成:py_innodb_page_info.py、mylib.py、include.py。注意:需要放在同一个目录下。
1. py_innodb_page_info.py
- 
#! /usr/bin/env python
- 
#encoding=utf-8
- 
import mylib
- 
from sys import argv
- 
from mylib import myargv
- 
 
- 
if __name__ == '__main__':
- 
    myargv = myargv(argv)
- 
    if myargv.parse_cmdline() == 0:
- 
        pass
- 
    else:
- 
        mylib.get_innodb_page_type(myargv)
2. mylib.py
#encoding=utf-8
import os
import include
from include import *
TABLESPACE_NAME='/home/MySQL5.7/mysql-5.7.35/data/test_mysql/page_structure.ibd'
VARIABLE_FIELD_COUNT = 1
NULL_FIELD_COUNT = 0
class myargv(object):
def __init__(self, argv):
self.argv = argv
self.parms = {}
self.tablespace = ''
def parse_cmdline(self):
argv = self.argv
if len(argv) == 1:
print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file'
print 'For more options, use python py_innodb_page_info.py -h'
return 0
while argv:
if argv[0][0] == '-':
if argv[0][1] == 'h':
self.parms[argv[0]] = ''
argv = argv[1:]
break
if argv[0][1] == 'v':
self.parms[argv[0]] = ''
argv = argv[1:]
else:
self.parms[argv[0]] = argv[1]
argv = argv[2:]
else:
self.tablespace = argv[0]
argv = argv[1:]
if self.parms.has_key('-h'):
print 'Get InnoDB Page Info'
print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file\n'
print 'The following options may be given as the first argument:'
print '-h help '
print '-o output put the result to file'
print '-t number thread to anayle the tablespace file'
print '-v verbose mode'
return 0
return 1
def mach_read_from_n(page,start_offset,length):
ret = page[start_offset:start_offset+length]
return ret.encode('hex')
def get_innodb_page_type(myargv):
f=file(myargv.tablespace,'rb')
fsize = os.path.getsize(f.name)/INNODB_PAGE_SIZE
ret = {}
for i in range(fsize):
page = f.read(INNODB_PAGE_SIZE)
page_offset = mach_read_from_n(page,FIL_PAGE_OFFSET,4)
page_type = mach_read_from_n(page,FIL_PAGE_TYPE,2)
if myargv.parms.has_key('-v'):
if page_type == '45bf':
page_level = mach_read_from_n(page,FIL_PAGE_DATA+PAGE_LEVEL,2)
print "page offset %s, page type <%s>, page level <%s>"%(page_offset,innodb_page_type[page_type],page_level)
else:
print "page offset %s, page type <%s>"%(page_offset,innodb_page_type[page_type])
if not ret.has_key(page_type):
ret[page_type] = 1
else:
ret[page_type] = ret[page_type] + 1
print "Total number of page: %d:"%fsize
for type in ret:
print "%s: %s"%(innodb_page_type[type],ret[type])
3. include.py
#encoding=utf-8
INNODB_PAGE_SIZE = 16*1024*1024
# Start of the data on the page
FIL_PAGE_DATA = 38
FIL_PAGE_OFFSET = 4 # page offset inside space
FIL_PAGE_TYPE = 24 # File page type
# Types of an undo log segment */
TRX_UNDO_INSERT = 1
TRX_UNDO_UPDATE = 2
# On a page of any file segment, data may be put starting from this offset
FSEG_PAGE_DATA = FIL_PAGE_DATA
# The offset of the undo log page header on pages of the undo log
TRX_UNDO_PAGE_HDR = FSEG_PAGE_DATA
PAGE_LEVEL = 26 #level of the node in an index tree; the leaf level is the level 0 */
innodb_page_type={
'0000':u'Freshly Allocated Page',
'0002':u'Undo Log Page',
'0003':u'File Segment inode',
'0004':u'Insert Buffer Free List',
'0005':u'Insert Buffer Bitmap',
'0006':u'System Page',
'0007':u'Transaction system Page',
'0008':u'File Space Header',
'0009':u'扩展描述页',
'000a':u'Uncompressed BLOB Page',
'000b':u'1st compressed BLOB Page',
'000c':u'Subsequent compressed BLOB Page',
'45bf':u'B-tree Node'
}
innodb_page_direction={
'0000': 'Unknown(0x0000)',
'0001': 'Page Left',
'0002': 'Page Right',
'0003': 'Page Same Rec',
'0004': 'Page Same Page',
'0005': 'Page No Direction',
'ffff': 'Unkown2(0xffff)'
}
INNODB_PAGE_SIZE=1024*16
三、使用py_innodb_page_info.py工具
进入py_innodb_page_info.py所在的目录下,使用以下命令:
python py_innodb_page_info.py -v /home/MySQL5.7/mysql-5.7.35/data/test_mysql/test_init_table.ibd
- 
[root@488c1daa7967 py_innodb_page_info]# 
- 
[root@488c1daa7967 py_innodb_page_info]# pwd
- 
/home/py_innodb_page_info
- 
[root@488c1daa7967 py_innodb_page_info]# 
- 
[root@488c1daa7967 py_innodb_page_info]# 
- 
[root@488c1daa7967 py_innodb_page_info]# python py_innodb_page_info.py -v /home/MySQL5.7/mysql-5.7.35/data/test_mysql/test_init_table.ibd
- 
page offset 00000000, page type <File Space Header>
- 
page offset 00000001, page type <Insert Buffer Bitmap>
- 
page offset 00000002, page type <File Segment inode>
- 
page offset 00000003, page type <B-tree Node>, page level <0000>
- 
page offset 00000000, page type <Freshly Allocated Page>
- 
page offset 00000000, page type <Freshly Allocated Page>
- 
Total number of page: 6:
- 
Freshly Allocated Page: 2
- 
Insert Buffer Bitmap: 1
- 
File Space Header: 1
- 
B-tree Node: 1
- 
File Segment inode: 1
| 内容 | 描述 | 
| page offset | 1. 该页在表空间的偏移量; 2. 00000003页:3 * 16KB = 49152 = 0xc000, 打开.ibd文件,找到0xc000,就是00000003页的起始位置。 | 
| page type | 页的类型,其中: 1. B-tree Node:B+树节点页,page level <0000>是叶子节点; 其他是非叶子节点; Freshly Allocated Page:最新分配的页(空闲页); Insert Buffer Bitmap:插入缓冲Bitmap页; | 
| page level | 1. B+树的高度; 2. <0000>是叶子节点;非0是非叶子节点 | 
| Total number of page | 表空间的页总数 | 
| Freshly Allocated Page | 表空间的空闲页总数 | 
| Insert Buffer Bitmap | 插入缓冲Bitmap的页数 | 
| File Space Header | File Space Header的页数 | 
| B-tree Node | B+树节点的页数量(叶子节点 + 非叶子节点) | 
| File Segment inode | File Segment inode的页数 | 
四、参考资料
Linux 安装Python3_Alex_Sheng_Sea的博客-CSDN博客_linux安装python
py_innodb_page_info工具使用_Hehuyi_In的博客-CSDN博客_py_innodb_page_info
[转帖]py_innodb_page_info.py工具使用的更多相关文章
- python py_innodb_page_info.py -v /usr/local/var/mysql/ibdata1
		mylib.py #encoding=utf-8 import os import include from include import * TABLESPACE_NAME='D:\\mysql_d ... 
- [转帖]FPGA开发工具汇总
		原帖:http://blog.chinaaet.com/yocan/p/5100017074 ----------------------------------------------------- ... 
- [转帖]vivado & VS2013工具
		来源:http://bbs.csdn.net/topics/380057699 添加OpenCV库后,MFC在Debug模式下调试,提示应用程序无法正常启动(0xc000007b). 解决方法:在环境 ... 
- [转帖]CHROME开发者工具的小技巧
		CHROME开发者工具的小技巧 https://coolshell.cn/articles/17634.html 需要仔细学习看一看呢. 2017年01月19日 陈皓 评论 58 条评论 64,08 ... 
- [转帖]服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue
		服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue https://ywnz.com/linuxyffq/5270.html 改天试用一下. ... 
- 《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#)
		原文地址:http://user.qzone.qq.com/419067339/2 public string GET_HTTP(string url, string referer_post, st ... 
- MySQL 如何存储长度较大的varchar与blob
		本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/96 最近,在工作中遇到了MySQL中如何存储长度较长的字段类型问 ... 
- MYSQL Innodb逻辑存储结构
		转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ... 
- 事务实现,redo,undo,锁
		事务(Transaction)是数据库区别于文件系统的重要特性之一.在文件系统中,如果你正在写文件,但是操作系统突然崩溃了,这个文件就很有可能被破坏.当然,有一些机制可以把文件恢复到某个时间点.不过, ... 
- django manage.py 的各种功能
		[简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ... 
随机推荐
- $router.push跳转页面传参
			$router.push传参与收参 //传参 <el-button type="text" @click="$router.push('/games/Match?i ... 
- 第七部分_Shell脚本之循环
			for循环语句 关键词:爱的魔力转圈圈 1. for循环语法结构 空行相对于for循环类似于空格 ㈠ 列表循环 列表for循环:用于将一组命令执行已知的次数 基本语法格式 for variable i ... 
- 【万字干货】OpenMetric与时序数据库存储模型分析
			摘要:解读OpenMetric规范和指标的模型定义基础上,结合当下主流的时序数据库核心存储及处理技术,尝试让用户(架构师.开发者或使用者)结合自身业务场景选择合适的产品,消除技术选型的困惑. 本文分享 ... 
- web messaging与Woker分类:漫谈postMessage跨线程跨页面通信
			web messaging 跨文档通信(cross-document messaging):跨就是我们国内更为熟知的HTML5 window.postMessage()应用的那种通信: 通道通信(ch ... 
- AI 黑科技,老照片修复,模糊变高清
			大家好 最近闲逛,发现腾讯开源的老照片修复算法新出了V1.3的预训练模型,手痒试了一下. 我拿"自己"的旧照片试了一下,先看效果 GFPGAN FPGAN算法由腾讯PCG ARC实 ... 
- 火爆全网的条形竞赛图,Python轻松实现
			这个动图叫条形竞赛图,非常适合制作随时间变动的数据. 我已经用streamlit+bar_chart_race实现了,然后白嫖了heroku的服务器,大家通过下面的网址上传csv格式的表格就可以轻松制 ... 
- 【django-vue】七牛云上传视频  搜索接口  支付宝sdk二次封装  下单接口  前端支付页面 支付成功回调接口
			目录 上节回顾 课程详情接口 choice字段 今日内容 1 文件存储 1.1 七牛云上传文件 2 搜索导航栏 2.1 Header.vue 3 搜索接口 4 搜索页面 5 支付宝支付介绍 5.1 支 ... 
- SSL 证书变革之时已至,这些变化你都清楚吗?
			现代社会最离不开的是"安全",无论是生命.财产.数据还是其他任何事物都需要各种手段来保证安全,互联网自然也无法免俗.HTTP 协议作为无法加密数据,让所有通信数据都在网络中明文&q ... 
- nginx: [emerg] duplicate upstream "test2" in /usr/local/nginx/conf/sites-enabled/test2.conf:1
			使用/usr/local/nginx/sbin/nginx -t 检查nginx配置文件时报错: nginx: [emerg] duplicate upstream "test2" ... 
- UVA540 Team Queue(双queue)
			题目大意 有一条长队,每个人均唯一属于一个组(有编号),执行给定操作序列,输出相应结果.操作如下: (假设长队q1) ENQUEUE x:标号为x的人入队,若q1中存在和x属于同一组的人,则将x插入长 ... 
 
			
		