当在做DML操作的时候,在修改buffer cache里面的数据块的时候,会对当前块的旧镜像信息做一个保存,保存的数据块就是undo块。undo块上面保存着数据修改前的信息。

生成undo块的几个作用:

  1. 当事务没有提交,undo用来回滚事务
  2. 读一致性
  3. 在做实例恢复的时候对事务进行回滚
  4. Flashback query 闪回查询

在9I之前undo块存储的方式是手工的方式进行存储,这个需要DBA根据事务的情况建立相应的回滚段然后手工改的方式为每一个事务分配回滚段。

现在基本对undo块的存储通过自动,这个就使用了undo表空间。Oracle 9I以后对undo管理就不使用手工方式,因为随着事务增加,手动管理的方式容易在回滚段上面产生冲突。自动管理在undo空间online的时候可以自动的建立undo段,这一切都是oracle自动管理的,对dba很简单,只需要建立相应的undo表空间即可,让oracle自动管理。

SQL> show parameter undo;NAME      TYPE  VALUE------------------------------------ ----------- ------------------------------undo_management      string  AUTOundo_retention      integer  900undo_tablespace      string  UNDOTBS2

undo_management采用的是自动管理AUTO,在9I之前都是manual手动管理。通过undo_tablespace指定undo表空间UNDOTBS2。对于undo的自动管理还有一个参数undo_retention(当在undo块上面所对应的事务在完成提交以后,这个undo块空间是可以再被循环使用的,为了使得undo的信息可以保存更长一点,因为这个对flashback query等都比较重要,尽量保留时间长一点,所以可以设置undo_retention这个参数。当提交事务以后,undo块可以保留多长时间不被覆盖),这个时间到底设置多长呢?一般建议超过数据库里面最长事务查询的时间,比如一个查询大概需要半小时,那么undo_rentention设置为半小时1800s,这样保证在做查询的时候不会出现ORA-0155快照太旧。

在oracle数据库里面一般可以有多个undo表空间,但是只有一个undo表空间是active状态。

SQL> select TABLESPACE_NAME,STATUS,CONTENTS from dba_tablespaces;TABLESPACE_NAME        STATUS  CONTENTS------------------------------ --------- ---------SYSTEM        ONLINE  PERMANENTSYSAUX        ONLINE  PERMANENTTDS           ONLINE  PERMANENTUNDOTBS2      ONLINE  UNDOUSER_TEMP     ONLINE  TEMPORARYSQL> create undo tablespace undotbs32  datafile '/u01/app/oracle/oradata/oradb/undotbs03.dbf' size 100m3  autoextend on;Tablespace created.SQL> select TABLESPACE_NAME,STATUS,CONTENTS from dba_tablespaces;  --可以看到有两个undo表空间TABLESPACE_NAME        STATUS  CONTENTS------------------------------ --------- ---------SYSTEM        ONLINE  PERMANENTSYSAUX        ONLINE  PERMANENTTDS           ONLINE  PERMANENTUNDOTBS2      ONLINE  UNDOUSER_TEMP     ONLINE  TEMPORARYUNDOTBS3      ONLINE  UNDO6 rows selected.SQL> col SEGMENT_NAME for a30;SQL> set linesize 1600;SQL> select SEGMENT_NAME,SEGMENT_TYPE,TABLESPACE_NAME from user_segments2  where tablespace_name='UNDOTBS3';SEGMENT_NAME        SEGMENT_TYPE   TABLESPACE_NAME------------------------------ ------------------ ------------------------------_SYSSMU1_2546521612$        TYPE2 UNDO   UNDOTBS3_SYSSMU2_347642666$            TYPE2 UNDO   UNDOTBS3_SYSSMU3_3866846032$        TYPE2 UNDO   UNDOTBS3_SYSSMU4_970427828$            TYPE2 UNDO   UNDOTBS3_SYSSMU5_2070521138$        TYPE2 UNDO   UNDOTBS3_SYSSMU6_312287002$            TYPE2 UNDO   UNDOTBS3_SYSSMU7_3177245340$        TYPE2 UNDO   UNDOTBS3_SYSSMU8_3841002300$        TYPE2 UNDO   UNDOTBS3_SYSSMU9_1958399569$        TYPE2 UNDO   UNDOTBS3_SYSSMU10_994732307$        TYPE2 UNDO   UNDOTBS310 rows selected.

当undo表空间online的时候,oracle会自动的分配undo段,比如上面就分配了10个undo段。

下面语句是查看undo段的状态,比如数据库里面有两个undo表空间,只有一个undo表空间是active状态,另外一个undo表空间不被使用,可以通过下面语句查看段的状态,通过dba_rollback_segs这个视图。

SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs where TABLESPACE_NAME='UNDOTBS2';SEGMENT_NAME              TABLESPACE_NAME      STATUS
------------------------------ -------------------- ----------------
_SYSSMU11_4202450068$          UNDOTBS2         OFFLINE
_SYSSMU12_2784461198$          UNDOTBS2         OFFLINE
_SYSSMU13_306909427$           UNDOTBS2         OFFLINE
_SYSSMU14_1288844830$          UNDOTBS2         OFFLINE
_SYSSMU15_1412425860$          UNDOTBS2         OFFLINE
_SYSSMU16_2466010722$          UNDOTBS2         OFFLINE
_SYSSMU17_2893287284$          UNDOTBS2         OFFLINE
_SYSSMU18_2611002218$          UNDOTBS2         OFFLINE
_SYSSMU19_1129654697$          UNDOTBS2         OFFLINE
_SYSSMU20_3826278671$          UNDOTBS2         OFFLINE10 rows selected.SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_rollback_segs where TABLESPACE_NAME='UNDOTBS3';SEGMENT_NAME             TABLESPACE_NAME      STATUS
------------------------------ -------------------- ----------------
_SYSSMU1_2546521612$           UNDOTBS3         ONLINE
_SYSSMU2_347642666$            UNDOTBS3         ONLINE
_SYSSMU3_3866846032$           UNDOTBS3         ONLINE
_SYSSMU4_970427828$            UNDOTBS3         ONLINE
_SYSSMU5_2070521138$           UNDOTBS3         ONLINE
_SYSSMU6_312287002$            UNDOTBS3         ONLINE
_SYSSMU7_3177245340$           UNDOTBS3         ONLINE
_SYSSMU8_3841002300$           UNDOTBS3         ONLINE
_SYSSMU9_1958399569$           UNDOTBS3         ONLINE
_SYSSMU10_994732307$           UNDOTBS3         ONLINE10 rows selected.

也可以通过两个动态视图v$rollstat,v$rollname去了解undo段的使用情况。

SQL> select a.usn,a.name,b.XACTS,b.status from v$rollname a,v$rollstat b2  where a.usn=b.usn;USN NAME        XACTS STATUS---------- ------------------------------ ---------- ---------------0 SYSTEM    0 ONLINE11 _SYSSMU11_4202450068$    0 ONLINE12 _SYSSMU12_2784461198$    0 ONLINE13 _SYSSMU13_306909427$    0 ONLINE14 _SYSSMU14_1288844830$    0 ONLINE15 _SYSSMU15_1412425860$    0 ONLINE16 _SYSSMU16_2466010722$    0 ONLINE17 _SYSSMU17_2893287284$    0 ONLINE18 _SYSSMU18_2611002218$    0 ONLINE19 _SYSSMU19_1129654697$    0 ONLINE20 _SYSSMU20_3826278671$    0 ONLINE11 rows selected.

System回滚段是建立正在system表空间上面的,只能用于sys用户的事务操作,对于普通用户只能使用11-20回滚段。

这里使用Scott用户去产生一个事务SQL> insert into t values(1);1 row created.未提交然后再去查询SQL> /USN NAME        XACTS STATUS---------- ------------------------------ ---------- ---------------0 SYSTEM    0 ONLINE11 _SYSSMU11_4202450068$    0 ONLINE12 _SYSSMU12_2784461198$    0 ONLINE13 _SYSSMU13_306909427$    0 ONLINE14 _SYSSMU14_1288844830$    0 ONLINE15 _SYSSMU15_1412425860$    0 ONLINE16 _SYSSMU16_2466010722$    0 ONLINE17 _SYSSMU17_2893287284$    0 ONLINE18 _SYSSMU18_2611002218$    0 ONLINE19 _SYSSMU19_1129654697$    0 ONLINE20 _SYSSMU20_3826278671$    1 ONLINE11 rows selected.

可以看到红色部分的undo段,XACTS,X代表事务,ACTS代表活跃的事务,20回滚段有未提交的事务,对应的undo信息保存在这个回滚段上面,一旦提交就为0了,表示undo对应的信息就没了,空间就可以再次被使用。

对于undo表空间一般会打开自动扩展,随着事务增多undo表空间的数据文件会越来越大,这样会占用大量磁盘空间,这个空间只会不断扩大,不会回收。

为了解决undo表空间过大,可以考虑新建立一个undo表空间,对undo表空间进行一个切换,然后将之前大的undo表空间进行删除释放空间,注意不能立刻将之前的undo表空间删除,因为切换以后可能在原有的undo表空间上面记录的一些事务还没有完成,如果将这个undo表空间给删除了,库意外宕机重启了,在做实例恢复回滚的时候就找不到undo数据了,库就可能打不开了。

在数据库正常关闭再启动或者保证原有undo表空间事务都完成了提交了再去删除原来的undo表空间。

SQL> show parameter undo;NAME      TYPE  VALUE------------------------------------ ----------- ------------------------------undo_management      string  AUTOundo_retention      integer  900undo_tablespace      string  UNDOTBS2SQL> alter system set undo_tablespace='UNDOTBS3';System altered.SQL> show parameter undo;  NAME      TYPE  VALUE------------------------------------ ----------- ------------------------------undo_management      string  AUTOundo_retention      integer  900undo_tablespace      string  UNDOTBS3

