目录

一、Linux安装Python3

1. 解压包

2. 安装环境

3. 生成编译脚本

4. 检查python3.10的编译器

5. 建立Python3和pip3的软链

6. 添加到PATH

7. 验证Python3和pip3是否正常

二、py_innodb_page_info.py工具

1. py_innodb_page_info.py

2. mylib.py

3. include.py

三、使用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

  1. 进入:vim /etc/profile
  2. python的bin加入到PATH中:export PATH=$PATH:$JAVA_HOME/bin:/home/python3/Python-3.10.5/bin
  3. 重启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


  1. #! /usr/bin/env python
  2. #encoding=utf-8
  3. import mylib
  4. from sys import argv
  5. from mylib import myargv
  6. if __name__ == '__main__':
  7. myargv = myargv(argv)
  8. if myargv.parse_cmdline() == 0:
  9. pass
  10. else:
  11. mylib.get_innodb_page_type(myargv)

2. mylib.py


  1. #encoding=utf-8
  2. import os
  3. import include
  4. from include import *
  5. TABLESPACE_NAME='/home/MySQL5.7/mysql-5.7.35/data/test_mysql/page_structure.ibd'
  6. VARIABLE_FIELD_COUNT = 1
  7. NULL_FIELD_COUNT = 0
  8. class myargv(object):
  9. def __init__(self, argv):
  10. self.argv = argv
  11. self.parms = {}
  12. self.tablespace = ''
  13. def parse_cmdline(self):
  14. argv = self.argv
  15. if len(argv) == 1:
  16. print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file'
  17. print 'For more options, use python py_innodb_page_info.py -h'
  18. return 0
  19. while argv:
  20. if argv[0][0] == '-':
  21. if argv[0][1] == 'h':
  22. self.parms[argv[0]] = ''
  23. argv = argv[1:]
  24. break
  25. if argv[0][1] == 'v':
  26. self.parms[argv[0]] = ''
  27. argv = argv[1:]
  28. else:
  29. self.parms[argv[0]] = argv[1]
  30. argv = argv[2:]
  31. else:
  32. self.tablespace = argv[0]
  33. argv = argv[1:]
  34. if self.parms.has_key('-h'):
  35. print 'Get InnoDB Page Info'
  36. print 'Usage: python py_innodb_page_info.py [OPTIONS] tablespace_file\n'
  37. print 'The following options may be given as the first argument:'
  38. print '-h help '
  39. print '-o output put the result to file'
  40. print '-t number thread to anayle the tablespace file'
  41. print '-v verbose mode'
  42. return 0
  43. return 1
  44. def mach_read_from_n(page,start_offset,length):
  45. ret = page[start_offset:start_offset+length]
  46. return ret.encode('hex')
  47. def get_innodb_page_type(myargv):
  48. f=file(myargv.tablespace,'rb')
  49. fsize = os.path.getsize(f.name)/INNODB_PAGE_SIZE
  50. ret = {}
  51. for i in range(fsize):
  52. page = f.read(INNODB_PAGE_SIZE)
  53. page_offset = mach_read_from_n(page,FIL_PAGE_OFFSET,4)
  54. page_type = mach_read_from_n(page,FIL_PAGE_TYPE,2)
  55. if myargv.parms.has_key('-v'):
  56. if page_type == '45bf':
  57. page_level = mach_read_from_n(page,FIL_PAGE_DATA+PAGE_LEVEL,2)
  58. print "page offset %s, page type <%s>, page level <%s>"%(page_offset,innodb_page_type[page_type],page_level)
  59. else:
  60. print "page offset %s, page type <%s>"%(page_offset,innodb_page_type[page_type])
  61. if not ret.has_key(page_type):
  62. ret[page_type] = 1
  63. else:
  64. ret[page_type] = ret[page_type] + 1
  65. print "Total number of page: %d:"%fsize
  66. for type in ret:
  67. print "%s: %s"%(innodb_page_type[type],ret[type])

