来源:蜘蛛抓取(WebSpider)
时间:2017-10-08 14:16
标签:
啥牌子折叠手机好
网站导航:
热门搜索:
您现在的位置: >
> 浏览信息
Oracle数据库中事物与回滚的一点研究
时间: 00:59
来源: 作者:
&&& 在中,这种操作很简单。当事务回滚时,事件被记录在视图 V$SESSION_LONGOPS 中,该视图显示长期运行的事务。用于回滚,如果进程耗时超过六秒,则记录出现在该视图中。在回滚执行以后,您可能会隐藏所查看的监视屏幕并执行以下的查询:
&&&&&& select&time_remaining& from&v$session_longops& where&sid&=&;
&&& 既然您意识到这个视图 V$SESSION_LONGOPS 的重要性,就让我们来看它必须提供的其他信息。该视图在 Oracle数据库的预览版中提供,但没有捕获关于回滚事务的信息。为了以一种易读的方式显示所有的列,我们将使用由 Tom Kyte 在
中所描述的 PRINT_TABLE 函数。此过程简单地以表格方式而不是常用的行方式来显示列。
&&&&& SQL&&set&serveroutput&on&size&999999 SQL&&exec&print_table('select&*&from&v$session_longops&where&sid&=&9') SID&:&9 SERIAL# &:&68 OPNAME:Transaction&Rollback TARGET: TARGET_DESC &:xid:0x000e.01c. SOFAR&:&20554 TOTALWORK&:&10234 UNITS&:Blocks START_TIME:07-dec-:07 LAST_UPDATE_TIME :07-dec-:24 TIME_REMAINING:&77 ELAPSED_SECONDS &:&77 CONTEXT &:&0 MESSAGE &:Transaction&Rollback:xid:0x000e.01c.&: 10234&out&of&20554&Blocks&done USERNAME :SYS SQL_ADDRESS &:ED08 SQL_HASH_VALUE:& SQL_ID:306w9c5amyanr QCSID&:&0
&&& 注意,此处显示对行的所有更改,即使删除并重新插入行时也是如此。VERSION_OPERATION 列显示对该行执行的操作 (Insert/Update/Delete)。完成这些操作不需要历史表或额外的列。
让我们仔细检查这些列中的每一列。在会话中可能会有超过多个长期运行操作 ― 特别是因为视图中包含以前的会话中所有长期运行操作的历史。列 OPNAME 显示该记录用于“事务回滚”,这为我们指出了正确的方向。列 TIME_REMAINING 显示所评估的剩余时间秒数,这在前面已经描述过,而列 ELAPSED_SECONDS 显示到目前为止所消耗的时间。
那么该表如何提供对剩余时间的评估呢?可以在列 TOTALWORK 中找到线索,该列显示要完成的“工作”总量,还有 SOFAR 显示到目前为止已经完成了多少工作。工作的单位显示在列 UNITS 中。在本例中以数据块为单位;因此,到目前为止已经回滚了 20,554 个数据块中共计 10,234 个数据块。此操作到目前为止已消耗了68秒。因此,剩余数据块将消耗:
&68&*&(&10234&/&()&)&˜&68&秒&&&&&&& 但您不必利用这种方法来获得该数值,它已经清楚地显示出来了。最后,列 LAST_UPDATE_TIME 显示有关当前视图内容的时间,这将用于加强您对结果的解释。
[1]&[2]&下一页
本文标题:
本文地址:
免责声明:本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。前滚和回滚 - Alice Sun - 博客园
随笔 - 25, 文章 - 18, 评论 - 0, 引用 - 0
一. 什么时候需要实例恢复
&&&&&& 在shutdown normal or shutdown immediate下,也就是所谓的clean shutdown,checkpoint也会自动触发,并且把SCN纪录写回。 当发生checkpoint时,会把SCN写到四个地方:
三个地方于control file内:
(1)SYSTEM CHECKPOINT SCN
(2)Datafile checkpoint SCN
(3)Stop SCN
一个在datafile header内:
1.1 Clean shutdown 时
&&&&&& 当clean shutdown 时,checkpoint会进行,并且此时datafile的stop scn和控制文件里的start scn会相同。 等到open数据库时,Oracle检查datafile header中的start scn和存于control file中的datafile的scn是否相同, 如果相同,接着检查start scn和stop scn是否相同,如果仍然相同,数据库就会正常开启,否则就需要recovery。
&&&&&& 等到数据库开启后,储存在control file中的stop scn就会恢复为NULL值,此时表示datafile是open在正常模式下了。
1.2 非正常shutdown
&&&&&& 如果不正常SHUTDOWN (shutdown abort),则mount数据库后,会发现stop scn并不是等于其它位置的scn, 而是等于NULL,这表示Oracle在shutdown时没有进行checkpoint,下次开机必须进行crash recovery(实例恢复)。
注意一点:
&&&&&& (1)启动数据库时,如果发现STOP SCN = NULL,表示需要进行crash recovery;
&&&&&& (2)启动数据库时,如果发现有datafile header的START SCN 不等于储存于CONTROLFILE的DATAFILE SCN,表示需要进行Media recovery
1.3 crash recovery 顺序问题
&&&&&& 必须先进行roll forward(从redo log file中从目前的start SCN开始,重做后面的已提交之交易)。 再从roll back segment 做rollback未完成(dead transaction)交易。检验controlfile中的SCN会等于datafile header的SCN
二.& Crash Recovery 过程
&&&&&& 当数据库突然崩溃,而还没有来得及将buffer cache里的脏数据块刷新到数据文件里,同时在实例崩溃时正在运行着的事务被突然中断,则事务为中间状态,也就是既没有提交也没有回滚。这时数据文件里的内容不能体现实例崩溃时的状态。这样关闭的数据库是不一致的。
&&&&&& 下次启动实例时,Oracle会由SMON进程自动进行实例恢复。实例启动时,SMON进程会去检查控制文件中所记录的、每个在线的、可读写的数据文件的END SCN号。
&&&&&& 数据库正常运行过程中,该END SCN号始终为NULL,而当数据库正常关闭时,会进行完全检查点,并将检查点SCN号更新该字段。
&&& &&&而崩溃时,Oracle还来不及更新该字段,则该字段仍然为NULL。当SMON进程发现该字段为空时,就知道实例在上次没有正常关闭,于是由SMON进程就开始进行实例恢复了。
&&&&&& SMON进程进行实例恢复时,会从控制文件中获得检查点位置。于是,SMON进程到联机日志文件中,找到该检查点位置,然后从该检查点位置开始往下,应用所有的重做条目,从而在buffer cache里又恢复了实例崩溃那个时间点的状态。这个过程叫做前滚,前滚完毕以后,buffer cache里既有崩溃时已经提交还没有写入数据文件的脏数据块,也还有事务被突然终止,而导致的既没有提交又没有回滚的事务所弄脏的数据块。
&&&&&& 前滚一旦完毕,SMON进程立即打开数据库。但是,这时的数据库中还含有那些中间状态的、既没有提交又没有回滚的脏块,这种脏块是不能存在于数据库中的,因为它们并没有被提交,必须被回滚。打开数据库以后,SMON进程会在后台进行回滚。
&&&&&& 有时,数据库打开以后,SMON进程还没来得及回滚这些中间状态的数据块时,就有用户进程发出读取这些数据块的请求。这时,服务器进程在将这些块返回给用户之前,由服务器进程负责进行回滚,回滚完毕后,将数据块的内容返回给用户。
三. 为什么数据库的实例恢复是先前滚再回滚
&&&&&& 回滚段实际上也是以回滚表空间的形式存在的,既然是表空间,那么肯定就有对应的数据文件,同时在buffer cache 中就会存在映像块,这一点和其他表空间的数据文件相同。
&&&&&& 当发生DML操作时,既要生成REDO(针对DML操作本身的REDO Entry)也要生成UNDO(用于回滚该DML操作,记录在UNDO表空间中),但是既然UNDO信息也是使用回滚表空间来存放的,那么该DML操作对应的UNDO信息(在BUFFER CACHE生成对应中的UNDO BLOCK)就会首先生成其对应的REDO信息(UNDO BLOCK's REDO Entry)并写入Log Buffer中。
&&&&&& 这样做的原因是因为Buffer Cache中的有关UNDO表空间的块也可能因为数据库故障而丢失,为了保障在下一次启动时能够顺利进行回滚,首先就必须使用REDO日志来恢复UNDO段(实际上是先回复Buffer Cache中的脏数据块,然后由Checkpoint写入UNDO段中),在数据库OPEN以后再使用UNDO信息来进行回滚,达到一致性的目的。
&&&&&& 生成完UNDO BLOCK's REDO Entry后才轮到该DML语句对应的REDO Entry,最后再修改Buffer Cache中的Block,该Block同时变为脏数据块。
&&&&&& 实际上,简单点说REDO的作用就是记录所有的数据库更改,包括UNDO表空间在内。
本篇文章来源于 Linux公社网站()& 原文链接:/Linux/07.htmmincommit=3,过程中数据库崩溃,如何崩溃恢复数据库配置参数中设置mincommit=3,这意味着并不是每次commit都会刷新日志缓冲区。如果已经有两个事务执行完毕并提交,但时间还没有1秒,所以,这些日志都还存在在日志缓冲区中,如果这时候数据库崩溃,那么这两个已经提交的事务该如何处理呢?如果说回滚,但缺少回滚需要的日志啊,数据库...数据库配置参数中设置mincommit=3,这意味着并不是每次commit都会刷新日志缓冲区。如果已经有两个事务执行完毕并提交,但时间还没有1秒,所以,这些日志都还存在在日志缓冲区中,如果这时候数据库崩溃,那么这两个已经提交的事务该如何处理呢?如果说回滚,但缺少回滚需要的日志啊,数据库怎么知道该如何回滚掉这两个事务执行的操作。如果这两个事务的数据已从缓冲池刷入磁盘了,但也缺少这两个事务的日志啊,今后做数据库前滚恢复的时候也会出现问题。请问,DB2对这种情况是怎么处理,做到数据库的一致性呢?关注问题19回答数据仓库工程师
, 招行软件中心“当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值。”在时间没有达到1秒和提交请求数量未达到该参数值时,不会提交事务。“当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值。”在时间没有达到1秒和提交请求数量未达到该参数值时,不会提交事务。赞同数据库管理员
, ibm回复 1# 2013software & &没有写到盘上就丢了。FYI MINCOMMIT is ignored in the following versions and fix packs of DB2:- DB2 9.1 - all DB2 9.1 fix packs on AIX- DB2 9.5 - all DB2 9.5 fix packs on AIX- DB2 9.7 - GA, FP1 and FP2 on AIX. It's re-...回复
2013software & &没有写到盘上就丢了。FYI MINCOMMIT is ignored in the following versions and fix packs of DB2:- DB2 9.1 - all DB2 9.1 fix packs on AIX- DB2 9.5 - all DB2 9.5 fix packs on AIX- DB2 9.7 - GA, FP1 and FP2 on AIX. It's re-enabled starting with FP3.- DB2 9.8 - GA, FP1 and FP2 on AIX. It's re-enabled starting with FP3.赞同软件开发工程师
, bocn在日志没有刷成功之前,bufferpool里的页是不会先被刷到磁盘上的。这就是所谓的WAL协议。一旦log buffer没刷成功就崩溃了,DB2再起来的时候就像什么都没发生过一样。在日志没有刷成功之前,bufferpool里的页是不会先被刷到磁盘上的。这就是所谓的WAL协议。一旦log buffer没刷成功就崩溃了,DB2再起来的时候就像什么都没发生过一样。赞同软件开发工程师
, 交通银行回复 4# mdkii & & 当数据库崩溃的时候,有些数据已经提交还没有来得及从缓冲池写入磁盘,有些数据还没有提交但已经写入了磁盘。& & 对于粗体部分,针对你的回答,我现在明白了,之所以没有提交的事务,数据也被刷入了磁盘,是因为日志缓冲池满了,日志缓冲池的数据...回复
mdkii & & 当数据库崩溃的时候,有些数据已经提交还没有来得及从缓冲池写入磁盘,有些数据还没有提交但已经写入了磁盘。& & 对于粗体部分,针对你的回答,我现在明白了,之所以没有提交的事务,数据也被刷入了磁盘,是因为日志缓冲池满了,日志缓冲池的数据已经写入到日志文件了,数据库管理器才会有可能把没有提交的事务的数据从缓冲池刷入磁盘。& & WAL协议是个关键,谢谢。& & 不过,我觉得jimmy的回复也是正确的,正如他说到的:当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值。这个提交请求被挂起是个关键点,有这个解释,就明白了,DB2数据库管理器在这种情况下崩溃是怎样做到保持数据一致性的。赞同系统工程师回复&&mdkii & & 当数据库崩溃的时候,有些数据已经提交还没有来得及从缓冲池写入磁盘,有些数据还没有 ...2013software 发表于
---当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值任何应用提...回复&&mdkii & & 当数据库崩溃的时候,有些数据已经提交还没有来得及从缓冲池写入磁盘,有些数据还没有 ...2013software 发表于
---当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值任何应用提交时,如果commit动作没完成,db2agent都必须等待的。您可以关注下9号的讲座。赞同软件开发工程师
, 交通银行回复 6# 田强 & & 9号的讲座,到时在哪里看啊?& & 请告诉,谢谢!回复
田强 & & 9号的讲座,到时在哪里看啊?& & 请告诉,谢谢!赞同系统工程师回复&&田强 & & 9号的讲座,到时在哪里看啊?& & 请告诉,谢谢!2013software 发表于
这里:& & http://www.db2china.net/club/thread-.html回复&&田强 & & 9号的讲座,到时在哪里看啊?& & 请告诉,谢谢!2013software 发表于
这里:& & 赞同其它
, null“当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值。”在 ...jimmy 发表于
学到了,这些细节是我最容易忽视的。“当执行提交分组时,应用程序的提交请求会被挂起,直到时间过去1秒或提交请求的数量等于该参数值。”在 ...jimmy 发表于
学到了,这些细节是我最容易忽视的。赞同软件开发工程师
, IBM学习了。。。学习了。。。赞同撰写回答软件开发工程师, 交通银行关注2发布103回答57请稍候...Oracle回滚和撤销
Oracle回滚和撤销
一、回滚(ROLLBACK)和撤销(UNDO) 回滚和前滚是保证Oracle数据库中的数据处于一致性状态的重要手段。 在9i版本以前 Oracle使用数据库中的回滚段来实现未提交数据或因系统故障导致实例崩溃时进行回滚操作 每一个表空间需要创建回滚段,各个表空间对回滚段实现各自的管理 在9i及后续版本 提供了一种新的回滚数据的管理方式,即使用Oracle自动管理的撤销(Undo)表空间 自动撤销管理表空间统一管理所有DML的回滚操作,简化了对于回滚工作的管理 在i,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$ 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 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_ SEGMENT_NAME & & & & & & & & & TABLESPACE_NAME & & & & & & & &STATUS ------------------------------ ------------------------------ ---------------- SYSTEM & & & & & & & & & & & & SYSTEM & & & & & & & & & & & & ONLINE _SYSSMU1$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU2$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU3$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU4$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU5$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU6$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU7$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU8$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU9$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & OFFLINE _SYSSMU10$ & & & & & & & & & & UNDOTBS1 & & & & & & & & & & & OFFLINE --在undo_management 参数为manual时,对scott.emp插入一条新记录,收到了错误提示 --非系统表空间不能够使用回滚段 SQL& INSERT INTO scott.emp(empno,ename,salary) 2 &VALUES(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 2 &ORDER BY tablespace_ SEGMENT_TYPE & & & TABLESPACE_NAME ------------------ ------------------------------ INDEX & & & & & & &EXAMPLE INDEX PARTITION & &EXAMPLE LOBINDEX & & & & & EXAMPLE LOBSEGMENT & & & & EXAMPLE NESTED TABLE & & & EXAMPLE TABLE & & & & & & &EXAMPLE TABLE PARTITION & &EXAMPLE INDEX & & & & & & &SYSAUX INDEX PARTITION & &SYSAUX LOB PARTITION & & &SYSAUX LOBINDEX & & & & & SYSAUX SEGMENT_TYPE & & & TABLESPACE_NAME ------------------ ------------------------------ LOBSEGMENT & & & & SYSAUX NESTED TABLE & & & SYSAUX TABLE & & & & & & &SYSAUX TABLE PARTITION & &SYSAUX CLUSTER & & & & & &SYSTEM INDEX & & & & & & &SYSTEM LOBINDEX & & & & & SYSTEM LOBSEGMENT & & & & SYSTEM NESTED TABLE & & & SYSTEM ROLLBACK & & & & & SYSTEM & & & --与之前的版本兼容的回滚段 TABLE & & & & & & &SYSTEM SEGMENT_TYPE & & & TABLESPACE_NAME ------------------ ------------------------------ TABLE & & & & & & &TBS1 TYPE2 UNDO & & & & UNDOTBS1 & & --9i之后使用的撤销段 INDEX & & & & & & &USERS LOBINDEX & & & & & USERS LOBSEGMENT & & & & USERS NESTED TABLE & & & USERS TABLE & & & & & & &USERS --下面将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 Area & bytes Fixed Size & & & & & & & & &1218796 bytes Variable Size & & & & & & & bytes Database Buffers & & & & & bytes Redo Buffers & & & & & & & &2973696 bytes Database mounted. Database opened. --再次查看dba_rollback_segs视图所有的撤销段全部处于online状态 --注意第一行为system表空间的撤销段,用于系统表空间的撤销 SQL& SELECT segment_name,tablespace_name,status FROM dba_rollback_ SEGMENT_NAME & & & & & & & & & TABLESPACE_NAME & & & & & & & &STATUS ------------------------------ ------------------------------ ---------------- SYSTEM & & & & & & & & & & & & SYSTEM & & & & & & & & & & & & ONLINE & _SYSSMU1$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU2$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU3$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU4$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU5$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU6$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU7$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU8$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU9$ & & & & & & & & & & &UNDOTBS1 & & & & & & & & & & & ONLINE _SYSSMU10$ & & & & & & & & & & UNDOTBS1 & & & & & & & & & & & ONLINE 由上面的示例可知: ROLLBACK 段: & & &--与之前的版本兼容的回滚段 TYPE2 UNDO 段: & &--9i之后使用的撤销段 关于回滚,一个时刻仅能使用一种类段类型,即要么使用与以前版本兼容的回滚段,要么使用撤销段 事实上,在i之后仅仅支持撤销段,从上面错误的提示即可证实 --查看DML语句产生的事务 SQL& SHOW USER; & & & & & & & & & & & & & & & & & & USER is &SYS& SQL& SELECT * FROM scott.emp WHERE ename = 'SCOTT'; EMPNO ENAME & & & & & JOB & & & & & & &MGR HIREDATE & & &SALARY & & DEPTNO ---------- --------------- --------- ---------- --------- ---------- ---------- 7788 SCOTT & & & & & ANALYST & & & & 7566 19-APR-87 & & & 3500 & & & & 20 SQL& UPDATE scott.emp SET sal = sal * 2 WHERE &ename = 'SCOTT'; 1 row updated. SQL& SELECT addr,xidusn,status,start_time,used_ublk 2 &FROM v$ ADDR & & & & XIDUSN STATUS & & & & & START_TIME & & & & & &USED_UBLK -------- ---------- ---------------- -------------------- ---------- 2DA2B17C & & & & &9 ACTIVE & & & & & 07/10/10 20:29:08 & & & & & & 1 --查看当前哪些用户使用撤销段以及段的大小,启动时间,活动状态等 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 START_TIME & & & & & &USED_UBLK STATUS & & & & & USERNAME & & & & & & & & & & & SEGMENT_NAME ---------- -------------------- ---------- ---------------- ------------------------------ ------------- 9 07/10/10 20:29:08 & & & & & & 1 ACTIVE & & & & & SYS & & & & & & & & & & & & & &_SYSSMU9$ 四、UNDO表空间的创建与管理 & & 创建UNDO表空间 创建语法: CREATE UNDO TABLESPACE tablespace_name DATAFILE '...' SIZE n 更多表空间的创建: 请参照:Oracle 表空间与数据文件 切换UNDO表空间 & & 实例中允许多个UNDO表空间存在 可以从一个UNDO表空间切换到另外一个UNDO表空间 任一时刻只能有一个UNDO表空间被指定 使用ALTER SYSTEM SET undo_tablespace = undo_tablespace_name实现切换 删除UNDO表空间 DROP TABLESPACE undo_tablespace_name 任意实例的UNDO表空间在非活动状态可以删除 对于活动状态的UNDO表空间,应当先将切换到其它表空间,在所有事务完成后再删除该表空间 演示创建、切换及删除UNDO表空间 --查看当前系统中的表空间 & & SQL& SELECT file_name,tablespace_name FROM dba_data_ FILE_NAME & & & & & & & & & & & & & & & & & & & & & & & & & &TABLESPACE_NAME ------------------------------------------------------------ ------------------------------ /u01/app/oracle/oradata/orcl/tbs1_2.dbf & & & & & & & & & & &TBS1 /u01/app/oracle/oradata/orcl/tbs1_1.dbf & & & & & & & & & & &TBS1 /u01/app/oracle/oradata/orcl/example01.dbf & & & & & & & & & EXAMPLE /u01/app/oracle/oradata/orcl/users01.dbf & & & & & & & & & & USERS /u01/app/oracle/oradata/orcl/sysaux01.dbf & & & & & & & & & &SYSAUX /u01/app/oracle/oradata/orcl/undotbs01.dbf & & & & & & & & & UNDOTBS1 /u01/app/oracle/oradata/orcl/system01.dbf & & & & & & & & & &SYSTEM --创建一个新的UNDO表空间undo2 SQL& CREATE UNDO TABLESPACE undo2 2 &DATAFILE '/u01/app/oracle/oradata/orcl/undotbs02.dbf' SIZE 3M 3 &AUTOEXTEND ON; Tablespace created. SQL& SELECT file_name,tablespace_name FROM dba_data_files WHERE tablespace_name LIKE 'UNDO%'; FILE_NAME & & & & & & & & & & & & & & & & & & & & & & & & & &TABLESPACE_NAME ------------------------------------------------------------ ------------------------------ /u01/app/oracle/oradata/orcl/undotbs01.dbf & & & & & & & & & UNDOTBS1 /u01/app/oracle/oradata/orcl/undotbs02.dbf & & & & & & & & & UNDO2 --查看当前系统使用的UNDO表空间为UNDOTBS1 SQL& SELECT name,value FROM v$parameter WHERE name LIKE 'undo%'; NAME & & & & & & & & & & & & & VALUE ------------------------------ -------------------------------------------------- undo_management & & & & & & & &AUTO undo_tablespace & & & & & & & &UNDOTBS1 undo_retention & & & & & & & & 900 --创建一张表tb_test用于演示,假定该会话为session1 SQL& CREATE TABLE tb_test 2 &( 3 & & &ID INT, 4 & & &Name VARCHAR2(20) 5 &); Table created. --插入一条记录到tb_test,此时未提交将产生UNDO 信息 SQL& INSERT INTO tb_test SELECT 1,'Robinson' FROM 1 row created. --此时打开另外一个回话,假定为session2,在session2中切换表空间 SQL& ALTER SYSTEM SET undo_tablespace = 'undo2'; & System altered. & --undotbs1中有未提交的事务,竟然可以成功切换?如此这般闪回时估计会有问题 SQL& SHOW PARAMETER NAME & & & & & & & & & & & & & & & & TYPE & & & &VALUE ------------------------------------ ----------- ------------------------------ undo_management & & & & & & & & & & &string & & &AUTO undo_retention & & & & & & & & & & & integer & & 900 undo_tablespace & & & & & & & & & & &string & & &undo2 --在session1中执行commit SQL& COMMIT; Commit complete. & --成功执行了commit,且下面的查询看到了提交后的结果 SQL& SELECT * FROM tb_ ID NAME ---------- ------------------------------ 1 Robinson --登出系统后再次查看,结果依然存在,比较纳闷 & & & & SQL& exit Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options [uniread] Saved history (716 lines) [oracle@robinson ~]$ sqlplus / SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jul 10 21:29:36 2010 Copyright (c) , Oracle. &All rights reserved. Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production With the Partitioning, OLAP and Data Mining options SQL& SELECT * FROM tb_ ID NAME ---------- -------------------- 1 Robinson --删除UNDO表空间 --在session1中插入一条新记录 SQL& INSERT INTO tb_test SELECT 2,'Jack' FROM DUAL; 1 row created. --在session2中将撤销表空间切换为undotbs1 SQL& ALTER SYSTEM SET undo_tablespace = 'undotbs1'; System altered. --紧接着在该回话中删除undo2,提示正在使用 SQL& DROP TABLESPACE undo2; DROP TABLESPACE undo2 * ERROR at line 1: ORA-30013: undo tablespace 'UNDO2' is currently in use --在session1中提交事务 SQL& COMMIT; Commit complete. --在session2中再次删除表空间undo2,收到了相同的错误提示 SQL& / DROP TABLESPACE undo2 * ERROR at line 1: ORA-30013: undo tablespace 'UNDO2' is currently in use SQL& SHOW PARAMETER undo & --查看的确是已切换到undotbs1 NAME & & & & & & & & & & & & & & & & TYPE & & & &VALUE ------------------------------------ ----------- ------------------------------ undo_management & & & & & & & & & & &string & & &AUTO undo_retention & & & & & & & & & & & integer & & 900 undo_tablespace & & & & & & & & & & &string & & &undotbs1 --在session2中再次执行表空间切换到undotbs1 SQL& ALTER SYSTEM SET undo_tablespace = 'undotbs1'; System altered. --此时undo2成功删除,可以看出需要在将活动事务提交或回滚后,再切换之后才能成功删除撤销表空间 SQL& DROP TABLESPACE undo2; Tablespace dropped. SQL& ho ls $ORACLE_BASE/oradata/ control01.ctl &redo03.log & redo2.log & & system01.dbf & undotbs02.dbf control02.ctl &redo04.log & redo3.log & & tbs1_1.dbf & & users01.dbf example01.dbf &redo07.log & redo7.log & & tbs1_2.dbf redo01.log & & redo08.log & redo8.log & & temp01.dbf redo02.log & & redo1.log & &sysaux01.dbf &undotbs01.dbf --删除UNDO表空间的物理文件 SQL& ho rm $ORACLE_BASE/oradata/orcl/undotbs02. --在session1中可以看到两条记录也被成功插入 SQL& SELECT * FROM tb_ & & & & & & & & & & ID NAME ---------- -------------------- 1 Robinson 2 Jack --查看当前撤销表空间的大小 SQL& SELECT tablespace_name,bytes/ FROM dba_data_files 2 &WHERE tablespace_name = 'UNDOTBS1'; TABLESPACE_NAME & & & & & & & &BYTES/ ------------------------------ --------------- UNDOTBS1 & & & & & & & & & & & & & & & & & &30 --循环插入记录到tb_test后查看undo表空间的使用情况 SQL& BEGIN 2 &FOR i IN 1..20000 3 &LOOP 4 & & INSERT INTO tb_test VALUES(i,'Unkown Name'); 5 &END LOOP; 6 &END; 7 &/ PL/SQL procedure successfully completed. & & --可以看到UNDO 表空间只用了个块 SQL& SELECT addr,xidusn,used_ublk FROM v$ ADDR & & & & XIDUSN &USED_UBLK -------- ---------- ---------- 2D9FC160 & & & & &6 & & & &174 SQL& SELECT 174 * 8 || 'KB' FROM 174*8| ------ 1392KB 五、计算UNDO表空间的大小 计算公式: MAX(undoblks)/600 * MAX(maxquerylen) & 位于v$undostat * db_block_size & & & & & & & & & & 位于v$parameter --创建演示环境 SQL& INSERT INTO tb_test SELECT employee_id,first_name FROM hr. 107 rows created SQL& INSERT INTO tb_test SELECT * from tb_ 109 rows created. --多次执行上述命令,下面是的tb_test表中的记录数 SQL& / 892928 rows created. SQL& COMMIT; Commit complete. --查看当前undo表空间的大小 SQL& SELECT t.name,d.name,d.bytes/ as TotalSize ,t.flashback_on,d.status 2 &FROM v$tablespace t 3 &JOIN v$datafile d 4 &USING (ts#) 5 &WHERE t.name LIKE 'UNDO%'; NAME & & & & & & & & & & & & & & &NAME & & & & & & & & & & & & & & & & & & & & TOTALSIZE FLA STATUS --------------------------------- ------------------------------------------- ---------- --- ------- UNDOTBS1 & & & & & & & & & & & & &/u01/app/oracle/oradata/orcl/undotbs01.dbf & & & & &30 YES ONLINE --将undo表空间修改为RETENTION GUARANTEE及关闭自动扩展 SQL& ALTER TABLESPACE undotbs1 RETENTION GUARANTEE; Tablespace altered. SQL& ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/orcl/undotbs01.dbf' AUTOEXTEND OFF; Database altered. SQL& SELECT tablespace_name,contents,retention FROM dba_tablespaces 2 &WHERE tablespace_name LIKE 'UNDO%'; TABLESPACE_NAME & & & & & & & &CONTENTS &RETENTION ------------------------------ --------- ----------- UNDOTBS1 & & & & & & & & & & & UNDO & & &GUARANTEE --修改保留时间为分钟 SQL& ALTER SYSTEM SET undo_retention = 120; System altered. --循环删除tb_test中的记录,提示undo表空间空间容量不够 SQL& BEGIN 2 & & &FOR i IN 1..1000 & & 3 & & & & &LOOP 4 & & & & & & &DELETE FROM tb_test WHERE rownum & 1001; 5 & & & & & & &COMMIT; 6 & & & & &END LOOP; 7 &END; 8 &/ BEGIN * ERROR at line 1: ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1' ORA-06512: at line 4 --修改回话的时间参数 SQL& ALTER SESSION SET nls_date_format='yyyy-mm-dd HH24:MI:SS'; Session altered. --查看v$undostat视图,获得相关信息 SQL& SELECT begin_time,end_time,undoblks,maxquerylen, ssolderrcnt,nospaceerrcnt 2 & FROM v$ BEGIN_TIME & & & & &END_TIME & & & & & & &UNDOBLKS MAXQUERYLEN SSOLDERRCNT NOSPACEERRCNT ------------------- ------------------- ---------- ----------- ----------- ------------- 19:12:18
19:22:18 & & & & &6 & & & & & 0 & & & & & 0 & & & & & & 0 19:02:18
19:12:18 & & & & &9 & & & & & 0 & & & & & 0 & & & & & & 0 18:52:18
19:02:18 & & & & 47 & & & & & 0 & & & & & 0 & & & & & & 0 18:42:18
18:52:18 & & & 2136 & & & & & 0 & & & & & 0 & & & & & & 1 18:32:18
18:42:18 & & & & &6 & & & & & 0 & & & & & 0 & & & & & & 0 18:22:18
18:32:18 & & & &413 & & & &1541 & & & & & 0 & & & & & & 0 18:12:18
18:22:18 & & & &179 & & & & 938 & & & & & 0 & & & & & & 0 18:02:18
18:12:18 & & & & &6 & & & & & 0 & & & & & 0 & & & & & & 0 --计算undo表空间所需的大小 SQL& SELECT ( 2 & &(SELECT MAX(undoblks)/600 * MAX(maxquerylen) FROM v$undostat) * 3 & & &(SELECT value FROM v$parameter WHERE name = 'db_block_size'))/ as Need_Size 4 &FROM NEED_SIZE ---------- 42.8590625 --取消撤销保留选项 SQL& ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE; Tablespace altered 六、UNDO配额 对于超长的事务或不当的SQL脚本将耗用大量的UNDO表空间,使用UNDO表空间配额可以提高资源的利用率 对于不同组的用户可以分配不同的最大UNDO表空间配额 当某个组超出了最大的资源限制,则该组不允许新的事务产生,直到当前组的UNDO表空间释放或终止 七、撤销常见的两个错误 1.ORA-1555 snapshot too old 快照过旧错误的解决 配置合适的保留时间(undo_retention) 调整undo表空间的大小 考虑保证撤销保留的使用(retention guarantee) 2.ORA-30036 unable to extend segment in undo tablespace 无法扩展撤销表空间内的撤销段 调整undo表空间的大小 确保大量的事务能够周期性的提交 八、UNDO涉及的几个相关视图: V$TRANSACTION V$SESSION DBA_ROLLBACK_SEGS & --显示所有的segments V$ROLLSTAT V$UNDOSTAT V$ROLLNAME & & & & &--显示当前在线的segments 关于UNDO涉及视图的更多信息,请参考oracle的在线文档
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&