zoukankan      html  css  js  c++  java
  • UNDO自我理解总结

    【场景】

         当在更新数据的时候,发现更新的值写错了,这时就需要将已经更新的地方恢复到原始数据。

    【基本概念】

        在更新的过程中,Oracle会将原始的数据都放入到UNDO里,这样当以上情况发生后,就可以从UNDO中拿到原本的数据了。

        UNDO是在Oracle 11g被提出的,由UNDO tablespace进行管理,常用“撤销段”说明,用于进行撤销操作

        ROLLBACK是在Oracle 9i出现的,存在于system表空间,常用“回滚段”说明,用于进行回滚操作

        【区分】

              -- 相同点:

                      撤销段与回滚段都是用于恢复旧数据的,

              -- 不同点:

                     -| 撤销段是位于undo表空间下的,并且性能较优,数据块较大

                     当使用的是undo表空间时,那么undo_segment是auto的状态

     

                      -| 回滚段是位于system表空间下的,性能较弱,数据块也比较小

                      当使用的是system表空间下的rollback时,那么rollback_segment是auto状态,undo_segment是manual

    【机制】

         UNDO表空间是以一个数据文件(类似于undotbs.dbf)的格式存放在磁盘中的,但是它有一段undo segment是存放在了内存中

         查看undo数据文件存放的位置:

    select * from dba_data_files where tablespace_name like 'UNDO%

       

       当执行update语句的时候:

          1)首先,会在buffer cache里找到undo segment相应的数据块(如不存在,则创建数据块),进行修改

          2)然后,这个修改的操作,会记录到redo log里

          3)当在写磁盘的时候,会先把redo log /undo segment的文件写进去

          4)当用户COMMIT后,DBWR会将修改的数据块写入undo的数据文件里

    【update语句的详细过程】

           例如,执行以下的update语句:

       当在执行一条更新语句的时候,例如:

    --假设sal=3000,需要更新数据
    update emp set sal = 4000 where empno = 02  
    

         1) 会先检查empno=02是否在存在buffer cache里,不存在则创建

              ==> 这一步是查看之前empno是否被修改过,已经存在了缓存中

          2)在回滚段的事务表分配事务槽  ==> 这个操作会被记录到redo log里

          3)从回滚段里读sal的数据或在buffer cache里创建数据 sal = 3000 ==> 这个操作会被记录到redo log里

          4)修改sal = 4000,数据变更,将此数据以及操作记入redo log里

          5)如果用户操作提交(commit),会在redo log buffer里记录提交信息,并在回滚段标记该事务为inactive

         由以上的流程可以看出,在update操作时,就会用到undo的资源,并且也用到了redo的资源。

     【DML操作的undo使用资源比较】

            DML操作会使数据产生变化,这就需要用到undo来保证数据的一致性,但是每一个DML操作,undo的使用都会不同。

            -- insert 操作 

                  undo 要记录到插入数据的rowid即可

            -- update操作

                  undo要记录被更新字段的旧值即可

            -- delete操作(资源使用最高,如果删除的量很大,会造成堵塞。){建议分批删除,分次提交}

                   undo要记录一整行完整的数据

    -----TO BE CONTINUE ------

    【扩展知识】

              --  buffer cache的概念:

                   当有请求数据,CPU就要去读取数据,如果直接从磁盘读取(并且数据量很大),那么会导致IO过高,速度过慢。

                   为了解决这个问题,就产生了“中间站” -- buffer cache(数据高速缓存区){位于内存中}

                   所有请求的数据都会先写入到“中间站”,再定时将数据更新到磁盘中,这样就避免了点对点的压力过大

                    -- 拆分开了的buffer 、 cache的概念:

                           buffer: 是还没有被写入disk里的数据

                           cache:已经被disk读,并且保存至之后使用

               -- undo块的状态: (undo_retention)

                    Active(活动的):未提交事务的undo数据,这些undo数据永远不能覆盖,用于回滚rollback事务。
                   Inactive:表示该undo上没有活动的事务,该状态的undo可以被其他事务覆盖。
                   Expired(过期的):表示该undo持续inactive的时间超过undo_retention所指定的时间。

              已提交事务的undo数据,这些undo数据可以覆盖。

                   Inexpired(未过期的): 事务已提交,但事务提交前,有些查询正在进行,它要读取的是提交前的数据,这部分数据就是未过期数据。

              如果这部分undo数据被覆盖了,就会发生ora-01555错误。
                   Freed:表示该undo块内容是空的,从来没有被使用过

            

  • 相关阅读:
    使用python-gitlab包在gitlab上自动创建分组
    navicat连接远程mysql失败
    Python shell介绍
    Python任务流taskflow
    Python导包问题
    demo27-数组去重
    demo26-通过循环输出数据到页面显示
    demo25-for循环
    Visual Studio 2005 快捷键汇总
    三维立体图片效果
  • 原文地址:https://www.cnblogs.com/frankielf0921/p/7659735.html
Copyright © 2011-2022 走看看