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