3. include.py


  1. #encoding=utf-8
  2. INNODB_PAGE_SIZE = 16*1024*1024
  3. # Start of the data on the page
  4. FIL_PAGE_DATA = 38
  5. FIL_PAGE_OFFSET = 4 # page offset inside space
  6. FIL_PAGE_TYPE = 24 # File page type
  7. # Types of an undo log segment */
  8. TRX_UNDO_INSERT = 1
  9. TRX_UNDO_UPDATE = 2
  10. # On a page of any file segment, data may be put starting from this offset
  11. FSEG_PAGE_DATA = FIL_PAGE_DATA
  12. # The offset of the undo log page header on pages of the undo log
  13. TRX_UNDO_PAGE_HDR = FSEG_PAGE_DATA
  14. PAGE_LEVEL = 26 #level of the node in an index tree; the leaf level is the level 0 */
  15. innodb_page_type={
  16. '0000':u'Freshly Allocated Page',
  17. '0002':u'Undo Log Page',
  18. '0003':u'File Segment inode',
  19. '0004':u'Insert Buffer Free List',
  20. '0005':u'Insert Buffer Bitmap',
  21. '0006':u'System Page',
  22. '0007':u'Transaction system Page',
  23. '0008':u'File Space Header',
  24. '0009':u'扩展描述页',
  25. '000a':u'Uncompressed BLOB Page',
  26. '000b':u'1st compressed BLOB Page',
  27. '000c':u'Subsequent compressed BLOB Page',
  28. '45bf':u'B-tree Node'
  29. }
  30. innodb_page_direction={
  31. '0000': 'Unknown(0x0000)',
  32. '0001': 'Page Left',
  33. '0002': 'Page Right',
  34. '0003': 'Page Same Rec',
  35. '0004': 'Page Same Page',
  36. '0005': 'Page No Direction',
  37. 'ffff': 'Unkown2(0xffff)'
  38. }
  39. 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


  1. [root@488c1daa7967 py_innodb_page_info]#
  2. [root@488c1daa7967 py_innodb_page_info]# pwd
  3. /home/py_innodb_page_info
  4. [root@488c1daa7967 py_innodb_page_info]#
  5. [root@488c1daa7967 py_innodb_page_info]#
  6. [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
  7. page offset 00000000, page type <File Space Header>
  8. page offset 00000001, page type <Insert Buffer Bitmap>
  9. page offset 00000002, page type <File Segment inode>
  10. page offset 00000003, page type <B-tree Node>, page level <0000>
  11. page offset 00000000, page type <Freshly Allocated Page>
  12. page offset 00000000, page type <Freshly Allocated Page>
  13. Total number of page: 6:
  14. Freshly Allocated Page: 2
  15. Insert Buffer Bitmap: 1
  16. File Space Header: 1
  17. B-tree Node: 1
  18. 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

Download Python | Python.org

py_innodb_page_info工具使用_Hehuyi_In的博客-CSDN博客_py_innodb_page_info

文章知识点与官方知识档案匹配,可进一步学习相关知识

[转帖]py_innodb_page_info.py工具使用的更多相关文章

  1. 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 ...

  2. [转帖]FPGA开发工具汇总

    原帖:http://blog.chinaaet.com/yocan/p/5100017074 ----------------------------------------------------- ...

  3. [转帖]vivado & VS2013工具

    来源:http://bbs.csdn.net/topics/380057699 添加OpenCV库后,MFC在Debug模式下调试,提示应用程序无法正常启动(0xc000007b). 解决方法:在环境 ...

  4. [转帖]CHROME开发者工具的小技巧

    CHROME开发者工具的小技巧 https://coolshell.cn/articles/17634.html 需要仔细学习看一看呢. 2017年01月19日 陈皓 评论 58 条评论  64,08 ...

  5. [转帖]服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue

    服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue https://ywnz.com/linuxyffq/5270.html 改天试用一下. ...

  6. 《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#)

    原文地址:http://user.qzone.qq.com/419067339/2 public string GET_HTTP(string url, string referer_post, st ...

  7. MySQL 如何存储长度较大的varchar与blob

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/96 最近,在工作中遇到了MySQL中如何存储长度较长的字段类型问 ...

  8. MYSQL Innodb逻辑存储结构

    转载于网络 这几天在读<MySQL技术内幕 InnoDB存储引擎>,对 Innodb逻辑存储结构有了些了解,顺便也记录一下: 从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放 ...

  9. 事务实现,redo,undo,锁

    事务(Transaction)是数据库区别于文件系统的重要特性之一.在文件系统中,如果你正在写文件,但是操作系统突然崩溃了,这个文件就很有可能被破坏.当然,有一些机制可以把文件恢复到某个时间点.不过, ...

  10. django manage.py 的各种功能

    [简介] django-admin.py是Django的一个用于管理任务的命令行工具.本文将描述它的大概用法. 另外,在每一个Django project中都会有一个manage.py.manage. ...

随机推荐

  1. MongoDB经典故障系列六:CPU利用率太高怎么办?

    每逢电商大促,全民狂欢,但热闹是属于疯狂剁手的人们.而开发者们有的缺是"高流量.高访问.高并发"三高下带来的种种问题.为了应对大促期间的高I/O情况,企业会选择MongoDB云数据 ...

  2. Ambient Mesh:Istio 数据面新模式

    摘要:基于Istio对于Kubernetes生态的完美补充,随着Kubernetes的大规模普及,Istio 数据面新模式 -Ambient MeshIstio也实现了对用户心智以及市场的快速抢占. ...

  3. 语音识别端到端模型解读:FSMN及其变体模型

    摘要:在很长一段时间内,语音识别领域最常用的模型是GMM-HMM.但近年来随着深度学习的发展,出现了越来越多基于神经网络的语音识别模型. 一.概述 在很长一段时间内,语音识别领域最常用的模型是GMM- ...

  4. HDC.Cloud2021|开发者们都在谈的云原生到底长什么样?

    摘要:云原生数据库基于存储与计算分离架构,与传统数据库相比,具备高性能.高扩展.一致性.易管理和多云支持等特性,在海量数据处理.智能存储.业务应用等方面表现出了强大的生命力. 近几年,云原生的风越刮越 ...

  5. 解析鸿蒙内核消息队列QueueMail接口的哼哈二将

    摘要:本文带领大家一起剖析了鸿蒙轻内核的队列模块的QueueMail两个接口的源代码. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十三(续) 消息队列QueueMail接口>,作者: ...

  6. Prometheus搭乘华为云GaussDB(for Influx):让监控数据更安全

    摘要:GaussDB(for Influx)是一款分布式架构,云原生的时序数据库.可无缝被Prometheus集成,在协议上原生支持Prometheus远端存储对接至GaussDB(for Influ ...

  7. JS引擎(0):JavaScript引擎群雄演义—起底JavaScript引擎

    JavaScript 既是一个 面向过程的语言 又是一个 面向对象的语言.在 JavaScript 中,通过在运行时给空对象附加方法和属性来创建对象,与编译语言如 C++ 和 Java 中常见的通过语 ...

  8. 广告策划师如何做 AB 测试

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 近年来,随着消费者的心理需求逐步趋向于精神层面.科技的迭代迅速以及市场环境的复杂性逐步上升,我国的广告行业逐步展开 ...

  9. 字节跳动基于 Apache Hudi 的多流拼接实践方案

    字节跳动数据湖团队在实时数仓构建宽表的业务场景中,探索实践出的一种基于 Hudi Payload 的合并机制提出的全新解决方案. 字节跳动数据湖团队在实时数仓构建宽表的业务场景中,探索实践出的一种基于 ...

  10. 负载均衡 —— SpringCloud Netflix Ribbon

    Ribbon 简介 Ribbon 是 Netfix 客户端的负载均衡器,可对 HTTP 和 TCP 客户端的行为进行控制.为 Ribbon 配置服务提供者地址后,Ribbon 就可以基于某种负载均衡算 ...