当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-05-25

    本文导语: --================================== --Oracle 回滚(ROLLBACK)和撤销(UNDO) --==================================   一、回滚(ROLLBACK)和撤销(UNDO)   回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。   在9i版本以前 Oracle使用数据库中的...

--==================================

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

--==================================

 

一、回滚(ROLLBACK)和撤销(UNDO)

 

回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。

 

在9i版本以前

Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作

每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理

在9i及后续版本

提供了一种新的回滚数据的管理方式,即使用Oracle自动管理的撤销(Undo)表空间

自动撤销管理表空间统一管理所有DML的回滚操作,简化了对于回滚工作的管理

在9i,10g中的回滚段仅仅用作保留向后兼容

撤销段代替了原有版本中的回滚段,因此本文所有描述均使用撤销

 

撤销的实质意味着将所作的修改退回到修改前的状态,即倒退所有DML语句

 

关于如何创建恢复目录数据库及恢复目录脚本,此处省略,请参考:

RMAN catalog 的创建和使用

基于catalog 创建RMAN存储脚本

基于catalog 的RMAN 备份与恢复

 

二、撤销段中的内容及相关特性

对于任何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

CORE10.2.0.1.0Production

TNS for Linux: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

 

--查看和UNDO相关的参数

SQL> SHOW PARAMETER undo;

 

NAMETYPEVALUE

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

undo_managementstringMANUAL

undo_retentioninteger900

undo_tablespacestringUNDOTBS1

 

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_NAMETABLESPACE_NAMESTATUS

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

SYSTEMSYSTEMONLINE

_SYSSMU1$UNDOTBS1OFFLINE

_SYSSMU2$UNDOTBS1OFFLINE

_SYSSMU3$UNDOTBS1OFFLINE

_SYSSMU4$UNDOTBS1OFFLINE

_SYSSMU5$UNDOTBS1OFFLINE

_SYSSMU6$UNDOTBS1OFFLINE

_SYSSMU7$UNDOTBS1OFFLINE

_SYSSMU8$UNDOTBS1OFFLINE

_SYSSMU9$UNDOTBS1OFFLINE

_SYSSMU10$UNDOTBS1OFFLINE

 

 

--在undo_management 参数为manual时,对scott.emp插入一条新记录,收到了错误提示

--非系统表空间不能够使用回滚段

SQL> INSERT INTO scott.emp(empno,ename,salary)

2VALUES(6666,'Jenney',3000);

INSERT INTO scott.emp(empno,ename,salary)

*

ERROR at line 1:

ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS'

 

--查看段的类型,发现仅仅system表空间存在ROLLBACK 段,所以前一条插入语句收到错误提示

SQL> SELECT DISTINCT segment_type,tablespace_name FROM dba_segments

2ORDER BY tablespace_name;

 

SEGMENT_TYPETABLESPACE_NAME

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

INDEXEXAMPLE

INDEX PARTITIONEXAMPLE

LOBINDEXEXAMPLE

LOBSEGMENTEXAMPLE

NESTED TABLEEXAMPLE

TABLEEXAMPLE

TABLE PARTITIONEXAMPLE

INDEXSYSAUX

INDEX PARTITIONSYSAUX

LOB PARTITIONSYSAUX

LOBINDEXSYSAUX

 

SEGMENT_TYPETABLESPACE_NAME

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

LOBSEGMENTSYSAUX

NESTED TABLESYSAUX

TABLESYSAUX

TABLE PARTITIONSYSAUX

CLUSTERSYSTEM

INDEXSYSTEM

LOBINDEXSYSTEM

LOBSEGMENTSYSTEM

NESTED TABLESYSTEM

ROLLBACKSYSTEM--与之前的版本兼容的回滚段

TABLESYSTEM

 

SEGMENT_TYPETABLESPACE_NAME

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

TABLETBS1

TYPE2 UNDOUNDOTBS1--9i之后使用的撤销段

INDEXUSERS

LOBINDEXUSERS

LOBSEGMENTUSERS

NESTED TABLEUSERS

TABLEUSERS

 

--下面将undo_management改为支持自动管理,需要重启实例

SQL> ALTER SYSTEM SET undo_management = 'auto' SCOPE = SPFILE;

 

System altered.

 

SQL> SHUTDOWN IMMEDIATE;

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> STARTUP;

ORACLE instance started.

 

Total System Global Area251658240 bytes

Fixed Size1218796 bytes

Variable Size67110676 bytes

Database Buffers180355072 bytes

Redo Buffers2973696 bytes

Database mounted.

Database opened.

 

--再次查看dba_rollback_segs视图所有的撤销段全部处于online状态

--注意第一行为system表空间的撤销段,用于系统表空间的撤销

SQL> SELECT segment_name,tablespace_name,status FROM dba_rollback_segs;

 

SEGMENT_NAMETABLESPACE_NAMESTATUS

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

SYSTEMSYSTEMONLINE

_SYSSMU1$UNDOTBS1ONLINE

_SYSSMU2$UNDOTBS1ONLINE

_SYSSMU3$UNDOTBS1ONLINE

_SYSSMU4$UNDOTBS1ONLINE

_SYSSMU5$UNDOTBS1ONLINE

_SYSSMU6$UNDOTBS1ONLINE

_SYSSMU7$UNDOTBS1ONLINE

_SYSSMU8$UNDOTBS1ONLINE

_SYSSMU9$UNDOTBS1ONLINE

_SYSSMU10$UNDOTBS1ONLINE

由上面的示例可知:

ROLLBACK 段:--与之前的版本兼容的回滚段

TYPE2 UNDO 段:--9i之后使用的撤销段

关于回滚,一个时刻仅能使用一种类段类型,即要么使用与以前版本兼容的回滚段,要么使用撤销段

事实上,在9i之后仅仅支持撤销段,从上面错误的提示即可证实

 

--查看DML语句产生的事务

SQL> SHOW USER;

USER is "SYS"

SQL> SELECT * FROM scott.emp WHERE ename = 'SCOTT';

 

EMPNO ENAMEJOBMGR HIREDATESALARYDEPTNO

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

7788 SCOTTANALYST7566 19-APR-87350020

 

SQL> UPDATE scott.emp SET sal = sal * 2 WHEREename = 'SCOTT';

 

1 row updated.

 

SQL> SELECT addr,xidusn,status,start_time,used_ublk

2FROM v$transaction;

 

ADDRXIDUSN STATUSSTART_TIMEUSED_UBLK

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

2DA2B17C9 ACTIVE07/10/10 20:29:081

 

--查看当前哪些用户使用撤销段以及段的大小,启动时间,活动状态等

SQL> SELECT t.xidusn,t.start_time,t.used_ublk,t.status,

s.username,r.segment_name

FROM v$transaction t

JOIN v$session s

ON t.ses_addr = s.saddr

JOIN dba_rollback_segs r

ON r.segment_id = t.xidusn ;

 

XIDUSN START_TIMEUSED_UBLK STATUSUSERNAMESEGMENT_NAME

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

9 07/10/10 20:29:081 ACTIVESYS_SYSSMU9$


    
 
 

您可能感兴趣的文章:

  • Oracle 9i中自动撤销管理的优点分析
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 管理Undo数据
  • Oracle释放undo表空间
  • [Oracle] 解析在没有备份的情况下undo损坏怎么办
  • Oracle undo_management参数不一致错误
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,