系统表空间
系统表空间的作用
- 存系统表中的数据
- 存数据字典————保存系统变量和状态变量
- 存变更缓冲区中未来得及落盘的数据
系统表空间文件位置
系统表可以对应磁盘上的多个表空间文件,默认情况下服务器在数据目录下创建一个名为ibdata1的文件
可以通过改变系统变量innodb_data_home_dir来自定义文件目录
配置系统表空间
系统表空间文件的大小和数量可以根据系统变量 innodb_data_file_path 决定
通过查看系统变量,可以发现默认情况的下系统表空间初始大小为12MB
其中autoextend代表允许系统表空间动态扩容
还有一个max关键字用于修饰系统表空间的最大空间
需要注意的是,autoextend、max只可以用于修饰最后一个表空间文件
例如innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend:max:500M
只代表ibdata2文件可以动态扩容至500M
独立表空间
独立表空间作用
独立表空间包含单个Innodb表的数据和索引,默认情况下每一个张表都对应一个表空间数据文件,便于维护,减少表与表之间的耦合关系。
独立表空间文件位置
独立表空间文件在数据目录下名为database_name目录中,以.ibd为后缀
当在name为chx的数据库下创建了三张表
可以看到在相应的磁盘位置生成了关于这三张表的独立表空间文件
独立表空间的优劣
优点:
- 删除独立表空间中表时,磁盘空间会返回给操作系统,提高磁盘利用率。反观系统表空间,它不会将多余的空间返还给操作系统,而是独占这一部分磁盘空间。这也是为什么非常不建议关闭独立表空间,因为这会使得磁盘利用率越来越低。
- 可以在其他目录上单独创建独立表空间文件,达到IO优化,文件备份的目的,提高效率和可靠性
- 独立表空间相比于系统表空间容量更大
缺点:
- 每一个表都会有未使用的空间,这些空间由于其独占性,管理不当的情况下会导致空间浪费,引起磁盘碎片
- 操作系统需要花费更多的成本去管理大量的独立表空间文件
- 扩容增量不可控制,始终以4MB为增量扩容
撤销表空间
撤销表空间就是用来管理事物所产生的撤销日志的,其具体文件对应数据目录下的undo文件,要想理清楚撤销表空间,就需要清楚什么是撤销日志
撤销日志
撤销日志(undo log)用于保证事务的原子性操作,当一个事务进行rollback操作是需要放弃已经修改的部分回到上一个版本,这就需要借助撤销日志中存储的旧版本信息进行恢复了。
撤销日志何时写入:
事务进行DML操作之前,服务器就会生成一条undolog用于保存当前版本数据,待撤销日志成功写入时才会将数据进行修改
撤销表管理日志
撤销表通过三级结构的方式对日志进行管理,从上至下依次为回滚日志、undo槽、撤销日志段
撤销日志段中保存多个事务的撤销日志,由undo页构成
undolog格式
一条undo日志主要记录了undo类型,表ID,上一版本,下一版本的地址,以及所对应的修改操作
undo type:
撤销日志类型大体分为三类:新增(insert)、删除(delete)、修改(update)
新增类型的撤销日志只需要记录主键信息
删除类型的撤销日志和修改类型的撤销日志不仅需要记录主键信息,还需要记录版本信息
undo页的组织:
像普通的数据页一样,undo页通过页头所保存的信息快速定位到某个事务的undolog
undo日志何时删除:
对于新增类型的undo日志,在事务提交之后可以直接删除
对于删除和修改类型的undo日志不可以直接删除,而是要将其推入history链表中,原因是因为可能有其他事务正在访问该条数据,事务所看到的数据版本可能是不一致的,只有当与该条数据的所有事务都提交后才可以进行删除。
双写缓冲区
双写缓冲区是磁盘上的⼀个存储区域,当 InnoDB 将缓冲池中的数据⻚写⼊到磁盘上表空间数据⽂件之前,先将对应的⻚写到双写缓冲区;如果在数据真正落盘的过程中出现了意外退出,⽐如操作系统、存储⼦系统崩溃或异常断电的情况, InnoDB 在崩溃恢复时可以从双写缓冲区中找到⼀份完好的⻚副本
重做日志
重做⽇志在保证事务的持久性和⼀致性⽅⾯起到了⾄关重要的作⽤
重做⽇志⽤于在数据库崩溃后恢复已提交事务还没有来的及落盘的数据。重做⽇志以⽂件的形式保
存在磁盘上,在正常的操作过程中,MySQL根据受影响的记录进⾏编码并写⼊重做⽇志⽂件,这些
数据称为"Redo",在重新启动时⾃动读取重做⽇志进⾏数据恢复。
redolog的作用:
对数据进⾏的DML操作都会包含在事务当中,当完成修改并且提交事务之后,在内存中被修改的数据⻚就要刷新到磁盘完成持久化;
那么如果这次DML操作对应的修改开始刷盘的话,当服务器崩溃,没有被刷到磁盘的数据⻚就从内存中丢失,这时这个事务的修改在磁盘上就是不完整的,也就是没有保证事务的⼀致性。
为了解决这个问题,InnoDB在执⾏每个DML操作时,当内存中的数据⻚修改完成之后,把修改的内容以⽇志的形式保证在磁盘上,然后再对数据⻚进⾏真正的落盘操作,这样做就相当于对修改进⾏了⼀次备份,即使当服务器崩溃也不会受到影响,当服务器重启之后,可以从磁盘上的⽇志⽂件中找到上次崩溃之前没有来的及落盘的数据继续执⾏落盘操作。
InnoDB引擎的事务采⽤了 WAL技术(Write-Ahead Logging) ,基本思想是先写⽇志,再写磁盘,只有⽇志写⼊成功,事务才算提交成功,这⾥的⽇志就是Redo Log。当发⽣宕机且数据未刷到磁盘的时候,可以通过Redo Log来恢复,保证ACID中的持久性,这也是Redo Log的作⽤。
通用表空间
通用表空间的作用
1、节省磁盘空间,通过共享同一个表空间,可以减少磁盘上的文件数量,使得磁盘管理更加简单。(当独立表空间中数据非常少时,可以通过通用表空间优化)
2、便于管理,当有多个表需要同时进行维护操作(如备份、恢复等)时,使用通用表空间可以使这些操作更加容易执行。
3、提高性能,某些情况下,通过将经常一起访问的表放在同一个表空间内,可能会提高并发访问时的性能,因为减少了操作系统层面的文件切换开销。
临时表空间
临时表空间的作用
临时表空间存放临时数据,一般存储在复杂查询或计算的过程中产生的中间表,例如进行笛卡尔积的时候,就会生成临时表。
这些临时表有时候可能会多次被使用到或者是极为庞大,大到内存不可以存下全部。那么这些临时数据就需要落盘保存,后续使用时可以避免重复计算。