| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> MySQL性能优化(二)InnoDB之日志文件 -> 正文阅读 |
|
[大数据]MySQL性能优化(二)InnoDB之日志文件 |
文章目录1.MySQL日志记录文件1.1.回顾SQL语句的执行在上一篇文章我中,我们着重的介绍了SQL语句执行的一个过程。 1.2.InnoDB内存结构:缓冲池InnoDB存储引擎中有一个非常重要的放在内存里的组件,就是缓冲池(Buffer Pool),这里面会缓存很多的数据,以便于以后在查询的时候,万一你要是内存缓冲池里有数据,就可以不用去查磁盘了。 1.3.记录日志:Undo和Redo1.3.1.Undo日志文件:记录数据修改前的值接着下一步,假设“id=1”这行数据的name原来是“zhangsan”,现在我们要更新为“hutao”,那么此时我们得先把要更新的原来的值“zhangsan”和“id=1”这些信息,写入到undo日志文件中去。 在事务提交之前我们都是可以对数据进行回滚的,也就是把你更新为“hutao”的值回滚到之前的“zhangsan”去。考虑到未来可能要回滚数据的需要,这里会把你更新前的值写入undo日志文件 当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时对他加锁之后,而且还把更新前的旧值写入undo日志文件之后,我们就可以正式开始更新这行记录了,更新的时候,先是会更新缓冲池中的记录,此时这个数据就是脏数据了。 这里所谓的更新内存缓冲池里的数据,意思就是把内存里的“id=1”这行数据的name字段修改为“hutao” 1.3.2.Redo日志文件:记录数据即将修改值redo即redo日志,记录数据库变化的日志。现在已经把内存里的数据进行了修改,但是磁盘上的数据还没修改,那么此时万一MySQL所在的机器宕机了,必然会导致内存里修改过的数据丢失,这可怎么办呢? 如果还没提交事务,MySQL宕机了怎么办 1.3.3.Undo和Redo的区别(记录、前滚、回滚)记录数据区别:
前滚与回滚:
1.3.4.提交事务:Redo日志写入磁盘(刷盘策略)接着我们想要提交一个事务了,此时就会根据一定的策略把redo日志从redo log buffer里刷入到磁盘文件里去。此时这个策略是通过innodb_flush_log_at_trx_commit来配置的(可以配置0、1、2)。 1.3.4.1.trx_commit = 0提交事务的时候,不会把redo log buffer里的数据刷入磁盘文件的,此时可能你都提交事务了,结果mysql宕机了,然后此时内存里的数据全部丢失。相当于你提交事务成功了,但是由于MySQL突然宕机,导致内存中的数据和redo日志都丢失了,我们看下图: 1.3.4.2.trx_commit = 1提交事务的时候,就必须把redo log从内存刷入到磁盘文件里去,只要事务提交成功,那么redo log就 1.3.4.3.trx_commit = 2提交事务的时候,把redo日志写入磁盘文件对应的os cache缓存里去,而不是直接进入磁盘文件,可 1.3.4.4.Redo日志3种刷盘策略对比选择0的话,可能你提交事务之后,mysql宕机,那么此时redo日志没有刷盘,导致内存里的redo日志丢失,你提交的事务更新的数据就丢失了; 选择1的话,也就是说,提交事务的时候,redo日志必须是刷入磁盘文件里的。这样可以严格的保证提交事务之后,数据是绝对不会丢失的,因为有redo日志在磁盘文件里可以恢复你做的所有修改。 选择2的话,如果机器宕机,虽然之前提交事务的时候,redo日志进入os cache了,但是还没进入磁盘文 所以对于数据库这样严格的系统而言,一般建议redo日志刷盘策略设置为1,保证事务提交之后,数据绝对不能丢失。 1.4.归档日志:binlog1.4.1.binlog介绍redo log,他是一种偏向物理性质的重做日志,因为他里面记录的是类似这样的东西,“对哪个数据页中的什么记录,做了个什么修改”。而且redo log本身是属于InnoDB存储引擎特有的一个东西。 而binlog叫做归档日志,他里面记录的是偏向于逻辑性的日志,类似于“对users表中的id=1的一行数据做了更新操作,更新以后的值是什么” 1.4.2.提交事务:写入binlog在我们提交事务的时候,会把redo log日志写入磁盘文件中去。然后其实在提交事务的时候,我们同时还会把这次更新对应的binlog日志写入到磁盘文件中去,如下图所示: 1.4.3.binlog刷盘策略分析对于binlog日志,其实也有不同的刷盘策略,有一个sync_binlog参数可以控制binlog的刷盘策略。 1.4.3.1.sync_binlog = 0他的默认值是0,此时你把binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存。所以跟之前分析的一样,如果此时机器宕机,那么你在os cache里的binlog日志是会丢失的。 1.4.3.2.sync_binlog = 1如果要是把sync_binlog参数设置为1的话,那么此时会强制在提交事务的时候,把binlog直接写入到磁盘文件里去, 1.5.基于binlog和redo log 的commit标记当我们把binlog写入磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redo log日志文件里去,同时在redo log日志文件里写入一个commit标记。在完成这个事情之后,才算最终完成了事务的提交,我们看下图的示意: 1.6.IO线程将内存更新后的脏数据刷回磁盘现在我们假设已经提交事务了,此时更新
他已经把内存里的buffer pool中的缓存数据更新了,同时磁盘里有redo日志和binlog日志,都记录了把我们指定的“id=1”这行数据修改了“name=‘hutao’”。此时我们会思考一个问题了,但是这个时候磁盘上的数据文件里的“id=1”这行数据的name字段还是等于zhangsan这个旧的值啊! 所以MySQL有一个后台的IO线程,会在之后某个时间里,随机的把内存buffer pool中的修改后的脏数据给刷回到磁盘上的数据文件里去。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:25:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |