对于原本就是8.0环境的ibd文件, 第4页就是SDI PAGE, 之前的ibd2sql也是直接解析第四页得到的.
但对于从5.7升级到8.0的ibd文件. sdi page就不在这里了. 这里是index page.
mysql官方也考虑到这个问题的. 所以会在第一页FILE_SPACE_PAGE中记录 SDI_PAGE的位置. 实际上就是在XDES PAGE后面的INFO_MAX_SIZE后面.
懒得画图了, 就直接表格表示. (参考官方ibd2sdi.cc)
object | size(byte) |
|---|---|
FIL_HEADER | 38 |
SPACE_HEADER | 112 |
XDES | 40*256 |
INFO_MAX | 111 + 4 |
HAVE_SDI_PAGE | 4 |
SDI_PAGE_NO | 4 |
也就得到 是否含有SDI_PAGE的位置在 38+112+40*256+111+4 = 10505
如果有SDI_PAGE, 那么它的PAGE_NO为 10505+4 = 10509
所以可以使用文末脚本解析ibd文件得到SDI信息.
16:11:22 [root@ddcw21 ei]#python parse2sdi.py /data/mysql_3308/mysqldata/db1/sbtest1.ibd
('Unexpected SDI version. ', 0)
16:11:26 [root@ddcw21 ei]#python parse2sdi.py /data/mysql_3358/mysqldata/db1/sbtest1.ibd
/*
* 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释
* {u'mysqld_version_id': 80034, u'sdi_version': 80019, u'dd_object_type': u'Table', u'dd_object': {u'comment': u'', u'default_subpartitioning': 0, u'default_partitioning': 0, u'collation_id': 33, u'subpartition_expression_utf8': u'', u'row_format': 2, u'schema_ref': u'db1', u'partition_expression_utf8': u'', u'subpartition_type': 0, u'indexes': [{u'comment': u'', u'is_visible': True, u'elements': [{u'hidden': False, u'length': 4, u'ordinal_position': 1, u'order': 2, u'column_opx': 0}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 2, u'order': 2, u'column_opx': 4}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 3, u'order': 2, u'column_opx': 5}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 4, u'order': 2, u'column_opx': 1}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 5, u'order': 2, u'column_opx': 2}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 6, u'order': 2, u'column_opx': 3}], u'name': u'PRIMARY', u'algorithm': 2, u'is_generated': False, u'engine': u'InnoDB', u'is_algorithm_explicit': False, u'ordinal_position': 1, u'secondary_engine_attribute': u'', u'se_private_data': u'id=41;root=3;space_id=23;table_id=1064;trx_id=0;', u'hidden': False, u'type': 1, u'options': u'flags=0;', u'tablespace_ref': u'db1/sbtest1', u'engine_attribute': u''}, {u'comment': u'', u'is_visible': True, u'elements': [{u'hidden': False, u'length': 4, u'ordinal_position': 1, u'order': 2, u'column_opx': 1}, {u'hidden': True, u'length': 4294967295, u'ordinal_position': 2, u'order': 2, u'column_opx': 0}], u'name': u'k_1', u'algorithm': 2, u'is_generated': False, u'engine': u'InnoDB', u'is_algorithm_explicit': False, u'ordinal_position': 2, u'secondary_engine_attribute': u'', u'se_private_data': u'id=42;root=16389;space_id=23;table_id=1064;trx_id=0;', u'hidden': False, u'type': 3, u'options': u'flags=0;', u'tablespace_ref': u'db1/sbtest1', u'engine_attribute': u''}], u'mysql_version_id': 80034, u'last_altered': 20231013031814, u'columns': [{u'comment': u'', u'numeric_scale_null': False, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 1, u'default_value_null': False, u'default_value': u'AAAAAA==', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 8, u'char_length': 11, u'default_option': u'', u'column_key': 2, u'datetime_precision': 0, u'hidden': 1, u'type': 4, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'int', u'default_value_utf8_null': True, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 10, u'secondary_engine_attribute': u'', u'name': u'id', u'default_value_utf8': u'', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': True, u'options': u'interval_count=0;', u'engine_attribute': u''}, {u'comment': u'', u'numeric_scale_null': False, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 2, u'default_value_null': False, u'default_value': u'AAAAAA==', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 8, u'char_length': 11, u'default_option': u'', u'column_key': 4, u'datetime_precision': 0, u'hidden': 1, u'type': 4, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'int', u'default_value_utf8_null': False, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 10, u'secondary_engine_attribute': u'', u'name': u'k', u'default_value_utf8': u'0', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': False, u'options': u'interval_count=0;', u'engine_attribute': u''}, {u'comment': u'', u'numeric_scale_null': True, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 3, u'default_value_null': False, u'default_value': u'ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAg', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 33, u'char_length': 360, u'default_option': u'', u'column_key': 1, u'datetime_precision': 0, u'hidden': 1, u'type': 29, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'char(120)', u'default_value_utf8_null': False, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 0, u'secondary_engine_attribute': u'', u'name': u'c', u'default_value_utf8': u'', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': False, u'options': u'interval_count=0;', u'engine_attribute': u''}, {u'comment': u'', u'numeric_scale_null': True, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 4, u'default_value_null': False, u'default_value': u'ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\nICAgICAgICAg', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 33, u'char_length': 180, u'default_option': u'', u'column_key': 1, u'datetime_precision': 0, u'hidden': 1, u'type': 29, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'char(60)', u'default_value_utf8_null': False, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 0, u'secondary_engine_attribute': u'', u'name': u'pad', u'default_value_utf8': u'', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': False, u'options': u'interval_count=0;', u'engine_attribute': u''}, {u'comment': u'', u'numeric_scale_null': True, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 5, u'default_value_null': True, u'default_value': u'', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 63, u'char_length': 6, u'default_option': u'', u'column_key': 1, u'datetime_precision': 0, u'hidden': 2, u'type': 10, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'', u'default_value_utf8_null': True, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 0, u'secondary_engine_attribute': u'', u'name': u'DB_TRX_ID', u'default_value_utf8': u'', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': False, u'options': u'', u'engine_attribute': u''}, {u'comment': u'', u'numeric_scale_null': True, u'is_zerofill': False, u'se_private_data': u'table_id=1064;', u'ordinal_position': 6, u'default_value_null': True, u'default_value': u'', u'datetime_precision_null': 1, u'is_virtual': False, u'collation_id': 63, u'char_length': 7, u'default_option': u'', u'column_key': 1, u'datetime_precision': 0, u'hidden': 2, u'type': 9, u'numeric_scale': 0, u'generation_expression_utf8': u'', u'elements': [], u'column_type_utf8': u'', u'default_value_utf8_null': True, u'is_unsigned': False, u'generation_expression': u'', u'is_explicit_collation': False, u'srs_id_null': True, u'numeric_precision': 0, u'secondary_engine_attribute': u'', u'name': u'DB_ROLL_PTR', u'default_value_utf8': u'', u'is_nullable': False, u'srs_id': 0, u'has_no_default': False, u'update_option': u'', u'is_auto_increment': False, u'options': u'', u'engine_attribute': u''}], u'partition_type': 0, u'engine': u'InnoDB', u'subpartition_expression': u'', u'check_constraints': [], u'hidden': 1, u'partitions': [], u'secondary_engine_attribute': u'', u'name': u'sbtest1', u'created': 20231013031814, u'partition_expression': u'', u'se_private_id': 1064, u'last_checked_for_upgrade_version_id': 80034, u'foreign_keys': [], u'se_private_data': u'autoinc=10000000;version=0;', u'options': u'avg_row_length=0;encrypt_type=N;key_block_size=0;keys_disabled=0;pack_record=0;stats_auto_recalc=0;stats_sample_pages=0;', u'engine_attribute': u''}, u'dd_version': 80023}
*/
16:11:31 [root@ddcw21 ei]#

