为什么 redodonate log 不要放到raid 5 上面

原标题:必须了解的mysql三大日志,你知道几个

日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息mysql日志主要包括错误日志、查询日志、慢查询日志、事务ㄖ志、二进制日志几大类。

作为开发我们重点需要关注的是二进制日志(binlog)和事务日志(包括redodonate log和undo log),本文接下来会详细介绍这三种日志

binlog用于记錄数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中binlog是mysql的逻辑日志,并且由Server层进行记录使用任何存储引擎的mysql数據库都会记录binlog日志。

逻辑日志 :可以简单理解为记录的就是sql语句

物理日志 : mysql 数据最终是保存在数据页中的,物理日志记录的就是数据页變更

binlog是通过追加的方式进行写入的,可以通过max_binlog_size参数设置每个binlog文件的大小当文件大小达到给定值之后,会生成新的文件来保存日志

在實际应用中,binlog的主要使用场景有两个分别是 主从复制和 数据恢复。

数据恢复 :通过使用 mysqlbinlog 工具来恢复数据

对于InnoDB存储引擎而言,只有在事務提交时才会记录biglog此时记录还在内存中,那么biglog是什么时候刷到磁盘中的呢

0:不去强制要求,由系统自行判断何时写入磁盘;

N:每N个事務才会将 binlog 写入磁盘。

从上面可以看出sync_binlog最安全的是设置是1,这也是MySQL 5.7.7之后版本的默认值但是设置一个大一些的值可以提升数据库性能,洇此实际情况下也可以将值适当调大牺牲一定的一致性来获取更好的性能。

优点:不需要记录每一行的变化减少了 binlog 日志量,节约了 IO , 从洏提高了性能;

缺点:在某些情况下会导致主从数据不一致比如执行sysdate 、 slepp 等 。

优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用囷触发无法被正确复制的问题 ;

缺点:会产生大量的日志尤其是` alter table ` 的时候会让日志暴涨

我们都知道,事务的四大特性里面有一个是 持久性具体来说就是 只要事务提交成功,那么对数据库做的修改就被永久保存下来了不可能因为任何原因再回到原来的状态。

那么mysql是如何保證一致性的呢

最简单的做法是在每次事务提交的时候,将该事务涉及修改的数据页全部刷新到磁盘中但是这么做会有严重的性能问题,主要体现在两个方面:

因为 Innodb 是以 页 为单位进行磁盘交互的而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数據页刷到磁盘的话太浪费资源了!

一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续使用随机IO写入性能太差!

因此mysql设计了redodonate log, 具体来说就是只记录事务对数据页做了哪些修改这样就能完美地解决性能问题了(相对而言文件更小并且是顺序IO)。

mysql每执行一条DML語句先将记录写入redodonate log buffer,后续某个时间点再一次性将多个操作记录写到redodonate log file这种 先写日志,再写磁盘的技术就是MySQL

在计算机操作系统中用户空間(user space)下的缓冲区数据一般情况下是无法直接写入磁盘的,中间必须经过操作系统内核空间(kernel space)缓冲区(OS Buffer)

前面说过,redodonate log实际上记录数据页的变更而這种变更记录是没必要全部保存,因此redodonate log实现上采用了大小固定循环写入的方式,当写到结尾时会回到开头循环写日志。如下图:

同时峩们很容易得知 在innodb中,既有redodonate log需要刷盘还有数据页也需要刷盘,redodonate log存在的意义主要就是降低对数据页刷盘的要求 **

启动innodb的时候,不管上次昰正常关闭还是异常关闭总是会进行恢复操作。因为redodonate log记录的是数据页的物理变化因此恢复的时候速度比逻辑日志(如binlog)要快很多。

重启innodb时首先会检查磁盘中数据页的LSN,如果数据页的LSN小于日志中的LSN则会从checkpoint开始恢复 。

还有一种情况在宕机前正处于checkpoint的刷盘过程,且数据页的刷盘进度超过了日志页的刷盘进度此时会出现数据页中记录的LSN大于日志中的LSN,这时超出日志进度的部分将不会重做因为这本身就表示巳经做过的事情,无需再重做

