精华内容
下载资源
问答
  • CPU与Mem,Mem与Disk一级一级的速度差别,使得我们不断寻找可以提高速度的方式;例如,页面速度的提高:使用squid、...oracle 从i到g都在不断优化(之间是回滚段到回滚表空间),对redo和undo日志的利用越来越高。但my...

    CPU与Mem,Mem与Disk一级一级的速度差别,使得我们不断寻找可以提高速度

    的方式;例如,页面速度的提高:使用squid、varnish、nginx cache等页面

    缓存提高页面的访问速度,使用memcache等数据缓存提高应用层访问速度。

    数据库怎么减少离散磁盘读写,提高数据访问速度。oracle 从i到g都在不断

    优化(之间是回滚段到回滚表空间),对redo和undo日志的利用越来越高。但

    mysql中事务类型innodb存储引擎的具体情况是怎样呢?

    在对付用户每次有导致数据变更的请求中,Innodb引擎把数据和索引都载入到

    内存中的缓冲池(buffer pool)中,如果每次修改数据和索引都需要更新到磁盘,

    必定会大大增加I/O请求,而且因为每次更新的位置都是随机的,磁头需要频繁定

    位导致效率低,数据暂放在内存中,也一定程度的提高了读的速度。所以Innodb

    每处理完一个请求(Transaction)后只添加一条日志log,另外有一个线程负责智

    能地读取日志文件并批量更新到磁盘上,实现最高效的磁盘写入。(^-^听着听着

    像看到Oracle的一些影子吧,因为本人以前是弄Oracle所以现在简单mysql都联想

    到oracle的架构体系,其实个人认为每个数据原理上是差不多。)

    innodb既然利用Mem buffer提高相应的速度,那当然也会带来数据不一致,术语为

    脏数据,Mysql称之为dirty page。发生过程:当事务(Transaction)需要修改某条

    记录(row)时,InnoDB需要将该数据所在的page从disk读到buffer pool中,事务

    提交后,InnoDB修改page中的记录(row)。这时buffer pool中的page就已经和disk

    中的不一样了,mem中的数据称为脏数据(dirty page)。Dirty page等待flush到disk上。

    知道mysql中术语的dirty page(我认为这个dirty page放在哪个缓存工具层面上

    都适合)。

    dirty page既然是在Buffer pool中,那么如果系统突然断电Dirty page中的数据

    修改是否会丢失?答案是肯定的,buffer pool中的数据并不是永久性。

    系统故障造成数据库不一致的原因有两个:

    1.未完成事务对数据库的更新可能已写入数据库。

    2.已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。

    在这里我们先说恢复的一般方法:

    (1)正向扫描日志文件(从头到尾),找出故障发生前已经提交的事务(存在begin transaction

    和commit记录),将其标识记入重做(redo)队列。同时找出故障发生时未完成的事务

    (只有begin transaction,没commit),将其标识记入(undo)队列

    (2)对undo队列的各事务进行撤销处理。进行undo的处理方法是,反向扫描日志文件,对每个undo

    事务的更新操作执行反操作,即将日志记录中“更新前的值”写入数据库。

    (3)对重做日志中的各事务进行重做操作。进行redo的处理方法是,正向扫描日志,对每个redo事务

    重新执行日志文件登记操作。即将日志中“更新后的值”写入数据库。

    以上三个步骤放于四海皆行。

    但mysql为了防止buffer pool数据掉失,在日常的操作中也建立了redo和undo这两个日志,记录相关

    的信息,redo log在每次事务commit的时候,就立刻将事务更改操作记录到redo log。所以即使buffer

    pool中的dirty page在断电时丢失,InnoDB在启动时,仍然会根据redo log和undo log中的记录完成数据恢复。

    具体操作是:

    110105120703.jpg

    redo log 也不能无限制放任不断增长,dirty page什么时候flush到disk上?

    1. The redo log, which is organized as a ring buffer, is full. To free up some space we will write

    out dirty pages in redo log order so that we can advance the trailing pointer of the redo log ring

    buffer an make some room.

    redo log是一个环(ring)结构,当redo空间占满时,将会将部分dirty page flush到disk上,然后释放部分redo log。

    This situation is called an Innodb_log_wait and will be registered in the status counter of the same name.

    这种情况称为Innodb_log_wait,会被记录在Mysql status 中。

    2. InnoDB requires a free page from the InnoDB buffer pool but cannot find one. Usually we can free a page in

    the buffer pool by giving up a page that is not marked dirty. When a page is not marked dirty its contents

    can be reloaded from disk at any time and so we can safely give it up in memory. But when the buffer pool

    holds only dirty pages this is impossible and we actually have to flush dirty pages to disk before we can

    free them up for other uses.

    当需要在Buffer pool分配一个page,但是找不到这样的一个page,因为所有的page都是被标注为dirty

    This situation is called Innodb_buffer_pool_wait_free and will be registered in a status counter of the

    same name. InnoDB tries to avoid this situation: Whenever more than innodb_max_dirty_pages_pct percent many

    pages are marked dirty a checkpoint is forced and dirty pges will be written.

    这种情况称为Innodb_buffer_pool_wait_free,并将会记录到Innodb_buffer_pool_wait_free Mysql的系统变量中。

    一般地,可以可以通过启动参数innodb_max_dirty_pages_pct控制这种情况,当buffer pool中的

    dirty page到达这个比例的时候,将会强制设定一个checkpoint,并把dirty page flush到disk中。

    3. InnoDB feels idle and will write out batches of 64 pages each to disk once a second.

    检测到系统空闲的时候,会flush,每次64 pages。

    This is normal and will not be specifically registered (but will of course bump Innodb_pages_written like everything else).

    以上三种情况涉及的主要两个参数为:innodb_flush_log_at_trx_commit、 innodb_max_dirty_pages_pct;

    可通过状态参数:Innodb_log_wait、Innodb_buffer_pool_wait_free进行查询

    innodb_flush_log_at_trx_commit

    默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时。

    特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM

    表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬盘,

    所以一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也

    可能会丢失事务的数据。而值2只会在整个操作系统挂了时才可能丢数据。

    innodb_max_dirty_pages_pct

    his is an integer in the range from 0 to 100. The default value is 90.

    The main thread in InnoDB tries to write pages from the buffer pool so that the

    percentage of dirty (not yet written) pages will not exceed this value.

    具体映射到Mysql的图示

    110105120839.jpg

    PS:这图也解答了网页中“Mysql 有undo relog log?” 这样的提问了

    展开全文
  • 1. undo logundo日志用于存放数据修改被修改前的值,是逻辑日志,比如delete sql 对应的undo log是一条insert sql。undo log作用有两个,一个是用于事务回滚操作,保证事务原子性,部分解决持久性;另一个是对MVCC...

    1. undo log

    undo日志用于存放数据修改被修改前的值,是逻辑日志,比如delete sql 对应的undo log是一条insert sql。undo log作用有两个,一个是用于事务回滚操作,保证事务原子性,部分解决持久性;另一个是对MVCC实现,即MVCC实现是依赖于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

    2. redo log

    记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是RedoLog已经持久化。系统可以根据RedoLog的内容,将所有数据恢复到最新的状态。注意,redo log 和 undo log都是顺序io,而普通数据写磁盘是随机io,顺序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写入持久存储

    3. bin log

    binlog,即二进制日志,它记录了数据库上的所有改变,并以二进制的形式保存在磁盘中;

    它可以用来查看数据库的变更历史、数据库增量备份和恢复、Mysql的复制(主从数据库的复制)。

    4. slow log 慢查询日志

    MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中。long_query_time的默认值为10,意思是运行10s以上的语句。默认情况下,Mysql数据库并不启动慢查询日志,需要我们手动来设置这个参数slow_query_log,当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。

    5. 为什么MySQL有binlog,还有redo log?

    这个是因为MySQL体系结构的原因,MySQL是多存储引擎的,不管使用那种存储引擎,都会有binlog,而不一定有redo log,简单的说,binlog是MySQL Server层的,redo log是InnoDB层的。以及redo log是不停的append的,bin log是事务提交后才会触发io写的

    http://www.ywnds.com/?p=7892   《binlog 与 redo log 顺序一致性问题》

    展开全文
  • 1、redo log undo log innodb 事务日志包括 redo log undo log redo log :重做日志,提供前滚操作 ,保证事务的持久性。 undo log :回滚日志,提供回滚操作,保证事务的原子性。 redo log 声明周期 ...

    1、redo log 和 undo log

    innodb 事务日志包括 redo log 和 undo log

    • redo log :重做日志,提供前滚操作 , 保证事务的持久性。
    • undo log :回滚日志,提供回滚操作,保证事务的原子性。

    redo log

    • 声明周期

      • 事务开始之后,就开始产生 redo log 日志了,在事务执行的过程中,redo log 开始逐步落盘。当对应事务的脏页写入到磁盘之后,redo log 的使命就完成了,它所占用的空间也就可以被覆盖了。
    • 存储内容

      • 一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;
      • 二是磁盘上的重做日志文件(redo log file),该部分日志是持久的,redo log 存储的是物理格式的日志,记录的是物理数据页面的修改信息,它是顺序写入 redo log file 中的。
    • 落盘方式

      • 1,Master Thread 每秒一次执行刷新 Innodb_log_buffer 到重做日志文件 
      • 2,每个事务提交时会将重做日志刷新到重做日志文件
      • 3,当重做日志缓存可用空间少于一半时,重做日志缓存被刷新到重做日志文件

    undo log

    • 生命周期

      • 事务开始之前,将当前事务版本生成 undo log,undo log 也会产生 redo log 来保证 undo log 的可靠性。当事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表,由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。
    • 存储内容

      • undo log 存储的是逻辑格式的日志,保存了事务发生之前的上一个版本的数据,可以用于回滚。当一个旧的事务需要读取数据时,为了能读取到老版本的数据,需要顺着 undo 链找到满足其可见性的记录。
    • 存储位置

      • 默认情况下,undo 文件是保存在共享表空间的,也即 ibdatafile 文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的 undo log 信息,这些信息全部保存在共享表空间中,因此共享表空间可能会变得很大,默认情况下,也就是 undo log 使用共享表空间的时候,被“撑大”的共享表空间是不会、也不能自动收缩的。因此,MySQL5.7 之后的“独立 undo 表空间”的配置就显得很有必要了。

    2、bin log

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

    作用

    • 用于主从复制中,从库利用主库的bin log 进行重播,实现主从同步。
    • 用于数据库的基于时间点、位点等的还原操作。

    模式:Statement、Row、Mixed。

    事务提交时,一次性把所有SQL语句按照格式写到 bin log 中,这里与 redo log 很明显的差异就是 redo log 并不一定是在事务提交的时候才刷新到磁盘,而是在事务开始之后就开始逐步写入磁盘。binlog 的默认保存时间是由参数 expire_logs_days 配置的,对于非活动的日志文件,在生成时间超过 expire_logs_days 配置的天数之后,会被自动删除。

    展开全文
  • 3.事务的原子性和持久性事务原子性的保障根据上面redo log和undo log在事务中生成的过程我们可以知道,对数据进行一系列的修改之前都会把其历史数据保存到undo log,然后把更新的数据记录到redo log日志里。...

    Undo log 主要用于记录数据被修改之前的日志,在表信息修改之前先会把数据拷贝到undo log 里,当事务进行回滚时可以通过undo log 里的日志进行数据还原。

    182a7ab9021cd7dd8b6e82d24ef5eee0.png

    3.事务的原子性和持久性

    事务原子性的保障

    根据上面redo log和undo log在事务中生成的过程我们可以知道,对数据进行一系列的修改之前都会把其历史数据保存到undo log,然后把更新的数据记录到redo log日志里。 当我们的事务进行commit后可以通过redo log日志来保证只要commit后的事务数据都会全部同步修改到数据库。当事务就行rollback时,我们可以通过undo log记录的历史版本来对整个事务关联的修改的数据进行回滚。

    事务持久性的保障

    持久性是在系统无论发生异常、崩溃的时候依然能保证我们的数据能正常的持久化到数据库中,在系统出现异常或崩溃的时候,我们可以通过对redo log进行回放,对于redo log 里已经commit的事务执行数据重做,对于redo log里没有commit的事务,我们则可以通过undo log来对事务涉及到的数据进行数据回滚从而最终保证事务数据的持久性。

    4.redo log 、undo log 的生成过程

    1、修改数据前首先把需要修改的数据从数据表中读取到内存。

    2、把需原数据作为历史版本记录到undo log里。

    3、把需要变更的数据记录到redo log里。

    4、commit或rollback事务,修改表数据。

    7b8f4b22b4f4d1e30326010c7fa3777f.png

    5. redo log 何时会被刷新到磁盘文件

    (1)如果写入redo log buffer的日志已经占据了redo log buffer总容量的一半了,也就是超过了8MB的redo log在缓冲里了,此时就会把他们刷入到磁盘文件里去

    (2)一个事务提交的时候,必须把他的那些redo log所在的redo log block都刷入到磁盘文件里去,只有这样,当事务提交之后,他修改的数据绝对不会丢失,因为redo log里有重做日志,随时可以恢复事务做的修改

    (PS:当然,之前最早最早的时候,我们讲过,这个redo log哪怕事务提交的时候写入磁盘文件,也是先进入os cache的,进入os的文件缓冲区里,所以是否提交事务就强行把redo log刷入物理磁盘文件中,这个需要设置对应的参数,我们之前都讲过的 ,大家回过

    (3)后台线程定时刷新,有一个后台线程每隔1秒就会把redo log buffer里的redo log block刷到磁盘文件里去

    (4)MySQL关闭的时候,redo log block都会刷入到磁盘里去

    Redo log的用途

    为了保证数据能正确的持久化,在系统出现异常的时候通常会对redo log进行回放,把已经commit的事务进行数据重做。

    Undo log 的用途

    (1)保证事务进行rollback时的原子性,当事务进行回滚或者系统异常需要对数据进行回滚的的时候可以用undo log的日志进行数据重做。

    (2)用于MVCC快照读的数据,在MVCC多版本控制中,通过读取undo log的历史版本数据可以实现不同事务版本号都拥有自己独立的快照数据版本。

    undo log的原理

    undo log是把所有没有COMMIT的事务回滚到事务开始前的状态,系统崩溃时,可能有些事务还没有COMMIT,在系统恢复时,这些没有COMMIT的事务就需要借助undo log来进行回滚。

    redo log 的原理

    redo log是指在回放日志的时候把已经COMMIT的事务重做一遍,对于没有commit的事务按照abort处理,不进行任何操作。

    三、拓展

    展开全文
  • 大概的讲一下mysql的事务日志undo log 和 redo log参考的大佬的帖子redo log的基本概念为什么需要经过OS bufferredo log的格式日志刷盘的规则LSN详细分析innodb的恢复行为...innodb事务日志包括redo log和undo log。re
  • MySQL数据库之undo log和redo log工作原理.png,这是一份图例,画图表示undo log和redo log的工作原理
  • undo log和redo log

    2019-07-02 10:59:00
    在数据库系统中,既有存放数据的文件,也有存放日志的文件。日志在内存中也是有缓存Log buffer,也有磁盘文件log file,本文主要...MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。 1 undo 1.1...
  • 在谈日志文件之前,不得不提事务这一概念。...一个逻辑工作单元要成为事务,必须满足所谓的ACID(原子性、一致性、隔离性持久性)属性。 原子性  (atomicity)  事务必须是原子工作单元;...
  • MySQL事务日志undo log和redo log分析

    千次阅读 2019-04-20 17:16:37
    文章目录前言先聊聊undo log再聊聊redo log如何利用undo log和redo log异常恢复?参考文章 前言 这两事务日志用来保证事务原子性、持久性的,undo log(回滚日志)提供回滚操作,保证原子性,redo log(重做日志)提供前...
  • redo log和undo log篇 关于redo log 一,redo log的文件 二,redo log的写入 三,redo log的删除 四,查看redo log相关的配置 关于undo log 一,undo log的文件 二,undo log的写入 三,undo log的空间释放...
  • 写在前面讲到InnoDB、MVCC等概念时,我们时常听到redo log和undo log的名字,那么二者的作用是什么呢?其实二者并非事务操作独有,索引更新时也会记录redo/undo log,甚至记录undo log时也会记录redo log,而本文...
  • logsinnodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:redo log通常是物理日志,记录...
  • 比较重要的包括 redo logundo log binlog。redo log 是重做日志,提供前滚操作;undo log 是回滚日志,...
  • logs innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: redo log通常是物理日志,...
  • redolog undolog binlog 什么是binlog binlog是在mysql的服务层产生的 binlog记录了数据库表结构表数据变更,它不会记录select(因为这没有对表没有进行变更) 可以简单理解为:存储着每条变更的SQL语句(可能...
  • InnoDB redo log和undo log

    2020-09-09 21:15:26
    主要由3种日志,undolog, redolog binlog下面整理这三种日志的作用。 redolog redoLog保证事务的原子性持久性,是InnoDB存储引擎特有的一种物理日志,负责把事务对数据库的所有修改都记录下来。redo log存储数据...
  • 事务的实现redo log保证事务的持久性,undo log用来帮助事务回滚及MVCC的功能。InnoDB存储引擎体系结构redo logWrite Ahead Log策略事务提交时,先写重做日志再修改页;当由于发生宕机而导致数据丢失时,就可以通过...
  • binlog redolog undolog

    2020-07-25 23:44:18
    innodb事务日志包括的redo log undo logredo log是物理日志,记录的是数据页的物理修改,它保证了事务的持久性。 redo log分为两部分:一个是内存中的日志缓冲(redo log buffer),该部分日志是容易丢失的。二是...
  • Redo日志文件的大小以及个数是通过过 `innodb_log_file_size` innodb_log_files_in_group 参数来控制的监控redo使用情况1.使用 `show engine innodb status`mysql> show engine innodb statusG LOG --- Log ...
  • mysql的undo log和redo log

    2020-07-24 15:23:14
    MySQL中的日志文件,有这么两类常常讨论到:undo日志与redo日志。 1 undo 1.1 undo是什么 undo日志用于存放数据修改被修改前的值,假设修改 tba 表中 id=2的行数据,把Name='B' 修改为Name = 'B2' ,那么undo日志就...
  • innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:1.redo log通常是物理日志,记录的...
  • innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志: 1.redo log通常是物理日志,记录...
  • 本文章向大家介绍MySql 事务实现机制 几种日志undo log、 binlog、redo log,主要包括MySql 事务实现机制 几种日志undo log、 binlog、redo log使用实例、应用技巧、基本知识点总结需要注意事项,具有一定的参考...
  • redo和binlog区别:1、首先2者都是记录数据的改变,不同的是,binlog是记录所有数据的改变信息,而innodb的redo log只是记录所有innodb表数据的变化。2、binlog是记录已经提交完毕之后的dml以及ddl sql语句,而innodb...
  • mysql redolog undolog binlog

    2020-06-12 10:58:36
    innodb事务日志包括redo log和undo log。redo log是重做日志,提供前滚操作,undo log是回滚日志,提供回滚操作。 undo log不是redo log的逆向过程,其实它们都算是用来恢复的日志:1.redo log通常是物理日志,记录...
  • mysql binlog redolog undolog 日志概念说明binlogbinlog使用场景binlog刷盘时机binlog日志格式redo log为什么需要redo logredo log基本概念redo log记录形式redo log与binlog区别undo log 日志是 mysql 数据库的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,148
精华内容 459
关键字:

loglog和redoundo