附源码:
import sys,zlib,json
import struct
PAGE_NEW_INFIMUM = 99
#MAGIC_SIZE=3 KEY_LEN=32 SERVER_UUID_LEN=36
#(MAGIC_SIZE + sizeof(uint32) + (KEY_LEN * 2) + SERVER_UUID_LEN + sizeof(uint32))
INFO_SIZE = 3+4+32*2+36+4
INFO_MAX_SIZE = INFO_SIZE + 4
SDI_OFFSET = 38+112+40*256 + INFO_MAX_SIZE
SDI_VERSION = 1
filename = sys.argv[1]
with open(filename,'rb') as f:
fsp_bdata = f.read(16384)
version = struct.unpack('>I',fsp_bdata[SDI_OFFSET:SDI_OFFSET+4])[0]
if version != SDI_VERSION:
print('Unexpected SDI version. ',version)
sys.exit(1)
SDI_OFFSET += 4
sdi_page_no = struct.unpack('>I',fsp_bdata[SDI_OFFSET:SDI_OFFSET+4])[0]
#print('SDI PAGE NO: ',sdi_page_no)
f.seek(16384*sdi_page_no,0)
bdata = f.read(16384)
offset = struct.unpack('>H',bdata[PAGE_NEW_INFIMUM-2:PAGE_NEW_INFIMUM])[0] + PAGE_NEW_INFIMUM
dtype,did = struct.unpack('>LQ',bdata[offset:offset+12])
#dtrx = int.from_bytes(bdata[offset+12:offset+12+6],'big')
#dundo = int.from_bytes(bdata[offset+12+6:offset+12+6+7],'big')
dunzip_len,dzip_len = struct.unpack('>LL',bdata[offset+33-8:offset+33])
unzbdata = zlib.decompress(bdata[offset+33:offset+33+dzip_len])
dic_info = json.loads(unzbdata.decode())
print(str(dic_info))
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。