这篇文章将为大家详细讲解有关Mysql中有哪些日志,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
redo log
重做日志,是在binlog之上,一条update语句执行时,首先会记录一条redo log,然后再由执行器生成binlog日志,redo log是InnoDB存储引擎层的日志。
问题1.redo log 的意义
首先redolog 在最开始的MySQL 存储引擎MyISAM中是没有的,后来由第三方公司开发的插件,也就是INNODB的前身,之后才有Innodb存储引擎,所以redolog是innodb所特有的日志,他的目的是帮助mysql快速记录变更的记录,并且保持数据一直性。所以在MYsql中每次更新和插入数据都需要进行磁盘的存储,这样IO的成本太高,所以为了优化mysql的实时需要刷盘的问题,Innodb采用了先写日志,和更新缓存,然后在机器空闲的时候写入磁盘,这样就就有了redo日志。
问题2:redo 日志的好处?
redo log可以防止mysql数据库异常重启时,可以快速恢复redo log中的数据,将之前已经提交的事务数据恢复到内存中。这也就是mysql的crash-self能力。还有就是redo log相当于一个缓存,先写到缓存,然后再持久化到磁盘,速度相对比较快。
问题3:加入了redo log ,数据一致性如何保证?
有了redo log,binlog写入失败怎么办,所以这就设置到单机一致性问题,一般的我们知道XA协议,就是两阶段提交,在这里也是同样的处理方式。下面有一个简单update语句执行的流程,我们就知道redo log和binlog的写入时机,和数据恢复问题。
binlog有三种格式:Statement、Row以及Mixed
–基于SQL语句的复制(statement-based replication,SBR),
–基于行的复制(row-based replication,RBR),
–混合模式复制(mixed-based replication,MBR)。
1.执行器首先找数据引擎查询需要操作的行,如果该数据所在的数据页就在内存中,则直接返回给执行器,否则需要从磁盘中读取数到内存中,在返回。
2.执行器将操作后待更新的数据调用执行引擎写入新的行数据
3.引擎先更新到内存,同时将更新操作记录到redo log,此时redo log 处于一个准备阶段,然后告诉执行器,执行完成,随时可以提交事务
4.执行器生成这个操作的binlog,并将binlog写入磁盘
5.执行器调用事务提交接口,引擎把刚刚写入的redo log 状态改成提交状态,整个更新操作就完成了。
从整个步骤可以看出,redo log 和binlog 在一次事务中是需要都成功才会保持一致性的。所谓的系统空闲的时候刷盘和binlog是两回事,binlog是事务提交同步就要完成的事情。
undo log有两个作用:提供回滚和多个行版本控制(MVCC),还有为了实现事务的原子性。
在数据修改的时候,不仅记录了redo,还记录了相对应的undo,如果因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。undo log和redo log记录物理日志不一样,它是逻辑日志。可以认为当delete一条记录时,undo log中会记录一条对应的insert记录,反之亦然,当update一条记录时,它记录一条对应相反的update记录。当执行rollback时,就可以从undo log中的逻辑记录读取到相应的内容并进行回滚。有时候应用到行版本控制的时候,也是通过undo log来实现的:当读取的某一行被其他事务锁定时,它可以从undo log中分析出该行记录以前的数据是什么,从而提供该行版本信息,让用户实现非锁定一致性读取。undo log是采用段(segment)的方式来记录的,每个undo操作在记录的时候占用一个undo log segment。另外,undo log也会产生redo log,因为undo log也要实现持久性保护。
relay logMySQL进行主主复制或主从复制的时候才会出现的日志文件,他本质复制的binlog,然后生成relay log,然后从节点基于该日志进行数据备份。
MySQL主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点
1.主线程binlog dump线程:当从节点连接主节点时,主节点会创建一个log dump 线程,用于发送bin-log的内容。在读取bin-log中的操作时,此线程会对主节点上的bin-log加锁,当读取完成,甚至在发动给从节点之前,锁会被释放。
2.从节点IO线程:当从节点上执行start slave
命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
3.从节点SQL线程:SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
关于Mysql中有哪些日志就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。