Welcome 微信登录

首页 / 数据库 / MySQL / Oracle 回滚(ROLLBACK)和撤销(UNDO)

--==================================--Oracle 回滚(ROLLBACK)和撤销(UNDO)--================================== 一、回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。 在9i版本以前Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理在9i及后续版本提供了一种新的回滚数据的管理方式,即使用Oracle自动管理的撤销(Undo)表空间自动撤销管理表空间统一管理所有DML的回滚操作,简化了对于回滚工作的管理在9i,10g中的回滚段仅仅用作保留向后兼容撤销段代替了原有版本中的回滚段,因此本文所有描述均使用撤销 撤销的实质意味着将所作的修改退回到修改前的状态,即倒退所有DML语句 关于如何创建恢复目录数据库及恢复目录脚本,此处省略,请参考:RMAN catalog 的创建和使用 http://www.linuxidc.com/Linux/2013-08/88788.htm基于catalog 创建RMAN存储脚本 http://www.linuxidc.com/Linux/2013-08/88789.htm基于catalog 的RMAN 备份与恢复 http://www.linuxidc.com/Linux/2013-08/88790.htm 二、撤销段中的内容及相关特性对于任何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 - ProdPL/SQL Release 10.2.0.1.0 - ProductionCORE10.2.0.1.0ProductionTNS for Linux: Version 10.2.0.1.0 - ProductionNLSRTL Version 10.2.0.1.0 - Production --查看和UNDO相关的参数SQL> SHOW PARAMETER undo; NAMETYPEVALUE------------------------------------ ----------- ------------------------------undo_managementstringMANUALundo_retentioninteger900undo_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_segments2ORDER BY tablespace_name; SEGMENT_TYPETABLESPACE_NAME------------------ ------------------------------INDEXEXAMPLEINDEX PARTITIONEXAMPLELOBINDEXEXAMPLELOBSEGMENTEXAMPLENESTED TABLEEXAMPLETABLEEXAMPLETABLE PARTITIONEXAMPLEINDEXSYSAUXINDEX PARTITIONSYSAUXLOB PARTITIONSYSAUXLOBINDEXSYSAUX SEGMENT_TYPETABLESPACE_NAME------------------ ------------------------------LOBSEGMENTSYSAUXNESTED TABLESYSAUXTABLESYSAUXTABLE PARTITIONSYSAUXCLUSTERSYSTEMINDEXSYSTEMLOBINDEXSYSTEMLOBSEGMENTSYSTEMNESTED TABLESYSTEMROLLBACKSYSTEM--与之前的版本兼容的回滚段TABLESYSTEM SEGMENT_TYPETABLESPACE_NAME------------------ ------------------------------TABLETBS1TYPE2 UNDOUNDOTBS1--9i之后使用的撤销段INDEXUSERSLOBINDEXUSERSLOBSEGMENTUSERSNESTED TABLEUSERSTABLEUSERS --下面将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 bytesFixed Size1218796 bytesVariable Size67110676 bytesDatabase Buffers180355072 bytesRedo Buffers2973696 bytesDatabase 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_ublk2FROM 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_nameFROM v$transaction tJOIN v$session sON t.ses_addr = s.saddrJOIN dba_rollback_segs rON r.segment_id = t.xidusn ; XIDUSN START_TIMEUSED_UBLK STATUSUSERNAMESEGMENT_NAME---------- -------------------- ---------- ---------------- ------------------------------ -------------9 07/10/10 20:29:081 ACTIVESYS_SYSSMU9$
  • 1
  • 2
  • 3
  • 下一页
Oralce 10g 使用DBCA创建数据库MySQL 压力测试工具 mysqlslap 使用总结相关资讯      Oracle回滚  Oracle Undo 
  • Oracle中利用undo进行数据的恢复操  (11/27/2015 09:31:30)
  • Oracle Undo tablespace恢复(无备  (06/27/2014 20:31:17)
  • 调整Oracle回滚的速度  (03/29/2014 14:15:49)
  • Oracle UNDO 监控  (08/03/2014 07:26:01)
  • Oracle回滚机制深入研究  (05/19/2014 19:17:27)
  • Oracle undo 机制  (01/23/2014 14:49:33)
本文评论 查看全部评论 (0)
表情: 姓名: 字数