sec文件用什么方式打开,如何下载sec上的文件

首页 > 经验 > 作者:YD1662022-11-04 00:56:37

导读:

本文是对上一篇文章的延续,在阅读本文之前建议先快速阅读一下《InnoDB Page结构详解》

创建表结构,插入三条数据

Root@mysqldb 11:01: [xucl]> show create table t\G*************************** 1. row *************************** Table: tCreate Table: CREATE TABLE `t` ( `id` int(11) NOT AUTO_INCREMENT, `c1` varchar(10) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb41 row in set (0.00 sec)
root@mysqldb 11:01: [xucl]> select * from t; ---- ------ | id | c1 | ---- ------ | 1 | a || 2 | || 3 | a | ---- ------ 3 rows in set (0.00 sec)

用ue打开t.ibd文件,为什么用ue呢,我觉得ue是观察16进制文件最好的工具了,hexdump由于大小端的原因,看起来太费劲了。

sec文件用什么方式打开,如何下载sec上的文件(1)

page no=3是第一个数据页,那么我们从0000c000到00010000之间就是我们这个数据页所有的数据了。

整理一下得到如下:

0 1 2 3 4 5 6 7 8 9 a b c d e fc000 38 AD C1 F5 00 00 00 03 FF FF FF FF FF FF FF FFc010 00 00 00 11 4E 07 B2 CA 45 BF 00 00 00 00 00 00c020 00 00 00 00 04 D2 00 02 00 C1 80 05 00 00 00 00c030 00 AF 00 02 00 02 00 03 00 00 00 00 00 00 00 00c040 00 00 00 00 00 00 00 00 08 48 00 00 04 D2 00 00c050 00 02 00 F2 00 00 04 D2 00 00 00 02 00 32 01 00c060 02 00 1C 69 6E 66 69 6D 75 6D 00 02 00 0B 00 00c070 73 75 70 72 65 6D 75 6D 01 00 00 00 10 00 18 80c080 00 00 01 00 00 00 0C 81 E7 B5 00 00 00 05 01 10c090 61 01 00 00 18 00 18 80 00 00 02 00 00 00 0C 81c0a0 E8 B6 00 00 00 05 01 10 01 00 00 00 20 FF C1 80 c0b0 00 00 03 00 00 00 0C 81 E9 B7 00 00 00 05 01 10c0c0 61................................fff0 00 00 00 00 00 70 00 63 38 AD C1 F5 4E 07 B2 CA

先看File Header 38字节

再看Page Header 56字节

最大最小虚拟记录:

infimum:01 00 02 00 1C 69 6E 66 69 6D 75 6D 00

supremum:02 00 0B 00 00 73 75 70 72 65 6D 75 6D

用户记录:

为了表示得更加清楚,我把两条虚拟记录位置也标注出来

c063->99infimum:01 00 02 00 1C |69 6E 66 69 6D 75 6D 00

c070->112supremum:02 00 0B 00 00 73 75 70 72 65 6D 75 6D

record1:

c07f>12701 00 00 00 10 00 18 |80 00 00 01 |00 00 00 0C 81 E7 |B5 00 00 00 05 01 10 |61

record2:

c097->15101 00 00 18 00 18 |80 00 00 02 |00 00 00 0C 81 E8 |B6 00 00 00 05 01 10 |

record3:

c08f->17501 00 00 00 20 FF C1 |80 00 00 03 |00 00 00 0C 81 E9 |B7 00 00 00 05 01 10 |61

Page Directory:

00 70 00 63 page directory是倒序存储的,因此00 63是最初行的相对位置,即c063,也就是infimum记录的起始位置,00 70对应位置0c70,对应supremum的起始位置

page tailer

额外实验

root@mysqldb 15:34: [xucl]> show create table t\G*************************** . row *************************** Table: tCreate Table: CREATE TABLE `t` ( `id` int(11) NOT AUTO_INCREMENT, `c1` varchar(10) DEFAULT , `c2` varchar(10) DEFAULT , PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8mb4 row in set (0.00 sec)
root@mysqldb 15:34: [xucl]> select * from t; ---- ------ ------ | id | c1 | c2 | ---- ------ ------ | 1 | a | || 2 | a | a || 3 | | | ---- ------ ------ rows in set (0.00 sec)

提取用户记录部分

01 02 |00 00 10 00 1A |80 00 00 01 00 00 00 0C 81 ED BA 00 00 00 05 01 10 |61 01 01 00 |00 00 18 00 19 |80 00 00 02 00 00 00 0C 81 F5 C0 00 00 00 05 01 10 |61 6103 |00 00 20 FF BE |80 00 00 03 00 00 00 0C 81 FD A6 00 00 00 05 01 10 |

为了观察和变长字段,我额外做了一个实验

上次遗留问题,关于heap_top如何计算出来?

heaptop的其实就是最后一条记录往后第一个free的位置,加入最后一条记录的偏移量为189,假设最后一行的长度为32字节(5字节record header 27字节),那么heaptop就是189 27=216了。

总结

  1. 简直手把手教了如何通过ue或者hexdump来观察innodb page结构

  2. 肉眼查看确实比较费力,建议还是使用专业工具

  3. 通过这种方法,能够对innodb page有更加深入的理解,例如上次遗留的问题就通过这次实验解惑了

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.