zoukankan      html  css  js  c++  java
  • binlog、redo log、undo log区别

    root@(none) 04:17:18>show variables like 'innodb_log_group_home_dir';
    +---------------------------+-----------------+
    | Variable_name | Value |
    +---------------------------+-----------------+
    | innodb_log_group_home_dir | /opt/mysql/data |
    +---------------------------+-----------------+
    1 row in set (0.00 sec)

    root@(none) 04:17:34>show variables like 'innodb_undo_directory';
    +-----------------------+-------+
    | Variable_name | Value |
    +-----------------------+-------+
    | innodb_undo_directory | . |
    +-----------------------+-------+
    1 row in set (0.00 sec)

    -------------------------------------------------------------------------------------------------------

    什么是binlog

    binlog日志用于记录所有更新且提交了数据或者已经潜在更新提交了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。

    binlog作用

    1.恢复使能够最大可能地更新数据库,因为二进制日志包含备份后进行的所有更新。
    2.在主复制服务器上记录所有将发送给从服务器的语句。 

    binlog 主要参数

    log_bin
    设置此参数表示启用binlog功能,并指定路径名称

    innodb_flush_log_at_trx_commit = N:

    N=0  – 每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;

    N=1  – 每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;

    N=2  – 每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;

    sync_binlog =  N:

    N>0  — 每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;

    N=0  — 不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定;

    推荐配置组合:

    N=1,1  — 适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统;

    N=1,0  — 适合数据安全性要求高,磁盘IO写能力支持业务不富余,允许备库落后或无复制;

    N=2,0或2,m(0<m<100)  — 适合数据安全性有要求,允许丢失一点事务日志,复制架构的延迟也能接受;

    N=0,0  — 磁盘IO写能力有限,无复制或允许复制延迟稍微长点能接受,例如:日志性登记业务;



    Undo Log

    Undo Log是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用UndoLog来实现多版本并发控制(简称:MVCC)。
    -事务的原子性(Atomicity)
    事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。

    -原理
    Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为UndoLog)。
    然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用UndoLog中的备份将数据恢复到事务开始之前的状态。
    除了可以保证事务的原子性,Undo Log也可以用来辅助完成事务的持久化。

    -事务的持久性(Durability)
    事务一旦完成,该事务对数据库所做的所有修改都会持久的保存到数据库中。为了保证持久性,数据库系统会将修改后的数据完全的记录到持久的存储上。

    -用Undo Log

    实现原子性和持久化的事务的简化过程

    假设有A、B两个数据,值分别为1,2。
    A.事务开始.
    B.记录A=1到undolog.
    C.修改A=3.
    D.记录B=2到undolog.
    E.修改B=4.
    F.将undolog写到磁盘。
    G.将数据写到磁盘。
    H.事务提交
    这里有一个隐含的前提条件:‘数据都是先读到内存中,然后修改内存中的数据,最后将数据写回磁盘’。
    之所以能同时保证原子性和持久化,是因为以下特点:
    A.更新数据前记录Undo log。
    B.为了保证持久性,必须将数据在事务提交前写到磁盘。只要事务成功提交,数据必然已经持久化。
    C.Undo log
    必须先于数据持久化到磁盘。如果在G,H之间系统崩溃,undo log是完整的,可以用来回滚事务。

    D.如果在A-F之间系统崩溃,因为数据没有持久化到磁盘。所以磁盘上的数据还是保持在事务开始前的状态。

    缺陷:每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。
    如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一种机制来实现持久化,即

    Redo log
    记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,
    但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。

     

    首先介绍下Innodb redo log是什么,为什么需要记录redo log,以及redo log的作用都有哪些。这些作为常识,只是为了本文完整。
     
    InnoDB有buffer pool(简称bp)。bp是数据库页面的缓存,对InnoDB的任何修改操作都会首先在bp的page上进行,然后这样的页面将被标记为dirty并被放到专门的flush list上,后续将由master thread或专门的刷脏线程阶段性的将这些页面写入磁盘(disk or ssd)。这样的好处是避免每次写操作都操作磁盘导致大量的随机IO,阶段性的刷脏可以将多次对页面的修改merge成一次IO操作,同时异步写入也降低了访问的时延。然而,如果在dirty page还未刷入磁盘时,server非正常关闭,这些修改操作将会丢失,如果写入操作正在进行,甚至会由于损坏数据文件导致数据库不可用。为了避免上述问题的发生,Innodb将所有对页面的修改操作写入一个专门的文件,并在数据库启动时从此文件进行恢复操作,这个文件就是redo log file。这样的技术推迟了bp页面的刷新,从而提升了数据库的吞吐,有效的降低了访问时延。带来的问题是额外的写redo log操作的开销(顺序IO,当然很快),以及数据库启动时恢复操作所需的时间。


    -Undo+Redo
    事务的简化过程
    假设有A、B两个数据,值分别为1,2.
    A.事务开始.
    B.记录A=1到undolog.
    C.修改A=3.
    D.记录A=3到redolog.
    E.记录B=2到undolog.
    F.修改B=4.
    G.记录B=4到redolog.
    H.将redolog写入磁盘。
    I.事务提交

    -Undo+Redo
    事务的特点
    A.为了保证持久性,必须在事务提交前将
    RedoLog持久化。
    B.数据不需要在事务提交前写入磁盘,而是缓存在内存中。
    C.RedoLog保证事务的持久性。
    D.UndoLog保证事务的原子性。
    E.有一个隐含的特点,数据必须要晚于redolog写入持久存

    参考资料:http://wenku.baidu.com/link?url=q8ZRVQf87xNTzkR8hJY5q4CCMeeXHu-XLchxKjyYzu8Wb9yOVOf4QGHE7sVblb4TvG0OfUdjn8HcRMSpIJlIUDHHB4vsKyw46rYeFFCeqYW

  • 相关阅读:
    几种存储器类型总结
    几种存储器类型总结
    JPEG2000开发SDK及其特点
    JPEG2000开发SDK及其特点
    测试代码的编写
    测试代码的编写
    关于opencv的几个小总结
    关于opencv的几个小总结
    假设检验与判决准则(一)
    Canny算法源码,欢迎交流
  • 原文地址:https://www.cnblogs.com/wjoyxt/p/4806262.html
Copyright © 2011-2022 走看看