MySQL · 引擎特性 · InnoDB 文件系统之文件物理结构

综述

从上层的角度来看,InnoDB层的文件,除了redo日志外,基本上具有相当统一的结构,都是固定block大小,普遍使用的btree结构来管理数据。只是针对不同的block的应用场景会分配不同的页类型。通常默认情况下,每个block的大小为 UNIV_PAGE_SIZE,在不做任何配置时值为16kb,你还可以选择在安装实例时指定一个块的block大小。对于压缩表,可以在建表时指定block size,但在内存中表现的解压页依旧为统一的页大小。

从物理文件的分类来看,有日志文件、主系统表空间文件ibdata、undo tablespace文件、临时表空间文件、用户表空间。

由于数据库需要保证数据的完整性,因此在OS系统上封装了自己的文件系统。我们来看一张图,这样也能更好的理解innodb数据库的文件结构

首先看一下页(page)的结构

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

  1. Checksum为校验和,和磁盘打交道的程序为了保证数据正确性,都必须使用校验和,目的是验证因为磁盘空间损坏导致数据损坏;
  2. offset(Page Number)为页的序号,即偏移量;
  3. Previous Page和Next Page InnoDB的数据在内存缓冲区是由B+树组织的,而B+树中的每一层的页是由双向链表串起来,因为每个页header有指向上一个和下一个页的指针;这种结构可以提升全表扫描的效率;
  4. LSN for last page modification LSN如果不懂,可以查看InnoDB存储引擎这本书,简单说就是用于表示刷新到重做日志数据量,可用于重做日志恢复数据库.
  5. Page Type 即页的类型,页的类型决定了这个页其他部分存储的数据,常见的页类型有数据业,undo页,系统页等等;
  6. space id 即这个页属于的表空间
  7. flush LSN 这个值存储了刷新到整个系统任何页的最大LSN值.

接下来我们来看一下表空间(Tablespace)的一些基础知识

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

当然共享表空间ibdata和用户表空间是不一样的,因为它需要存储更多全局的一些信息,例如doublewrite,undo等等,所以共享表空间拥有更多的段,这里先分析用户表空间.

每个表空间都有一个唯一space id,因为很多地方都需要使用到这个id,例如内存数据刷到磁盘时,需要使用这个space id来寻找表空间文件.InnoDB总有一个"系统空间",即共享表空间,这个表系统表空间的space id始终为0.

表空间结构

一个表空间文件是由一系列的页组成的,页数量最多可达2^32个.为了更好管理页,页又按1MB(64个连续的页)分为组,这个组称为区,InnoDB一般情况下是按区来给段分配空间.

为了管理表空间所有页,区以及表空间自己,Innodb必须使用一些数据结构来跟踪保存页区等信息,下图展示了一个表空间的示意图:

每一个表空间的第一个页为FSP_HDR(file space header)页,这个页保存了FSP header结构,这个结构保存了这个表空间的大小,以及完全没有被使用的extents,fragment的使用情况,以及inode使用情况等等,接下来详细介绍.

第1个页只能保存256个extents,也就是16384个页,256MB.因此每隔16384个页必须分配一个新的页来保存接下来的16384个页的信息,这个页就是XDES页,这个XDES页和第1个页除了FSP_HDR结构置0外(因为第一个page已经包含了base list,所以后面的XDES page 的FSP_HDR结构置0),其他都一样.

第二个页IBUF_BITMAP这个页就是插入缓存bitmap页,用于记录插入缓冲区的一些信息.

第三个页是inode页,该页用一个链表存储表空间中所有段(file segments);之前说段是由若干个extents组成,其实段除了extents之外,还有32个单独分配的"碎片"页组成,因为有些段可能用不到一个区,所以这里主要是为了节省空间.

FSP_HDR PAGE

数据文件的第一个Page类型为FIL_PAGE_TYPE_FSP_HDR,在创建一个新的表空间时进行初始化(fsp_header_init),该page同时用于跟踪随后的256个Extent(约256MB文件大小)的空间管理,所以每隔256MB就要创建一个类似的数据页,类型为FIL_PAGE_TYPE_XDES ,XDES Page除了文件头部外,其他都和FSP_HDR页具有相同的数据结构,可以称之为Extent描述页,每个Extent占用40个字节,一个XDES Page最多描述256个Extent。

时间: 2024-10-09 22:33:18

MySQL · 引擎特性 · InnoDB 文件系统之文件物理结构的相关文章

MySQL ·InnoDB 文件系统之文件物理结构

