任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其他技术的关键技术,学习这些底层技术,就可以一通百通,让你很快的掌握其他技术。如何在磁盘上存储数据,如何使用日志文件保证数据不丢失以及如何落盘,不仅是MySQL等数据库的关键技术,也是MQ消息队列或者其他中间件的关键技术之一。

InnoDB整体架构

上图详细显示了InnoDB存储引擎的体系架构,从图中可见,InnoDB存储引擎由内存池,后台线程和磁盘文件三大部分组成。接下来我们就来简单了解一下磁盘文件相关的概念和原理。    InnoDB的主要的磁盘文件主要分为三大块:一是系统表空间,二是用户表空间,三是redo日志文件和归档文件。二进制文件(binlog)等文件是MySQL Server层维护的文件,所以未列入InnoDB的磁盘文件中。

系统表空间和用户表空间

InnoDB系统表空间包含InnoDB数据字典(元数据以及相关对象)并且doublewrite buffer,change buffer,undo logs的存储区域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。系统表空间是一个共享的表空间因为它是被多个表共享的

系统表空间是由一个或者多个数据文件组成。默认情况下,1个初始大小为10MB,名为ibdata1的系统数据文件在MySQL的data目录下被创建。用户可以使用innodb_data_file_path对数据文件的大小和数量进行配置。

innodb_data_file_path的格式如下:

innodb_data_file_path=datafile1[,datafile2]...

用户可以通过多个文件组成一个表空间,同时制定文件的属性:

innodb_data_file_path = /db/ibdata1:1000M;/dr2/db/ibdata2:1000M:autoextend

这里讲/db/ibdata1和/dr2/db/ibdata2两个文件组成系统表空间。如果这两个文件位于不同的磁盘上,磁盘的负载可能被平均,因此可以提高数据库的整体性能。两个文件的文件名之后都跟了属性,表示文件ibdata1的大小为1000MB,文件ibdata2的大小为1000MB,而且用完空间之后可以自动增长(autoextend)。

设置innodb_data_file_path参数之后,所以基于InnoDB存储引擎的表的数据都会记录到该系统表空间中,如果设置了参数innodb_file_per_table,则用户可以将每个基于InnoDB存储引擎的表产生一个独立的用户表空间。用户表空间的命名规则为:表名.ibd。

通过这种方式,用户不用将所有数据都存放于默认的系统表空间中,但是用户表空只存储该表的数据、索引和插入缓冲BITMAP等信息,其余信息还是存放在默认的表空间中。

InnoDB表存储引擎文件

上图显示InnoDB存储引擎对于文件的存储方式,其中frm文件是表结构定义文件,记录每个表的表结构定义。

重做日志文件和归档文件

默认情况下,在InnoDB存储引擎的数据目录下会有两个名为ib_logfile0和ib_logfile1的文件,这就是InnoDB的重做日志文件(redo log fiel),它记录了对于InnoDB存储引擎的事务日志。

当InnoDB的数据存储文件发生错误时,重做日志文件就能派上用场。InnoDB存储引擎可以使用重做日志文件将数据恢复为正确状态,以此来保证数据的正确性和完整性。

每个InnoDB存储引擎至少有1个重做日志文件组(group),每个文件组下至少有2个重做日志文件,如默认的ib_logfile0和ib_logfile1。

为了得到更高的可靠性,用户可以设置多个镜像日志组,将不同的文件组放在不同的磁盘上,以此来提高重做日志的高可用性。

在日志组中每个重做日志文件的大小一致,并以循环写入的方式运行。InnoDB存储引擎先写入重做日志文件1,当文件被写满时,会切换到重做日志文件2,再当重做日志文件2也被写满时,再切换到重做日志文件1。

用户可以使用innodb_log_file_size来设置重做日志文件的大小,这对InnoDB存储引擎的性能有着非常大的影响。

如果重做日志文件设置的太大,数据丢失时,恢复时可能需要很长的时间;另一方面,如果设置的太小,重做日志文件太小会导致依据checkpoint的检查需要频繁刷新脏页到磁盘中,导致性能的抖动。

重做日志相关和Checkpoint的机制可以阅读我之前文章的相应章节。MySQL探秘(三):InnoDB的内存结构和特性

重做日志的落盘机制

InnoDB对于数据文件和日志文件的刷盘遵守WAL(Write ahead redo log) 和Force-log-at-commit两种规则,二者保证了事务的持久性。WAL要求数据的变更写入到磁盘前,首先必须将内存中的日志写入到磁盘;Force-log-at-commit要求当一个事务提交时,所有产生的日志都必须刷新到磁盘上,如果日志刷新成功后,缓冲池中的数据刷新到磁盘前数据库发生了宕机,那么重启时,数据库可以从日志中恢复数据。

写入机制

如上图所示,InnoDB在缓冲池中变更数据时,会首先将相关变更写入重做日志缓冲中,然后再按时或者当事务提交时写入磁盘,这符合Force-log-at-commit原则;当重做日志写入磁盘后,缓冲池中的变更数据才会依据checkpoint机制择时写入到磁盘中,这符合WAL原则。

在checkpoint择时机制中,就有重做日志文件写满的判断,所以,如前文所述,如果重做日志文件太小,经常被写满,就会频繁导致checkpoint将更改的数据写入磁盘,导致性能抖动。

操作系统的文件系统是带有缓存的,当InnoDB向磁盘写入数据时,有可能只是写入到了文件系统的缓存中,没有真正的“落袋为安”。

