[转帖]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. ...
随机推荐
- 2021-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?
2021-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作? 福哥答案2020-01-20: 陌陌答案: 用pt_o ...
- 浅学GoF23种设计模式
long long ago 买了设计模式的书,一直没看,平常工作虽然涉及到,但是不够系统,工作之余抽空学习一下. 一.创建型模式 01.单例(Singleton) 02.工厂方法(Factory Me ...
- 从4个特点为你解密华为云媒体网络底座AND
本文分享自华为云社区<解密华为云媒体网络底座ADN>,作者: Satan.D . 互联网的痛点与解决思路 互联网自1968年起源依赖,已经发展了半个多世纪.互联网仅从中文字面意思,可以简单 ...
- 学了这么久的高并发编程,连Java中的并发原子类都不知道?
摘要:保证线程安全是 Java 并发编程必须要解决的重要问题,本文和大家聊聊Java中的并发原子类,看它如何确保多线程的数据一致性. 本文分享自华为云社区<学了这么久的高并发编程,连Java中的 ...
- CANN AICPU算子耗时分析及优化探索
摘要:本文以GreaterEqual作为测试算子,该算子计算逻辑较为简单(output = input1 >= input2),旨在尽可能降低计算耗时,使得算子耗时尽可能以数据操作和算子调度作为 ...
- 云图说丨初识数据工坊DWR
摘要:数据工坊DWR是一款近数据处理服务,通过易用的工作流编排和开放生态的数据处理算子,能够在云上实现图像.视频.文档.图片等数据处理业务. 本文分享自华为云社区<[云图说]第236期 初识数据 ...
- linux添加用户,修改用户密码,修改用户权限,设置root用户操作
1.添加普通用户 [root@server ~]# useradd chenjiafa //添加一个名为chenjiafa的用户[root@server ~]# passwd chenjiafa ...
- PPT 配色方法
https://www.bilibili.com/video/BV1ha411g7f5/?p=10 https://dribbble.com/ 问题1:配色太多,主题色混乱 一个主色,两辅色 问题2: ...
- Bug定级实例
*1级,**系统崩溃* *定义:*严重阻碍测试和开发工作 *对应**优先级**:**最高* *具体可分为:* 1.功能完全没有实现 2.应用闪退/崩溃无法运行 3*.应用必现安全模式,无法运行* 4. ...
- Hugging Face 入选 Time《时代周刊》2023 全球前 100 最具影响力的公司
喜报 Hugging Face 入选 Time<时代周刊>2023 全球前 100 最具影响力的公司 继续为梦想努力 继续为开源贡献 榜单链接: https://time.com/100c ...