从上层的角度来看,InnoDB层的文件,除了redo日志外,基本上具有相当统一的结构,都是固定block大小,普遍使用的btree结构来管理数据.只是针对不同的block的应用场景会分配不同的页类型.通常默认情况下,每个block的大小为 UNIV_PAGE_SIZE,在不做任何配置时值为16kb,你还可以选择在安装实例时指定一个块的block大小.对于压缩表,可以在建表时指定block size,但在内存中表现的解压页依旧为统一的页大小. 从物理文件的分类来看,有日志文件.主系统表空间文件ib

MySQL · 引擎特性 · InnoDB 事务系统

MySQL · 引擎特性 · InnoDB 事务系统 前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事务的回滚,多版本控制,垃圾清理,回滚段以及相应的参数和监控方法.代码主要基于RDS 5.6,部分特性已经开源到AliSQL.事务系统是InnoDB最核心的中控系统,涉及的代码比较多,主要集中在trx目录,read目录以及row目录中的一部分,包括

MySQL · 引擎特性 · InnoDB 崩溃恢复过程

MySQL · 引擎特性 · InnoDB 崩溃恢复过程 在前面两期月报中,我们详细介绍了 InnoDB redo log 和 undo log 的相关知识,本文将介绍 InnoDB 在崩溃恢复时的主要流程. 本文代码分析基于 MySQL 5.7.7-RC 版本,函数入口为 innobase_start_or_create_for_mysql,这是一个非常冗长的函数,本文只涉及和崩溃恢复相关的代码. 在阅读本文前,强烈建议翻阅我们之前的两期月报:1. MySQL · 引擎特性 · InnoDB

MySQL · 引擎特性 · InnoDB redo log漫游(转)

前言 InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性. 和大多数关系型数据库一样,InnoDB记录了对数据文件的物理更改,并保证总是日志先行,也就是所谓的WAL,即在持久化数据文件前,保证之前的redo日志已经写到磁盘. LSN(log sequence number) 用于记录日志序号,它是一个不断递增的 unsigned long long 类型整数.在 InnoDB 的日志

浅谈MYSQL引擎之INNODB引擎

MYSQL 常用的引擎主要有一下几种,MRG_MYISAM .CSV .MyISAM.InnoDB.MEMORY ,NDB,其中MyISAM.InnoDB是mysql最常用的存储引擎,今天主要讨论 InnoDB引擎. 一.什么是InnoDB引擎 InnoDB引擎是MYSQL数据库的另一个重要的额存储引擎,正成为目前MYSQL AB所有发行新版的标准,被包含在所有二进制安装包里. 和其他的存储引擎相比,InnoDB引擎的优点支持兼容ACID的事物,以及参数完整性(即对外建的支持). MYSQL5.

合买源码搭建建与MySQL · 引擎特性

一 序本文根据<MYSQL运维内参>第11章INNODB日志管理机制整理,本篇书上侧重于原理说明日志的生成.格式.工作原理.刷盘机制等.限于篇幅,崩溃恢复的需要单独整理.InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性.解释下redolog与事务持久性:redo log用来数据异常恢复和数据库重启时页数据同步恢复,redo log是建立在在mini transaction基础上.

MySQL · 引擎特性 · WAL那些事儿

摘要: 前言 日志先行的技术广泛应用于现代数据库中,其保证了数据库在数据不丢的情况下,进一步提高了数据库的性能.本文主要分析了WAL模块在MySQL各个版本中的演进以及在阿里云新一代数据库POLARDB中的改进.前言日志先行的技术广泛应用于现代数据库中,其保证了数据库在数据不丢的情况下,进一步提高了数据库的性能.本文主要分析了WAL模块在MySQL各个版本中的演进以及在阿里云新一代数据库POLARDB中的改进. 基础知识用户如果对数据库中的数据就行了修改,必须保证日志先于数据落盘.当日志落盘后,

MYSQL新特性secure_file_priv读写文件 outFile导出数据

1290 – The MySQL server is running with the –secure-file-priv option so it cannot execute this statement secure-file-priv特性 secure-file-priv参数是用来限制LOAD DATA, SELECT - OUTFILE, and LOAD_FILE()传到哪个指定目录的. ure_file_priv的值为null ,表示限制mysqld 不允许导入|导出 当secur

Mysql引擎介绍

Mysql引擎介绍 Innodb存储引擎 支持事务,在OLTP方面支持行级锁.外键: 通过多版本并发控制MVCC来获得高并发性,并实现SQL的4种隔离级别(默认repeatable): 提供insert buffer,double write,自适应hash索引,预读: 对于表中数据的存储,innodb采用clustered.每张表的存储按照主键的顺序存放:若表没有显式定义主键,innodb会为每一行生成一个6字节的rowid,作为主键. Myisam存储引擎 不支持事务,表锁,全文索引,对OL