《MySQL技术内幕 InnoDB存储引擎》一书中用于查看数据页内容的python小工具

Posted 落叶成冰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《MySQL技术内幕 InnoDB存储引擎》一书中用于查看数据页内容的python小工具相关的知识,希望对你有一定的参考价值。

工具包中用到的三个文件内容如下:

include.py

#encoding=utf-8
INNODB_PAGE_SIZE=1024*16 # InnoDB Page 16K

# 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)'


mylib.py

#encoding=utf-8
import os
from include import *

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 information '
			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])

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)



自己再加个 windows 批处理脚本

@echo off

:: 查看 mysql InnoDB 表的页结构信息
python %~dp0/py_innodb_page_info.py %*

以上是关于《MySQL技术内幕 InnoDB存储引擎》一书中用于查看数据页内容的python小工具的主要内容,如果未能解决你的问题,请参考以下文章

《MySQL技术内幕 InnoDB存储引擎 》学习笔记

MySQL技术内幕 InnoDB存储引擎 之 InnoDB体系架构

《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

(转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁

《MySQL技术内幕InnoDB存储引擎》读书笔记 第一章

MySQL技术内幕(SQL编程)-数据类型