• 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

  • 相关阅读:
    CentOS_关机与重启命令详解
    去除ArrayList重复的对象
    单项设计模式
    死循环的应用
    java学习心得-面向对象与面向过程
    计算机使用个人经验及日常维护
    linux操作系统简介
    集合
    项目学习4
    周末总结
  • 原文地址:https://www.cnblogs.com/ijia/p/10739192.html
Copyright © 2020-2023  润新知