`
mikixiyou
  • 浏览: 1098395 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
C3c8d188-c0ab-3396-821d-b68331e21226
Oracle管理和开发
浏览量:352953
社区版块
存档分类
最新评论

Oracle的UNDO表空间管理总结

阅读更多

UNDO是Oracle中的一个很重要的机制,在对数据库进行修改的时候,Oracle会将数据块上修改之前的数据(称为前映像,before image)保存在回滚段中,这样当我们需要进行回滚(rollback)的时候就很容易能从回滚段中将之前的数据取出来将数据块上面的数据还原回来。
当然上面所说的只是UNDO的最基本的一个用途,实际上UNDO的应用远不止于此,下面就列举一下UNDO的各种作用(对于11gR2版本,不同版本会有些功能差异):

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1769403)


1,回退事务
当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变 化.假定用户A执行了语句UPDATE emp SET sal=1000 WHERE empno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行 ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中.
2,读一致性
用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保 数据的一致性.例如,当用户A执行语句UPDATE emp SET sal=1000 WHERE empno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECT sal FROM emp WHERE empno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的.
3,事务恢复
事务恢复是例程恢复的一部分,它是由oracle server自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracle server时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务.
4,倒叙查询(FlashBack Query)
倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:00,某用户在上午10:00执行UPDATE emp SET sal=3500 WHERE empno=7788语句,修改并提交了事务(雇员原工资为3000),为了取得10:00之前的雇员工资,用户可以使用倒叙查询特征.

 

UNDO管理使用的数据字典

 

1、直接相关的数据字典
9i之前手工管理时就存在的数据字典
V$ROLLNAME:回滚段名称和回滚段ID对应表。
V$ROLLSTAT:在使用AUM时,该视图保存着所有UNDO表空间中每一个已分配的回滚段当前状态以及相关的统计信息,不显示状态在OFFLINE的回滚段。
DBA_ROLLBACK_SEGS:此字典显示所有回滚段的当前状态以及与存储空间分配相关的信息。
9i之后新增的数据字典
V$UNDOSTAT:保存了某一时间段的整个UNDO表空间使用的统计信息以及UNDO自动优化的结果,默认情况下每10分钟增加一条记录,并只保留最近的576条(4天。在10g及之前版本中此记录为1008,或7天)的信息,超过期限的数据只能在DBA_HIST_UNDOSTAT中找到。此字典仅对自动UNDO管理模式有效。
DBA_UNDO_EXTENTS:保存了UNDO表空间中所有已分配的数据区的存储空间分配情况与使用情况,是得到UNDO数据当前存在状态的一个重要的视图。
DBA_HIST_UNDOSTAT:保存了所有V$UNDOSTAT所存在的数据的一个历史记录,10g开始新增字典。

 

2、间接相关的数据字典
事务相关
V$TRANSACTION:当前正在进行事务的信息,与UNDO管理相关的是当前事务所涉及的UNDO段,UNDO空间占用等等信息。具体的前面已经有介绍。
UNDO表空间相关
DBA_EXTENTS:与DBA_UNDO_EXTENTS类似。
DBA_SEGMENTS:与DBA_ROLLBACK_SEGS类似。
DBA_DATA_FILES:关联计算UNDO表空间大小而用。

 

 

UNDO管理的SQL语句

 

我收录了一些有关Undo表空间与回滚段的SQL查询语句

 

 V$ROLLSTAT记录的是整个UNDO表空间各个回滚段使用情况的统计,属于横向的;而V$UNDOSTAT记录的则是各个时间段上面整个UNDO使用情况的统计,属于纵向的。

 

--与回滚段相关的几个系统参数
transactions_per_rollback_segment
transactions
max_rollback_segments
rollback_segments   回滚段类型为public则与该参数无关


--相关的几个视图:
DBA_UNDO_EXTENTS
GV$UNDOSTAT
V$UNDOSTAT
DBA_ROLLBACK_SEGS
GV$ROLLSTAT
V$ROLLNAME
V$ROLLSTAT

 

---分析UNDO表空间使用情况

SELECT seg.tablespace_name "Tablespace Name", ts.bytes/1024/1024 "TS Size(MB)",
  ue.status "UNDO Status", count(*) "Used Extents",
  round(sum(ue.bytes)/1024/1024, 2) "Used Size(MB)",
  round(sum(ue.bytes)/ts.bytes*100, 2) "Used Rate(%)"
FROM dba_segments seg, DBA_UNDO_EXTENTS ue,
  (SELECT tablespace_name, sum(bytes) bytes
    FROM dba_data_files GROUP BY tablespace_name) ts
WHERE ue.segment_NAME=seg.segment_NAME and seg.tablespace_name=ts.tablespace_name
GROUP BY seg.tablespace_name, ts.bytes, ue.status
ORDER BY seg.tablespace_name;

 

---分析 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

 

---监控undo表空间
SELECT  BEGIN_TIME, END_TIME, UNDOTSN, UNDOBLKS, TXNCOUNT,
        MAXCONCURRENCY AS "MAXCON"
     FROM V$UNDOSTAT;

 

--查询是否有回滚段的争用
select * from v$waitstat;
SELECT name, waits, gets, waits/gets "Ratio"
FROM v$rollstat a, v$rollname b
WHERE a.usn = b.usn;

 

---查看回滚段的统计信息:
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;

 

--查看回滚段的使用情况,哪个用户正在使用回滚段的资源:
SELECT s.sid,s.username,s.PROGRAM,s.MACHINE,u.name,t.used_ublk
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;

 

--查询回滚段的事务回退率
transaction rollbacks/(transaction rollbacks+user commits)
select name,value from v$syssstat where name in('user commits','transaction rollbacks');

 

--查询获取回滚段数据的时候数据缓冲区中copy的数据块的数量
select count(*) from x$bh where state=3;

 

--查询在SGA中回滚段的块的数量USN=n,则回滚段头class为11+2n,回滚段块为12+2n
select usn from v$rollstat;
select class,count(*) from x$bh where class>10 group by class;

 

--查询数据库的的回滚段情况
select segment_id,segment_name from dba_rollback_segs;

 

--指定使用某个回滚段
set transaction use rollback segment _SYSSMU4$

 

--查询回滚段在使用,扩展,回缩的时候extent在循环的次数
select usn,wraps from v$rollstat;

 

--查询回滚段收缩的情况
select usn,optsize,shrinks from v$rollstat;

 

--切换undo表空间到新的表空间(注意修改pfile或者spfile参数)
alter system set undo_tablespace=UNDOTBS1 scope=both;

 

---创建undo表空间
CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE 'E:\ORACLE\ORA92\ORCL9\UNDOTBS02.DBF' size 11M reuse AUTOEXTEND ON;
---改变(Altering) an Undo Tablespace
Adding a datafile
Renaming a datafile
Bringing a datafile online or taking it offline
Beginning or ending an open backup on a datafile


---增加数据文件
ALTER TABLESPACE UNDOTBS2
     ADD DATAFILE 'E:\ORACLE\ORA92\ORCL9\UNDOTBS03.DBF' size 2M AUTOEXTEND ON NEXT 1M
         MAXSIZE UNLIMITED;

 

--drop undo表空间
DROP TABLESPACE UNDOTBS2; ---INCLUDING CONTENTS.

 

--不指定undo表空间
ALTER SYSTEM SET UNDO_TABLESPACE = '';

 

--设置retention值:
ALTER SYSTEM SET UNDO_RETENTION = 5;
 

 

UNDO管理的RETENTION

 

数据库初始化参数UNDO_RETENTION是回滚段保留的时间值的最小阀值。

生效条件是:
如果,Oracle数据库使用的UNDO表空间是自动扩展,则会依据初始化参数undo_retention指定的值来决定undo段的保留时间。
如果,Oracle数据库使用的UNDO表空间是固定大小的,则初始化参数undo_retention将被忽略,undo段空闲如果不足,会自动覆盖非活动的undo段。
但在10g以后,这个功能有了调整。UNDO表空间有一个新的属性retention,它的值如果是GUARANTEE,在固定大小的UNDO表空间中初始化参数undo_retention会生效,继续将undo段保留时间强制为该参数指定的值。
UNDO表空间属性retention的默认值是NOGUARANTEE,可以通过dba_tablespaces去查询。

 

但是,我遇到的案例是这样的情况。UNDO表空间是固定大小,设置了undo_retention值,所有的非过期的回滚段在undo空闲空间不足时也没有自动释放,出现ORA-30036错误导致事务中止。咨询ORACLE官方,说这可能是bug。

因此,只要设置了undo_retention,UNDO表空间使用率就可能不足。故该参数值需要调整合适到合适大小。

 

http://www.dbabeta.com/上有几篇文章对此整理的比较好,可以参考。

http://www.dbabeta.com/2010/undo-management_auto-undo-management.html

http://www.dbabeta.com/2010/undo-management_data-dictionary.html

 

分享到:
评论

相关推荐

    Oracle的Temp表空间和UNDO表空间的处理

    通过以上介绍可以看出,在Oracle数据库中,正确管理和优化Temp表空间和UNDO表空间是非常重要的,尤其是对于那些执行大量排序、分组操作以及频繁进行事务处理的应用系统来说。合理利用Resize调整大小、替换原有表空间...

    oracle 收缩undo表空间

    在Oracle数据库管理中,有时需要对Undo表空间进行管理和优化。特别是当Undo表空间因为历史数据积累而变得过大时,可能会影响数据库性能。本文将详细介绍如何通过新建一个Undo表空间并替换原有的Undo表空间来实现其...

    oracle 9i UNDO表空间数据文件丢失恢复

    在Oracle数据库管理中,UNDO表空间是非常重要的组成部分之一,主要用于存储事务处理期间的回滚信息。当UNDO表空间的数据文件丢失时,可能会导致数据库无法正常运行,甚至引发数据丢失的风险。本文将详细介绍Oracle ...

    管理undo表空间全面分析详解

    在Oracle数据库管理中,`undo表空间`的管理是一项至关重要的任务。它不仅关乎数据的一致性和完整性,还直接影响到数据库的性能。本文将从DML语句与undo的关系入手,深入探讨undo在Oracle数据库中的作用及管理方式。 ...

    Oracle12c表空间维护总结

    ### Oracle 12c 表空间维护关键技术点总结 ...综上所述,Oracle 12c提供了丰富的表空间管理功能,包括创建不同类型的表空间、指定默认表空间等。通过合理的规划和配置,可以有效提升数据库性能和可管理性。

    Oracle修改表空间大小.doc

    在使用Oracle 10g数据库管理系统进行数据管理的过程中,经常会遇到由于表空间限制而导致的数据导入失败问题。这是因为Oracle默认的表空间大小为400MB,当数据库中的数据量超过这个阈值时,便无法继续导入数据。本文...

    Oracle 12C R2本地UNDO模式

    Oracle 12C R2 引入了一种新的UNDO管理模式——本地UNDO模式(LOCAL_UNDO_ENABLED),它允许每个可插拔数据库(PDB)拥有独立的UNDO表空间。这一特性显著提升了数据库性能,并为高级功能提供了支持。 #### 二、传统...

    oracle undo

    当一个事务开始时,Oracle首先需要在回滚段表空间中分配空间,即获得一个事务槽。接着,在事务正式进行任何修改之前,Oracle会创建一个前镜像(Pre-image),这个前镜像包含了事务开始之前的数据状态。这样做的目的...

    查看表空间大小 sql 脚本

    在Oracle数据库管理中,了解表空间的大小对于优化存储、维护数据安全以及提高数据库性能至关重要。本文将详细解释一个实用的SQL脚本,该脚本能够帮助我们查看Oracle数据库中的表空间大小及其使用情况。 #### 一、...

    oracle 10g的闪回技术总结.doc

    ### Oracle 10g 闪回技术总结 Oracle 10g 引入了一系列闪回技术,极大地增强了数据库管理和恢复的能力。本文将详细介绍 Oracle 10g 的三种闪回技术:全库闪回、表被 DROP 后的闪回以及表被 DML 操作之后的闪回,并...

    orale创建表空间

    ### Oracle 创建表空间详解 ...在创建表空间时,应考虑数据量的增长趋势以及未来的扩展需求,合理规划数据文件的大小和数量,同时选择合适的日志记录和空间管理方式,以确保数据库系统的稳定运行。

    oracle数据库学习总结.docx

    - **定义**:表空间是Oracle数据库的一个逻辑存储单位,用于组织和管理数据。 - **用途**:通过将数据和对象分配到不同的表空间中,可以实现更高效的数据管理。 - **示例**:每个数据库都至少包含一个名为`SYSTEM`的...

    RAC下的REDO和UNDO管理

    在Oracle数据库的Real Application Clusters (RAC)环境中,REDO和UNDO管理扮演着至关重要的角色,确保数据的安全性、事务处理以及数据恢复。在RAC架构中,多个实例共享同一物理数据库,这就需要对REDO和UNDO管理进行...

    Oracle Database 10g 误删表,闪电恢复

    然而,使用闪回表的前提是数据库必须启用闪回功能,并且有足够的Undo空间来存储必要的信息。要启用闪回功能,数据库的参数`flashback_database`应设置为`ON`,并且需要确保Undo表空间有足够的未分配空间供闪回操作...

    OracleDBA日常维护操作手册命令总结_Oracle数据库教程.pdf

    操作包括创建表空间、创建临时表空间、创建UNDO表空间、增加和删除表空间,以及查询表空间状态和数据文件路径。表空间的管理是数据库维护中的一项重要内容。 2. 用户和权限 用户是访问和操作数据库的实体。权限则是...

    (完整)Oracle复习题总结-推荐文档.pdf

    Oracle 数据库管理总结 Oracle 是一种关系数据库管理系统,由 Larry Ellison、Bob Miner 和 Ed Oates 于 1977 年创建,总部位于美国加州红木滩市。Oracle 服务器由实例和数据库组成,而 Oracle 实例又由内存和后台...

    oracle 12C 新特性

    在 Oracle 12c R1 中迁移表分区或子分区到不同的表空间不再需要复杂的过程,可以在线或是离线迁移至一个不同的表空间。 3. 不可见字段 Oracle 12c 中引入了不可见字段的概念,允许开发人员在不影响应用程序的情况...

Global site tag (gtag.js) - Google Analytics