InnoDB 文件系统管理

1. linux文件系统

文件系统的层次结构

            

Linux VFS(Virtual File System 又称 Virtual Filesystem Switch),即虚拟文件系统。VFS 作为一个通用的文件系统,抽象了文件系统的四个基本概念:文件、目录项 (dentry)、索引节点 (inode) 及挂载点,其在内核中为用户空间层的文件系统提供统一的API访问接口。VFS 实现了 open()、read() 等系统调并使得 cp 等用户空间程序可跨文件系统。

 

Linux文件系统基本概念

1扇区(sector)=512字节(byte)

1数据块(block)=8扇区=4KB(mkfs时指定,默认4KB,可设置为1KB - 64KB)

(如ext2、ext3、ext4等)将硬盘分区时会划分出目录块、inode Table区块和data block数据区域。一个文件由一个目录项、inode和数据区域块组成。Inode包含文件的属性(如读写属性、owner等,以及指向数据块的指针),数据区域块则是文件内容。当查看某个文件时,会先从inode table中查出文件属性及数据存放点,再从数据块中读取数据。

文件存储结构大概如下:
         

 

  1)、superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与是否已被挂载、挂载的时间等相关信息。
  2)、inode table:记录文件的属性信息,可以使用stat命令查看inode信息。
  3)、data block:实际文件的内容,如果一个文件大于一个块时候,那么将占用多个block,但是一个块只能存放一个文件。
  4)、data block bitmap:记录哪些block是未使用的,哪些是已被使用,1:已使用,0:未使用。
  5)、Inode bitmap:记录哪些inode节点是未使用的,哪些是已被使用,1:已使用,0:未使用。

文件系统如何存取文件的:
     1)、根据文件名,通过Directory里的对应关系,找到文件对应的Inodenumber
     2)、再根据Inodenumber读取到文件的Inodetable
     3)、再根据Inodetable中的Pointer读取到相应的Blocks
这里有一个重要的内容,就是Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件/目录名称对应的Inodenumber。

 

 
2. InnoDB的存储结构
       InnoDB 表空间是在文件系统之上又构建的一层逻辑存储的文件管理系统。除了redo日志外,表空间,undo都以Page的形式管理。普遍使用的btree结构来组织数据。只是针对不同的block的应用场景会分配不同的Page类型。
       InnoDB 最小读写单位是 Page,page 采用默认的 16K。
  物理文件分类,有日志文件、主系统表空间文件ibdata、undo tablespace文件、临时表空间文件、用户表空间。

2.1 表空间(Tablespace)的一些基础知识

表空间是分段管理的,假如有一个表只有一个主键索引,那么这个表就有两个段,一个是内部节点段,即非叶子节点段,还有一个是叶子段,即存储数据的节点.如果一个表除了主键索引,还有一个辅助索引,那么这个这个表空间有四个段,主键内部节点段,主键叶子节点段,辅助索引内部节点段,辅助索引叶子节点段.InnoDB存储引擎有有一张图很好展示了段,区,页的关系:

 2.2 Innodb page结构

一个表空间文件都是由一个一个16kb的页组成,每个页都有一个32位序号(page number),通常称为偏移量,即离表空间初始位置的偏移量.因为每个页大小为16kb,所以第0个页的偏移量为0,第一个页的偏移量为16384等等.因为32位的最大值为2^32,所以一个表空间的最大值为2^32*16kb=64TB。

ibd文件中真正构建起用户数据的结构是BTREE,在你创建一个表时,已经基于显式或隐式定义的主键构建了一个btree,其叶子节点上记录了行的全部列数据(加上事务id列及回滚段指针列);如果你在表上创建了二级索引,其叶子节点存储了键值加上聚集索引键值。

每个btree使用两个Segment来管理数据页,一个管理叶子节点,一个管理非叶子节点,每个segment在inode page中存在一个记录项,在btree的root page中记录了两个segment信息。

当我们需要打开一张表时,需要从ibdata的数据词典表中load元数据信息,其中SYS_INDEXES系统表中记录了表,索引,及索引根页对应的page no(DICT_FLD__SYS_INDEXES__PAGE_NO),进而找到btree根page,就可以对整个用户数据btree进行操作。

上图描述了表空间、INODE页面、INODE、段、簇、页面之间的关系,也是innodb文件系统管理架构图。

 

   ibd文件解析工具

  https://github.com/sryanyuan/innoisp

 

 

参考

https://blog.51cto.com/59090939/1955122

https://blog.csdn.net/yuanrxdu/article/details/41925279

http://mysql.taobao.org/monthly/2016/02/01/

http://linux.vbird.org/linux_basic/0230filesystem.php

https://blog.csdn.net/shanshanpt/article/details/38943731

https://www.jianshu.com/p/f6bb7088b3b0

 

posted @ 2019-04-19 22:18  雨中海  阅读(413)  评论(0编辑  收藏  举报