• Mysql 三大日志(binlog、redolog和undolog)


    前言:Mysql事务  实现,Mysql事务的原子性、一致性、持久性由日志来实现。

    Myisam引擎只支持binlog,而innodb支持binlog、redolog、undolog。

    Redo Log称为重做日志,提供写入操作,恢复提交事务修改页的操作,用来保证事务的持久性。

    Undo Log称为回滚日志,回滚记录到某个特定的版本,用来保证事务的原子性和一致性。

    锁机制保证了事务的隔离性。

       提交是redolog,中止就是undolog

    概括:Redolog和Undolog都是做恢复性操作的。

    redo log:是存储引擎层生成的日志,记录的是“物理级别”上的页修改操作,比如页号xxx、偏移量yyy、写入了zzz数据。主要为了保证数据可靠性。

    undo log: 是存储引擎生成的日志,记录的是逻辑上的日志,比如做了insert语句,记录一条与之相反的delete操作。主要用于事务的回滚(undo log记录的是每个修改操作的逆操作)和一致性非锁定读(MVCC)

    Redo日志

    Tips:每条redo记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成。

    1、先写到内存缓冲区中,提交后再刷盘。

    通过checkPoint机制,来刷入磁盘

     为什么需要RedoLog日志?

    缓冲区可以消除CPU和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘。

    但是由于checkpoint并不是每次变更的时候触发,而是master线程隔一段时间处理的,所以最坏的情况是事务提交后,宕机,数据无法恢复。

    并且多个数据不在一个页可能,因为数据库操作的基本单位都是以页为单位。

    持久性无法保证等多个原因:

    1、修改量和刷新磁盘工作量不成比例(1个数据,16KB一页)

    2、刷新IO刷新较慢(不在一个页,很多页随机IO )

    所以写入到redolog中。

    保证持久性:

    1、先写入到内存,再WAL技术先写日志(硬盘)、再写数据写到磁盘。只有日志写入成功,才算事务提交成功。日志写入失败,事务不提交并回滚。

    redolog包含了两个层面:

    1、内存层面(redo log buffer)重做日志的buffer,由redolog block组成,一个16MB

    2、物理磁盘层面 (redolog file) 重做日志文件id_logfile0,id_logfile1

    redolog的整体流程:

     还没提交就在写log。redolog的优先级跟高。

    注意:redo log buffer刷盘到redo logfile的过程并不是真正的刷盘,只是刷入到文件缓存中(这个是操作系统提高文件写入效率的优化)。

    但是这种就会出现交给系统,刷盘不及时,宕机造成数据丢失。

    三种刷盘策略:

    Innodb_flus_log_at_trx_commit=0.1.2控制的是事务提交后的工作。是否马上刷盘。在事务未提交之前是一直在实时的写入redo log buffer。

    0:表示每次事务提交时不进行刷盘操作。(系统默认master thread  1S进行一次redolog日志的同步)

    InnoDB存储引擎后台有一个线程,每隔1秒,就会把redo log buffer中的内容写入到系统缓存page cache,然后调用刷盘策略

    后台线程,每隔一秒就把redologbuffer写入到pagebuffer,调用fsync刷盘。

    默认0就是一直用的这个,效率是最高的。最不安全的

    参数是1是最安全的。

    1:表示每次事务提交时都进行同步,刷盘操作当事务提交的时候会调用fsync对redolog进行刷盘,将redolog buffer写入到redolog文件中。

    2:表示每次事务提交只把redo log buffer内容写入page cache,不进行同步。由OS决定什么时候同步。

    Tips:Innodb后台会有一个线程,每隔一秒钟,把redo log buffer中的内容写入到文件文件系统缓存page cache(内存),然后调用fsync刷盘。

    Redolog小结:

     将更新之前的数据写入到的undo log日志文件中。

    Undo log日志(查询操作不会记录的)

    redolog是事务持久性的保证,undolog是保证事务一致性、原子性的保证。在事务更新数据的前置操作要先写入一个undo log日志。

    比如:

    1、插入一条记录,记录的是delete操作就好

    2、删除一条就记录插入。

    undo log会产生redo log。

    作用1:回滚数据

    逻辑上修改,不会是从物理上修改的。比如插入了,执行一次delete,逻辑上的做回去。

    作用2:MVCC(多版本并发控制)

    当用户读取一行记录,若该记录被其他事务占用,当前事物通过undo读取之前的行版本信息。非锁定读。

    回滚段中的数据分类

    1、未提交的回滚数据,实现读一致性

    2、已经提交未过期的数据,仍然收到undo retention参数的保持时间影响

    3、事物提交已经过期,当回滚段满了之后,会优先覆盖事务已经提交过期的数据。

    Redolog与Binlog区别:

    1、redolog跟binlog的区别,redolog是存储引擎层产生的,而binlog 是数据层层面产生的。假设一个事务,对表做了10万行的记录插入,

    在这个过程中,一直不断的往redo log顺序记录,而binlog不会,只有事务提交后才一次性写入binlog日志。

    功能:

    redolog:让innodb存储引擎拥有崩溃恢复能力

    binlog:保证了Mysql集群架构的数据一致性。

    undolog:

     两阶段提交:

    保障binlog和redolog一致性 :

    1、 

     

     每个数据行记录除了记录本身的数据之外,还有几个隐藏列。

    如果没有显示定义主键,表中也没有唯一索引,那么INnoDb会自动添加一个隐藏列为主键。

    事务ID

    回滚指针:差用头插法,指向undolog版本的数据。

    查看日志前100行

    cat binlog | head -100 

    Binlog(二进制日志)

    作用应用场景:

    1、用于数据恢复,mysql意外停止,查看用户执行了那些操作,根据binlog来恢复数据库服务器。

    2、用于数据复制,主从复制等

    为了安全起见,可以将参数设置为1,表示每次提交事务都执行fsync,如同redo log刷盘策略一样,马上进行刷盘

    还有一种折中的办法,设置为N>1,表示每次事务提交事务都write,但累积N个事务后才fsync。 

    数据恢复:

    show variables like '%log_bin%';

    删除二进制日志

    purge

  • 相关阅读:
    Eighth scrum meeting
    Seventh scrum meeting
    Sixth scrum meeting
    Fifth scrum meeting
    Forth scrum meeting
    Third scrum meeting
    2019-07-25 L430 生物 GPS
    L429 Why Do Smart People Do Foolish Things?
    L427 长难句
    L426
  • 原文地址:https://www.cnblogs.com/Alei777/p/16439794.html
Copyright © 2020-2023  润新知