当前位置:数据库 > Oracle >>

Oracle回滚(ROLLBACK)和撤销(UNDO)

Oracle回滚(ROLLBACK)和撤销(UNDO)
 
--==================================
--Oracle 回滚(ROLLBACK)和撤销(UNDO)
--==================================
 
一、回滚(ROLLBACK)和撤销(UNDO)
 
    回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。
   
    在9i版本以前
        Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作
        每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理
    在9i及后续版本
        提供了一种新的回滚数据的管理方式,即使用Oracle自动管理的撤销(Undo)表空间
        自动撤销管理表空间统一管理所有DML的回滚操作,简化了对于回滚工作的管理
        在9i,10g中的回滚段仅仅用作保留向后兼容
        撤销段代替了原有版本中的回滚段,因此本文所有描述均使用撤销
   
    撤销的实质意味着将所作的修改退回到修改前的状态,即倒退所有DML语句
       
二、撤销段中的内容及相关特性
    对于任何DML操作而言,必须同时处理数据块和撤销块,并且还会生成重做信息
    在ACID中,A、C、I要求生成撤销,D则要求生成重做
    INSERT:
        撤销段记录插入记录的rowid,如果需要撤销,则根据rowid将该记录删除即可
    UPDATE:
        撤销段记录被更新字段的原始值,撤销时将原始值覆盖新值即可
    DELETE:
        撤销段记录整行的数据,撤销时执行反向操作将该记录插入原表
 
    由上可知,UNDO段中的内容总结如下:
        数据为修改之前的副本
        从每个改变数据的事务中获得
        在事务结束前一直被保留
   
    UNDO段中数据的作用:
        用于回滚操作
        读一致性和闪回查询
        用于事务失败时的恢复
       
    UNDO段与事务:
        一个事物的启动,Oracle将为其分配仅仅一个UNDO段,若该段用完,则Oracle会自动为该UNDO段添加另一个区间(extent)
        一个UNDO段能够同时为多个事务服务
       
    UNDO段与UNDO表空间:
        UNDO段中的内容存储在UNDO表空间
        任意给定时刻只能使用一个UDNO表空间
        UNDO表空间必须被创建为持久的、本地管理、可自动扩展的表空间
        正在使用的UNDO表空间不能撤销或删除
        UNDO表空间使用循环写的方式,与联机日志文件写相似,不同的是UNDO中可以设置了undo_retention 保留时间
   
    UNDO段的两种管理方式:
        AUTO    自动管理(推荐)
        MANUAL  手动管理(仅保留)
           
三、与撤销相关的几个参数
    --查看本机中Oracle的版本
        SQL> SELECT * FROM v$version;
 
        BANNER
        ----------------------------------------------------------------
        Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
        PL/SQL Release 10.2.0.1.0 - Production
        CORE    10.2.0.1.0      Production
        TNS for Linux: Version 10.2.0.1.0 - Production
        NLSRTL Version 10.2.0.1.0 - Production
 
    --查看和UNDO相关的参数
        SQL> SHOW PARAMETER undo;
 
        NAME                                 TYPE        VALUE
        ------------------------------------ ----------- ------------------------------
        undo_management                      string      MANUAL
        undo_retention                       integer     900
        undo_tablespace                      string      UNDOTBS1
           
    undo_management:
        设置数据库的撤销段是否使用自动管理模式,值可以为auto或manual,当为manual时将不使用撤销段,即不使用自动管理模式
        该参数为静态参数,修改后需重启实例才能生效
       
    undo_retention:
        指定撤销段数据在undo段中为非活动状态后被覆盖前保留的时间,单位为秒。在undo_management位auto时生效,为动态参数
       
    undo_tablespace:
        指定使用哪个表空间来实现数据的撤销,在undo_management位auto时生效,为动态参数
       
    retention guarantee子句:
        保证撤销保留,使用下面的操作来实现
            ALTER TABLESPACE undo_tablespace_name RETENTION GUARANTEE;
 
    --下面的查询中是当undo_management为manual时的结果集,可以看出撤销表空间的撤销段都处于offline状态   
        SQL> SELECT segment_name,tablespace_name,status FROM dba_rollback_segs;
 
        SEGMENT_NAME                   TABLESPACE_NAME                STATUS
        ------------------------------ ------------------------------ ----------------
        SYSTEM                         SYSTEM                         ONLINE
        _SYSSMU1$                      UNDOTBS1                       OFFLINE
        _SYSSMU2$                      UNDOTBS1                       OFFLINE
        _SYSSMU3$                      UNDOTBS1                       OFFLINE
        _SYSSMU4$                      UNDOTBS1                       OFFLINE
        _SYSSMU5$           &
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,