UNDO简介

来源:互联网 发布:js中clearinterval 编辑:程序博客网 时间:2024/05/16 17:27
UNDO数据也称为回滚(ROLLBACK)数据,它用于确保数据的一致性。  Oracle9i以前,管理UNDO数据需要建立专门的回滚段,从 Oracle9i之后,为了简化UNDO的管理,通过使用UNDO表空间可以自动管理UNDO数据。顾名思义,UNDO表空间是指专门存放UNDO 数据的表空间,当使用UNDO表空间时候,Oracle会自动在该表空间上建立回滚段,以供事务操作使用。  要点:UNDO表空间是Oracle9i的新特性          UNDO表空间只能用于存放回滚段,而不能存放其它段     UNDO表空间和回滚段管理不能同时使用    UNDO作用  1。读一致性    读一致性是由Oracle自动提供的,并且该特征是通过UNDO记录来实现的。  2。取消事务    (1)首先将UNDO数据放到回滚段中    (2)将新数据放到数据段中    (3)当执行ROLLBACK命令时将UNDO数据写入到数据段中  3。事务恢复    事务恢复是由Oracle Server自动完成的。  指定 UNDO 管理模式  从Oracle9i开始,管理UNDO数据有两种方法,一种是自动管理模式,即使用UNDO表空间管理UNDO数据;另外一种是手工管理模式,即使用回滚段管理UNDO数据。  1。使用自动管理模式    通过设置初始化参数UNDO_MANAGEMENT设置为AUTO。    相关参数设置: UNDO_MANAGEMENT:该参数用于指定UNDO数据管理模式,AUTO表示采用自动管            理模式,MANUAL 表示手工管理模式。            UNDO_TABLESPACE:该参数用于指定在自动管理模式下要使用的UNDO表空间名,该            参数可以动态修改。            UNDO_RETENTION:该参数用于指定保留UNDO数据的时间,默认值是900s. UNDO_SUPPRESS_ERRORS:该参数用于指定是否显示手工UNDO管理操作的错误信息,TRUE表示禁止显示错误信息;FALSE表示允许显示错误信息。  2。使用手工管理模式    通过设置初始化参数UNDO_MANAGEMENT设置为 MANUAL.此时需要规划回滚段个数和尺寸。  管理UNDO表空间  通过使用UNDO表空间来管理UNDO数据,可以简化回滚段的管理复杂性。  1。建立UNDO表空间    建立UNDO表空间的两种方法,一种是通过在执行CREATE DATABASE命令建立数据库时建立UNDO表空间一种是使用CREATE UNDO TABLESPACE来建立UNDO表空间    注意:在UNDO表空间上不能建立任何数据对象(表,索引)  (1).使用CREATE DATABASE命令建立UNDO表空间      create database nanjing controlfile reuse ...... ....... UNDO TABLESPACE undotbs_01 DATAFILE '/opt/OraclHome/Ora9i/dbs/undo01.dbf' 注意:UNDO TABLESPACE不是必须的选项,当你数据库采用自动管理模式管理时候,并且没有指         定该选项,那么在建立数据库时候会自动生成名称为SYS_UNDOTBS 的UNDO表空间。  (2). 使用CREATE UNDO TABLESPACE命令建立UNDO表空间    CREATE UNDO TABLESPACE undotbs02 DATAFILE '/opt/OracleHome/Ora9i/dbs/undo_02.dbf' SIZE 2M; 注意:不能指定DEFAULT STORAGE子句学习吧  切换UNDO表空间  一个Oracle数据库可以包含多个UNDO表空间,但同一时刻一个实例只能使用一个UNDO表空间,初始化参数 UNDO_TABLESPACE用于指定实例所要使用的UNDO表空间。  用下面的命令动态切换UNDO表空间  ALTER SYSTEM SET undo_tablespace = undotbs02 注意:当出现以下情况是 会报错信息        表空间不存在        表空间不是UNDO表空间        UNDO 表空间正在由另一个实例使用  将自动管理模式转变为手工管理模式,可以执行下面的命令:   ALTER SYSTEM SET undo_tablespace=''; 监视UNDO空间信息  通过查询动态性能视图v$UNDOSTAT 和v$TABLESPACE取得这些信息回滚段存储的是dml操作的前映象;oracle执行dml操作的步骤是这样的:1,从磁盘文件中将数据读入数据缓冲区;2,当一个update或者delete执行的时候,将缓冲区中的数据块先写到回滚段中3,然后将缓冲区中的数据块对应记录修改过来(此时数据变成dirty block)4,如果这时执行rollback,系统后台进程将会使用回滚段中的数据块替换缓冲区中的数据块;5,如果执行的是commit,则oracle会释放对回滚段的占用。回滚段的管理方式是循环覆盖的。一个表空间中可以有多个回滚段,一个回滚段中允许有多个区。一个回滚段对应多个事务,每个事务只能使用一个回滚段。假设回滚段1有四个区;dml事务a占用了第一个区而一直没有commit;事务b占用第四个区,如果b中数据较多,而回滚段又不允许扩展,则事务b需要一直等待a释放第一个区才可以。在这里,如果一个update或者delete语句一直没有执行commit;那么事务将会保持对回滚段的持续占用,这时新的update操作执行前,必须等待前面的dml操作释放需要的回滚空间(当然,如果回滚段允许扩展将不存在这个问题)。