InnoDB的innodb_flush_log_at_trx_commit属性可以控制每次事务提交时InnoDB的行为。当属性值为0时,事务提交时,不会对重做日志进行写入操作,而是等待主线程按时写入;当属性值为1时,事务提交时,会将重做日志写入文件系统缓存,并且调用文件系统的fsync,将文件系统缓冲中的数据真正写入磁盘存储,确保不会出现数据丢失;当属性值为2时,事务提交时,也会将日志文件写入文件系统缓存,但是不会调用fsync,而是让文件系统自己去判断何时将缓存写入磁盘。日志的刷盘机制如下图所示。

log刷盘机制

innodb_flush_log_at_commit是InnoDB性能调优的一个基础参数,涉及InnoDB的写入效率和数据安全。当参数值为0时,写入效率最高,但是数据安全最低;参数值为1时,写入效率最低,但是数据安全最高;参数值为2时,二者都是中等水平。一般建议将该属性值设置为1,以获得较高的数据安全性,而且也只有设置为1,才能保证事务的持久性。

mysql 文件放网络盘_MySQL InnoDB的磁盘文件及落盘机制相关推荐

  1. MySQL探秘(四):InnoDB的磁盘文件及落盘机制(持久性)

    任何一个技术都有其底层的关键基础技术,这些关键技术很有可能也是其他技术的关键技术,学习这些底层技术,就可以一通百通,让你很快的掌握其他技术.如何在磁盘上存储数据,如何使用日志文件保证数据不丢失以及如何 ...

  2. mysql数据刷盘_MySQL延迟问题和数据刷盘策略

    一. MySQL 复制流程 官方文档流程图如下: 1.绝对的延时,相对的同步 2.纯写操作,线上标准配置下,从库压力大于主库,最起码从库有relaylog的写入. 二.MySQL延迟问题分析 1.主库 ...

  3. mysql数据刷盘_MySQL InnoDB 日志管理机制中的MTR和日志刷盘

    1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...

  4. mysql idata有什么用_mysql InnoDB idata1文件损坏,单个恢复表格数据

    服务器异常断电,导致mysql某一个table .idb文件损坏,在idata1页存在异常损坏: 在开启mysql服务一开启就之后据自动关闭,提示异常服务终端异常: mysql数据维护人员一定要有定时 ...

  5. mysql 网盘_Mysql 免安装教程 百度云网盘有文件和word说明

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建->变量值是解 ...

  6. mysql 设置表的大小_mysql InnoDB建表时设定初始大小的方法

    InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保护数据文件,这就会导致波动. 丁奇的博客说明了这个问题: When I ...

  7. mysql 共享表空间存储_MySQL InnoDB共享表空间

    简介ibdata1 ibdata1文件是InnoDB存储引擎的共享表空间文件,存放位置my.ini 中的 datadir="D:\phpStudy\MySQL\data",目录下. ...

  8. 用命令行连接mysql文件时出现错误_MySQL使用cmd命令窗口安装错误信息提示的解决方法...

    作者:二龙_01 转载自https://blog.csdn.net/ 近期学习使用mysql数据库遇到了一些安装上的问题,自己也上网百度了各种解决方法,其中有适合自己的,也发现了一些人云亦云的解决方法 ...

  9. mysql创建表的默认大小_mysql InnoDB建表时设定初始大小的方法

    InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保护数据文件,这就会导致波动. 丁奇的博客说明了这个问题: When I ...

最新文章

  1. BootstrapValidator验证
  2. 翻转链表python递归_Python实现链表反转的方法【迭代法与递归法】
  3. java 读取文件第一行代码,java文件读取。(单字节读取和按行读取读取)
  4. 网约车司机无证最低罚款拟从10000元降至200元
  5. Interllij IDEA启动Jrebe因为中文路径失败
  6. JavaScript 颜色梯度和渐变效果
  7. 马化腾:腾讯的梦想是“三张网”
  8. python验证码识别——前处理
  9. python自建模块_python导入自建模块的问题
  10. mysql数据库巡检方案_美团MySQL数据库巡检系统的设计与应用
  11. CAD2020软件安装教程【搬运】
  12. 罗技 无线鼠标 USB HID数据格式
  13. java word jar包_java操作word书签生成word模板不用jar包
  14. Python练习题答案: 纳特拼音alaphabeta【难度:1级】--景越Python编程实例训练营,1000道上机题等你来挑战
  15. 微信JSAPI支付调不起收银台问题
  16. Ubuntu软件管理工具
  17. x64 可变参数原理完全解析
  18. 《路人甲》 很适合喜欢动脑的人!
  19. java模拟病人就诊过程_模拟医院挂号系统
  20. python定位弹窗_python定位弹窗

热门文章

  1. 利剑无意之JAVA面试题(三)
  2. 异常处理——MysqlCan't connect to local MySQL server through socket '/v ar/lib/mysql/mysql.sock'
  3. leetcode 395. Longest Substring with At Least K Repeating Characters| 395. 至少有 K 个重复字符的最长子串(分治法)
  4. Redis实战(三):Redis的List、Set、Hash、sorted_set、skip list
  5. oracle的scn增量备份,Oracle技术之利用scn增量备份实现数据库增量恢复
  6. JUC锁-CountDownLatch(六)
  7. 1043 输出PATest (20分)_23行代码满分
  8. 【绝对有用】Syntax error on token “throws“, @ expected after this token
  9. 【解题报告+感想感言】2019年第十届蓝桥杯【C++省赛B组】【第五题:迷宫】
  10. 年轻代为什么要设置两个Survivor区