但只有redodonate log也不行,因为redodonate log是InnoDB特有的且日志上的记录落盘后会被覆盖掉。因此需要binlog和redodonate log二者同时记录才能保证當数据库发生宕机重启时,数据不会丢失

数据库事务四大特性中有一个是 原子性,具体来说就是 原子性是指对数据库的一系列操作要麼全部成功,要么全部失败不可能出现部分成功的情况。

实际上 原子性底层就是通过undo log实现的。undo log主要记录了数据的逻辑变化比如一条INSERT語句,对应一条DELETE的undo log对于每个UPDATE语句,对应一条相反的UPDATE的undo log这样在发生错误时,就能回滚到事务之前的数据状态

同时,undo log也是MVCC(多版本并发控淛)实现的关键返回搜狐,查看更多

}

重做日志组可以控制了日志文件鈈至于太大提高系统效率。

每个重做日志文件redodonateLOG叫做成员 MEMBER多个重做日志文件为一个重做日志组GROUP,ORACLE数据库正常工作需要至少两个重做日志組默认一个组只有一个成员

LGWR在任意时刻只能写一组重做日志组LGWR后台 进程正在写的重做日志组称当前CURRENT重做日志组,LGWR把完全相同的信息從重做日志缓冲区redodonate LOG BUFFER中复制到组中的每个重做日志文件中

以循环方式 写重做日志组,LGWR写满一组重做日志就开始下一组重做日志,称为日誌切换SWITCH最后一组写满,开始重写第一组

以循环方式 写重做日志组导致日志信息被覆盖,引入了归档日志模式archived;

ORACLE默认是非归档模式当归檔模式时,LGWR的写操作从一个重做日志组切换到另一个重做日志组后ARCH就将上一个重做日志文件中信息复制到归档日志文件中。  归档日志文件是重做日志文件的备份

归档模式时归档写进程 没将重做日志文件中信息复制到归档日志文件之前,LGWR不能再写这组重做日志文件归档ㄖ志文件是脱机日志文件。除了ARCH运行时不需要管理。

如ORACLE当前正操作的重做日志组中一个成员坏了ORACLE继续使用组中其它没问题的成员并将錯误信息定稿报警文件。当切换到的组中所有成员都坏ORACLE会关闭系统

关于redodonate日志的大小的最低要求:

关于redodonate日志切换的顺序:

使用语句"alter system switch logfile"进行ㄖ志切换时下一个变为CURRENT状态的一定是当前状态下,序列号最低的那个日志组.
补充:其实这很好理解oracle的日志本来就是循环使用的,只不過这里的循环不是首尾相接式的而是根据日志序列号判断,将最老的日志给覆盖掉而已.

reod日志文件以一种循环方式使用当一组redodonate日志文件被写满,LGWR开始写下一组日志文件称为日志切换此时要产生检查点校验点。一些信息被写到控制文件

强制性产生重做日志切换命令:

每個redodonate日志组中的成员个数可以不同,每个redodonate日志组中成员可以大小不同但是实际应用中应该使用相同成员个数,相同大小

3.redodonate日志特殊情况下嘚处理:

每个重做日志组至少有一个成员才能正常工作,归档模式时要删除的成员未被归档完时无法删除从系统中删除成员后,操作系統文件除OMF方式管理外都存在要从操作系统层面删除。

4.添加删除重做日志文件组和添加重做日志文件

步骤有:1.直接增加重做日志文件组并查看是否已经增加上

2.删除原有重做日志文件组并在新位置增加重做日志文件组。

3.从数据库中查看数据字典验证是否修改成功在操作系統层面查看是否生成相应重做日志文件。

一、增加日志文件组默认是顺序增加,比如原来3组现在新增加的为第4组。

数据库已更改 ---group 4 ,如果不指定GROUP号,则顺序增加

数据库在非归档模式下,新加入的日志为什么ARCYES,重启后为NO

二、删除第3组重做日志文件,STATUSINACTIVE可删除

切换後STATUS仍为ACTIVE,不能删除重做日志组可以重启数据库,就可以删除了或者手工检查点 alter system checkpoint;

现在可以删除未重启前为ACTIVE状态的GROUP 1了。

三.修改后相关信息嘚检查

}

我要回帖

更多关于 redodonate 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信