登录 |  注册
首页 >  数据库 >  Oracle入门学习教程笔记 >  Oracle回滚段的作用及查询

Oracle回滚段的作用及查询

回滚段概述   

回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。回滚段的头部包含正在使用的该回滚段事务的信息。一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。   

回滚段的作用   

  • 事务回滚 :当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的 到原来的值。   

  • 事务恢复 :当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。   

  • 读一致性 :当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。当ORACLE执行SELECT语句时,ORACLE依照当前的系统改变号(SYSTEM CHANGE NUMBER-SCN)来保证任何前于当前SCN的未提交的改变不被该语句处理。可以想象:当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。  

回滚段的类型

回滚段可分为 系统回滚段非系统回滚段 , 其中非系统回滚段又分为 PUBLIC 回滚段PRIVATE 回滚段

回滚段: 

1 系统回滚段

2 非系统回滚段: 

  • PUBLIC 回滚段

  • PRIVATE 回滚段

系统回滚段用于处理涉及系统的 CATALOG 的事物 ( 比如大多数的 DDL), 它位于 SYSTEM 表空间 , 由于只有 SYSTEM 表空间可以随时保持可用 , 因此 , 不要把 SYSTEM 回滚段放在其他的表空间中 .

原则 1: 系统回滚段应放在 SYSTEM 表空间中 , 并且应该永远保持 ONLINE 状态 .

PUBLIC 回滚段对于数据库的所有实例 (INSTANCE) 都是可用的 , 除非将其显式设置为 OFFLINE.

PRIVATE 回滚段是指对于数据库的 某个实例是私有的 , 为了使用 PRIVATE 回滚段 , 某个实例应当在其 INITsid.ORA 的 ROLLBACK_SEGMENTS 中标明所有要使用的 PRIVATE 回滚段 , 或通过使用 ALTER ROLLBACK SEGMENT XXX ONLINE 来使用某一个回滚段 .

建议 1: 在单实例系统中 , 建议将所有回滚段设为 PUBLIC.

建议 2: 在多实例系统中 ( 如 OPS,RAC), 建议将每个实例的 PRIVATE 回滚段放置到访问比较快的本地设备上 .

回滚段的数量规划  

  • 对于OLTP系统,存在大量的小事务处理,一般建议:   

  • 数量多的小回滚段;每四个事务一个回滚段;每个回滚段不要超过十个事务。   

  • 对于批处理,一般建议:   

  • 少的大回滚段;每个事务一个回滚段。  

回滚段的使用

分配回滚段:当事务开始时, ORACLE 将为该事务分配回滚段,并将拥有最少事务的回滚段分配给该事务。事务可以用以下语句申请指定的回滚段:

SET TRANSTRACTION USE ROLLBACK SEGMENT rollback_segment

事务将以顺序,循环的方式使用回滚段的区( EXTENTS ),当当前区用满后移到下一个区。几个事务可以写在回滚段的同一个区,但每个回滚段的块只能包含一个事务的信息。

例如(两个事务使用同一个回滚段,该回滚段有四个区):

  1. 事务在进行中,它们正在使用回滚段的第三个区;

  2. 当两个事务产生更多的回滚信息,它们将继续使用第三个区;

  3. 当第三个区满后,事务将写到第四个区,当事务开始写到一个新的区时,称为翻转( WRAP );

  4. 当第四个区用满时,如果第一个区是空闲或非活动(使用该区的所有事务完成而没有活动的事务)的,事务将接着使用第一个区。

回滚段的查询

1 查询数据库的的回滚段情况

select owner,segment_id,segment_name,tablespace_name,status from dba_rollback_segs;

2 查看系统回滚段基本信息

select segment_name,tablespace_name,bytes,next_extent from dba_segments where segment_type='ROLLBACK';

从上面仅仅是查询到回滚段的基本信息,要了目前各个回滚段的动态信息,还要查询 V$ROLLNAME 和 V$ROLLSTAT 视图。 V$ROLLNAME 视图只存放各回滚段的 编号 和 名字 , V$ROLLSTATS 存放各个回滚段当前的情况信息。要想得到每个回滚段的信息,就要查询两个表的信息才能得到。如:

select s.usn,n.name,s.extents,s.optsize,s.hwmsize,s.status from v$rollstat s, v$rollname n where s.usn=n.usn

3 查看回滚段的使用情况,哪个用户正在使用回滚段的资源 ( 当提交或回滚后资源释放 ):

SELECT s.username, u.name FROM v$transaction t, v$rollstat r, v$rollname u, v$session s WHERE s.taddr = t.addr AND t.xidusn = r.usn AND r.usn = u.usn ORDER BY s.username;

4 回滚段当前活动的事物 ( 事务提交或回滚后自动清空 )

SELECT s.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk  FROM v$session s,v$transaction t;

5 分析 UNDO 的使用情况

SELECT TABLESPACE_NAME,STATUS,TRUNC(SUM(BLOCKS) * 8 / 1024) AS "Size M",COUNT(*) Undo_Extent_Num FROM DBA_UNDO_EXTENTS GROUP BY TABLESPACE_NAME, STATUS;

6 监控 undo 表空间

SELECT BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT,MAXCONCURRENCY AS "MAXCON" FROM V$UNDOSTAT;

7 查询是否有回滚段的争用

select * from v$waitstat;
SELECT name, waits, gets, waits/gets "Ratio" FROM v$rollstat a, v$rollname b WHERE a.usn = b.usn;

8 查看回滚段的统计信息:

SELECT n.name, s.extents, s.rssize, s.optsize, s.hwmsize, s.xacts, s.status FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;

9 查询回滚段的事务回退率

transaction rollbacks/(transaction rollbacks+user commits)
select name,value from v$sysstat where name in('user commits','transaction rollbacks');

10 查询回滚段在使用 , 扩展 , 回缩的时候 extent 在循环的次数

select usn,wraps from v$rollstat;

11 查询回滚段收缩的情况

select usn,optsize,shrinks from v$rollstat;
上一篇: 数据字典dba_rollback_segs详细介绍
下一篇: Oracle回滚段的创建及其操作
推荐文章
  • mysql只支持一种join算法:Nested-LoopJoin(嵌套循环连接),但Nested-LoopJoin有三种变种:SimpleNested-LoopJoin,IndexNested-LoopJoin,BlockNested-LoopJoin(简单-索引-缓冲区)原理:1.SimpleNe
  • redis是一个内存数据库,一旦断电或服务器进程退出,内存数据库中的数据将全部丢失,所以需要redis持久化 redis持久化就是把数据保存在磁盘上,利用永久性存储介质将数据保存,在特定的时间将保存的数据进行恢复的工作机制redis提供两种持久化机制RDB:存储数据结果,关注点在数据AOF:存储操作
  • 通过SQL的执行过程来介绍MySQL的基础结构.     首先有一个user_info表,表里有一个id字段,执行下面这条查询语句:Select * form user_info where i
  • 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是
  • 说到数据库事务,大家脑子里一定很容易蹦出一堆事务的相关知识,如事务的ACID特性,隔离级别,解决的问题(脏读,不可重复读,幻读)等等,但是可能很少有人真正的清楚事务的这些特性又是怎么实现的,为什么要有四个隔离级别。今天我们就先来聊聊MySQL中事务的隔离性的实现原理,后续还会继续出文章分析其他特性的
  • 前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句
学习大纲