Oracle undo表空间管理相关推荐

  1. Oracle undo 表空间管理

    Oracle 的Undo有两种方式: 一是使用undo 表空间,二是使用回滚段. 我们通过 undo_management 参数来控制使用哪种方式,如果设为auto,就使用UNDO 表空间,这时必须要 ...

  2. UNDO 表空间管理

    UNDO 表空间管理 一.管理UNDO数据的两种方式 自动(9i新特性)和手动(在9i之前唯一的管理方式). 二.Undo段 在一个进程修改数据库过程中存放旧的数据,包括数据没有修改之前的位置和值.U ...

  3. oracle 10g 扩表空间,Oracle 10g 表空间管理(一)

    一.表空间说明 Oracle 10g表空间包括系统表空间和非系统表空间: 1.系统表空间------>一般存储的是数据字典的相关信息 SYSTEM:是数据字典存放的表空间 SYSAUX:辅助的系 ...

  4. oracle 10g undo 管理,Oracle 10g undo表空间管理

    一.oracle 9i起,有两种undo管理方式:AUM Automatic Undo ManagementMUN Manual Undo Management建议使用 AUM ,下面只讨论AUM 一 ...

  5. oracle清理undo空间,删除Oracle Undo表空间

    近期处理了一次删除.重建Undo表空间的事情,有些细节还是值得记下来备忘.事情的起因是工程师需要将分布在不同ASM磁盘组里的Oracle数据库文件,迁移到新建的ASM磁盘组,操作过程中,错误的删除了U ...

  6. Oracle学习——表空间管理(二)

    一.使用CREATE TABLESPACE 语句创建表空间 查看系统默认表空间的位置语句:select t1.name,t2.name  from v$tablespace t1,v$datafile ...

  7. 释放oracle undo表空间,undo表空间释放

    一.概述: 使用IMPDP工具导入大表(166G)数据时,报undo表空间不能扩展,导入工作失败.手工停止了impdp后,undo表空间存在无法自动释放的故障.本文主要描述如何通过重建undo表空间来 ...

  8. Oracle undo表空间

    一.回滚段的介绍 在Oracle数据库中,当某个事务对数据库进行修改时,Oracle首先将数据库的原始值保存到一个回退段中,一个事务只能将它的信息保存到一个回滚段中,而多个并行事务可以使用同一个回滚段 ...

  9. Oracle undo表空间爆满的解决

    1. 启动SQLPLUS,并用sys登陆到数据库. #su - oracle $>sqlplus / as sysdba 2. 查找数据库的UNDO表空间名,确定当前例程正在使用的UNDO表空间 ...

最新文章

  1. Android Studio2.3.3 提示找不到 jni.h
  2. python opencv 官方文档里LaTeX公式不能正常显示怎么办?
  3. 如何从Angular的ActivatedRoute数据结构中获得运行时路由信息
  4. 如何从现在开始写博客?
  5. java并发编程——线程池的工作原理与源码解读
  6. wikioi 1163 訪问艺术馆 树形dp
  7. libcareplus应用于Qemu-6.1.0
  8. 不在gopath目录下能使用godoc吗_一文搞懂 Go Modules 前世今生及入门使用
  9. Ant Desing Pro2.0(一)项目初始化
  10. 2019 年,数据分析师怎样才能更抢手?
  11. 合批/批量渲染 (Batch)、实例化Instancing
  12. Matplotlib绘制多子图+合并图例+子图间距
  13. 编译原理之确定有限自动机的最小化
  14. android java标准时间_关于android:Java中格林尼治标准时间的毫秒数
  15. 【综合类型第 26 篇】WebStorm 2019.2.2 下载、安装教程
  16. unity中Game视图中实现和Scene视图中一样的摄像机操作
  17. Resources资源
  18. MediBang Paint Pro 漫画及插画工作软件
  19. C++一行输入多个数字(利用cin和空格)
  20. 洛谷P1282 多米诺骨牌 题解

热门文章

  1. 学法语的你伤不起之吐槽各种语言
  2. Redirect组件的使用
  3. 三阶齐次线性方程求通解_已知一个三阶常系数线性齐次微分方程的特征根
  4. 最新 python自动化高频面试题及答案
  5. 环境类sci期刊排名一区_计算机类期刊推荐:EI期刊求毕业,SCI大佬止步
  6. 关于压电式雨量传感器技术相关问答的回复
  7. 信息化、数字化与数智化傻傻分不清
  8. PHP微信扫码关注登录实例
  9. android4.4 获取符合默认短信应用要求的短信应用包名(改进篇)
  10. 互联网行业职位介绍 —— OD、PM、RD、FE、UE、QA、OP、DBA...