[转帖]py_innodb_page_info.py工具使用

py,innodb,page,info,工具,使用 · 浏览次数 : 0

小编点评

## Python 入野页面信息工具使用指南 **1. Introduction** * 介绍 Python 入野页面信息工具 (py_innodb_page_info) 的功能。 * 显示工具使用可的选项和变量。 **2. Usage Guide** * 使用示例展示如何读取和解析数据库文件。 * 显示如何指定页面偏移量和页类型。 * 示例展示如何获取页面信息以及数据描述。 **3. Example** * 读取一个数据库文件 (test_init_table.ibd) 的第一个页面。 * 获取页面信息,包括页面类型、偏移量和数据描述。 **4. Variable Definition** * 显示一些可定义的变量,例如页面偏移量、页类型和数据描述。 * 使用示例展示如何定义和使用这些变量。 **5. Options and Variables** * 显示工具支持的选项和变量。 * 使用示例展示如何设置选项和变量。 **6. Example Usage** * 读取一个数据库文件 (test_init_table.ibd) 的第一个页面。 * 获取页面信息,包括页面类型、偏移量和数据描述。 * 打印页面类型、偏移量和数据描述。 **7. Conclusion** * 回收所有重要信息。 * 展示工具的使用可的选项和变量。 **8. References** * Linux 安装 Python3_Alex_Sheng_Sea 的博客文章。 * py_innodb_page_info 工具使用指南文章。

正文

目录

一、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

#! /usr/bin/env python#encoding=utf-8import mylibfrom sys import argvfrom 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-8import osimport includefrom include import * TABLESPACE_NAME='/home/MySQL5.7/mysql-5.7.35/data/test_mysql/page_structure.ibd'VARIABLE_FIELD_COUNT = 1NULL_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-8INNODB_PAGE_SIZE = 16*1024*1024 # Start of the data on the pageFIL_PAGE_DATA = 38FIL_PAGE_OFFSET = 4 # page offset inside spaceFIL_PAGE_TYPE = 24 # File page type # Types of an undo log segment */TRX_UNDO_INSERT = 1TRX_UNDO_UPDATE = 2 # On a page of any file segment, data may be put starting from this offsetFSEG_PAGE_DATA = FIL_PAGE_DATA # The offset of the undo log page header on pages of the undo logTRX_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.ibdpage 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: 2Insert Buffer Bitmap: 1File Space Header: 1B-tree Node: 1File 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 HeaderFile Space Header的页数
B-tree NodeB+树节点的页数量(叶子节点 + 非叶子节点)
File Segment inodeFile 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工具使用相似的内容:

[转帖]py_innodb_page_info.py工具使用

目录 一、Linux安装Python3 1. 解压包 2. 安装环境 3. 生成编译脚本 4. 检查python3.10的编译器 5. 建立Python3和pip3的软链 6. 添加到PATH 7. 验证Python3和pip3是否正常 二、py_innodb_page_info.py工具 1. p

[转帖]超详细的解决ModuleNotFoundError: No module named '_curses'错误的方法!!!

超详细的解决ModuleNotFoundError: No module named '_curses’的错误 问题描述:在写py脚本时,需要用到curses库(提供了控制字符屏幕的独立于终端的方法)。 导入的时候完全正常 Run的时候却报了这样的错误(它说找不到这个包) 本能的解决方法: 首先想到

[转帖]bcc Python Developer Tutorial

https://github.com/iovisor/bcc/blob/master/docs/tutorial_bcc_python_developer.md This tutorial is about developing bcc tools and programs using the Py

[转帖]Linux探测工具BCC(网络)

https://www.cnblogs.com/charlieroro/p/13273179.html 目录 Linux探测工具BCC(网络) Icmp的探测 TCP的探测 Icmp的探测 首先看下促使我学习bcc的这篇文章中的程序traceicmpsoftirq.py,使用该程序的本意是找出对pi

【转帖】python 安装whl文件

前言 WHL文件是以Wheel格式保存的Python安装包,Wheel是Python发行版的标准内置包格式。在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件,这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查

[转帖]

Linux ubuntu20.04 网络配置(图文教程) 因为我是刚装好的最小系统,所以很多东西都没有,在开始配置之前需要做下准备 环境准备 系统:ubuntu20.04网卡:双网卡 网卡一:供连接互联网使用网卡二:供连接内网使用(看情况,如果一张网卡足够,没必要做第二张网卡) 工具: net-to

[转帖]

https://cloud.tencent.com/developer/article/2168105?areaSource=104001.13&traceId=zcVNsKTUApF9rNJSkcCbB 前言 Redis作为高性能的内存数据库,在大数据量的情况下也会遇到性能瓶颈,日常开发中只有时刻

[转帖]ISV 、OSV、 SIG 概念

ISV 、OSV、 SIG 概念 2022-10-14 12:29530原创大杂烩 本文链接:https://www.cndba.cn/dave/article/108699 1. ISV: Independent Software Vendors “独立软件开发商”,特指专门从事软件的开发、生产、

[转帖]Redis 7 参数 修改 说明

2022-06-16 14:491800原创Redis 本文链接:https://www.cndba.cn/dave/article/108066 在之前的博客我们介绍了Redis 7 的安装和配置,如下: Linux 7.8 平台 Redis 7 安装并配置开机自启动 操作手册https://ww

[转帖]HTTPS中间人攻击原理

https://www.zhihu.com/people/bei-ji-85/posts 背景 前一段时间,公司北京地区上线了一个HTTPS防火墙,用来监听HTTPS流量。防火墙上线之前,邮件通知给管理层,我从我老大那里听说这个事情的时候,说这个有风险,然后意外地发现,很多人原来都不知道HTTPS防