MySQL表frm⽂件解析
MySQL表frm⽂件解析
说明:
以下所有说明都以 MySQL 5.7.25 源码为例 ,存储引擎为InnoDB。
mysql存储文档
MySQL .frm⽂件格式
MySQL会为每⼀个table在磁盘上创建⼀个.frm格式尾缀的⽂件,作为表定义⽂件,该⽂件与表名⼀致。
⾸先,创建⼀个表:
mysql>create table t1 (
a int not null comment'comment on column a',
b int default5comment'comment on column b',
primary key(a),
key idx_a(a),
key idx_b(b),
key idx_a_b(a,b),
key idx_b_comment(b)comment'comment on key b'
)engine=innodb;
每个表的.frm⽂件会在mysql安装的data⽬录下,可以查看变量datadir查看具体路径。
mysql>select @@datadir;
+--------------------------------------------------+
| @@datadir|
+--------------------------------------------------+
|/opt/mysql/mysql-5.7.25/mysql/data/|
+--------------------------------------------------+
确定table的具体database
mysql>select database();
+--------------------+
|database()|
+--------------------+
|innodb|
+--------------------+
每个database的table的.frm⽂件会创建在datadir/database_name/路径下,进⼊/opt/mysql/mysql-5.7.25/mysql/data/ innodb可以查看到:
shell>su root
shell>cd /opt/mysql/mysql-5.7.25/mysql/data/ innodb
shell>ls t1.*
table1.frm  table1.MYD  table1.MYI
shell>ls -l t1.*
-rw-rw----  1 root root  8578 May 28 20:31 t1.frm
-rw-rw----  1 root root 98304 May 28 20:31 t1.ibd
使⽤vi打开并且切换到命令模式,输⼊!xxd -g 1即可查看单字节的⼗六进制编码结果,也可以⽤hexdump查看。
表1 .frm ⽂件头部 Header 段区域
Tips:
下列表格属性说明:
偏移:.frm⽂件头偏移量
长度:字节个数
值:属性值
描述:简明描述
偏移长度值描述
00001FE固定值
0001101固定值
0002109FRM_VER+3+ MY_TEST(create_info->varchar)
FRM_VER(6) (#define FRM_VER @DOT_FRM_VERSION@) )
DOT_FRM_VERSION(cmake/ake) SET(DOT_FRM_VERSION “6”)
000310c InnoDB引擎(DB_TYPE数据库引擎类型,enum legacy_db_type)0004103固定值 (代码中0x01)
偏移长度值描述
0005100固定值
000620010IO_SIZE(拼成:0x1000=4096)
000820100
000a400300000(IO_SIZE+key_length+reclength+ create_info->extra_size)
000e2df06tmp_key_length=key_length(key_length的计算公式在表格下⽅ )
001020900reclength
0012400000000create_info->max_rows
0016400000000create_info->min_rows
001B102固定值(Use long pack-fields)
001C2a200key_info_length
001e20800create_info->table_options also known as db_create_options? one possible option is HA_LONG_BLOB_PTR 0020100固定值
0021105固定值(Mark for 5.0 frm file)
0022400000000create_info->avg_row_length
002612e create_info->default_table_charset (utf8mb4)
0027100固定值
0028100create_info->row_type
0029600…00固定值(RAID support)
002f4df060000key_length
0033425c600MYSQL_VERSION_ID(50725[C625])mysql_version.h
003741f000000create_info->extra_size
003b20000Reserved for extra_rec_buf_length
003d100Reserved for default_part_db_type, but 09 if MyISAM with partitioning
003e20000create_info->key_block_size
0040
key_length = keys * (8 + MAX_REF_PARTS * 9 + NAME_LEN + 1) + 16 + key_comment_total_bytes
每⼀个索引:
8位作为key header
9位留给每⼀个索引的每⼀个列field
NAME_LEN为索引索引名称
最后的16代表:6位作为header,1位作为分隔符’\0’,9位预留?对齐?
keys: 表索引个数
MAX_REF_PARTS: 单个索引⽀持最多列数(16个)
NAME_LEN: =(NAME_CHAR_LEN*SYSTEM_CHARSET_MBMAXLEN)
NAME_CHAR_LEN: 64位,表名、列名长度
SYSTEM_CHARSET_MBMAXLEN: 3,系统字符集最⼤长度
key_comment_total_bytes: 16,⽆comment
所以key_length = 5*(8+16*9+64*3+1)+16+16 + 2 = 706 = 0x6df。
表2 .frm 索引 Key 信息段区域
根据头部 Header 信息中的 0004 中的 IO_SIZE 作偏移⼀个 IO_SIZE,即为索引 keys 信息区域。此处 IO_SIZE ⼤⼩为 4096;
偏移长度值描述
1000105索引个数,此处为有 5 个索引
1000106索引列数⽬,总共 5 个索引有 6 个索引列

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。