oracle学习笔记 undo表空间概述

Posted 新站

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习笔记 undo表空间概述相关的知识,希望对你有一定的参考价值。

oracle学习笔记 undo表空间概述


这节课开始我们开始讲undo


undo是oracle里面非常重要的一个机制
也是oracle区别于别的数据库的很重要的一个点


undo会讲的比较细一些
里面很多原理性的东西
特别是和undo相关的一系列查询


undo学完后应该大家以后碰到undo任何问题都可以轻松的去确认和解决
所以说undo的学习一定要关注



 

一)什么是undo


1)普通表空间


简单的先来看一下oracle的undo它到底是个什么东西


从总体上去看
我们此前学过表空间、段区块


undo表空间首先来讲它是个表空间


此前学普通表空间的时候是一个表空间
然后在表空间里面建表
建表就对应着段
建了段以后,oracle自动给它分配区
然后段就有了空块
就可以进入进一步插入数据
当一个区用完以后,接着分配下一个区,再下一个区......


一个表空间建十个表,就是十个段
建了二十个表就是二十个段


也就是一个普通表空间里面我建的段都是手工建的


2)undo表空间


对于undo表空间

此前学的数据库建完以后
oracle自动有了undo表空间
但是一直没有领大家去看undo表空间里面是什么


undo表空间在某种意义上来讲和普通表空间很相似
它里面也是有一堆段
有段的话必然会有段区块


但是undo表空间里面的这些undo段是自动生成的


我们数据库建完以后
自动有了undo表空间
undo表空间里面自动有了一堆undo段
大概有十几个undo段


这个时候undo段的区是自动分配的
这个和普通表空间里面是一样的
块的使用也是自动使用的


3)undo表空间和普通表空间的区别


这里面就有一个问题了


第一我们知道了它和普通表空间不同的地方是
undo表空间里面的undo段是自动生成的自动维护的


第二个不同的地方是
oracle自动使用undo段


我们在普通表空间里面的段是我们手工建的
将来我要在这个段上进行增删改查,是手工在使用
是主动的在使用这个段


但是对oracle表空间的回滚段,oracle是自动使用的
所以oralce如何去使用怎么去使用,是我们研究的重点


目前为止可以一句话来概括
undo表空间里面有undo段是自动生成的
oracle自动使用undo表空间里面的undo段


所以说某种意义上来讲
我们只要保证undo表空间的空间大小就可以了


4)关注undo段的使用


我们需不需要去关注
undo表空间里面的undo段oracle是如何使用的
作为一个高级DBA来讲是需要的
这也是我们这次讲课的重点


只要知道了oracle如何使用这些段以后
将来oracle在使用undo表空间的时候,出现系统问题的时候
你才能够去解决


这是undo表空间的一个最简单的方式来描述一下这个表空间的物理的一个现状


在理论上先给大家讲一下



 

二)undo表空间和undo段


1)当前undo表空间


oracle数据库里面的undo表空间现在的表空间是谁


[oracle@redhat4 ~]$ sqlplus / as sysdba

SQL> show parameter undo_tablespace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1


我们的undo表空间是UNDOTBS1,这个undo表空间


知道了这个undo表空间以后
可以查一下这个undo表空间有哪些数据文件组成


UNDO表空间占用空间情况以及数据文件存放位置

 select file_name,bytes/1024/1024 from dba_data_files
 where tablespace_name like '%UNDOTBS%';

使用这个语句查一下


SQL> select file_name,bytes/1024/1024 from dba_data_files where tablespace_name like '%UNDOTBS%';

FILE_NAME                                          BYTES/1024/1024
-------------------------------------------------- ---------------
/u01/app/oracle/oradata/jiagulun/undotbs01.dbf                  35


undo表空间由一个文件组成,文件大小很小只有35兆,非常小


这是undo表空间的一个物理的一个情况


2)当前的undo段


undo表空间里面有undo段
我们查一下它有多少段
使用语句


select * from v$rollname;

查询结果


SQL> select * from v$rollname;

       USN NAME
---------- ------------------------------
         0 SYSTEM
         1 _SYSSMU1$
         2 _SYSSMU2$
         3 _SYSSMU3$
         4 _SYSSMU4$
         5 _SYSSMU5$
         6 _SYSSMU6$
         7 _SYSSMU7$
         8 _SYSSMU8$
         9 _SYSSMU9$
        10 _SYSSMU10$

11 rows selected.


从0到10,一共有十一个段
SYSTEM、_SYSSMU1$、_SYSSMU2$等是段的名字


底下的段从1到10这十个段
是在刚才讲的undotbs1表空间里面


有一个undo段SYSTEM在系统表空间里面,段名叫SYSTEM


简单给大家说一下,这个地方要注意一下


oracle有undo表空间里面有很多回滚段
但是在系统表空间里面有一个特殊的,也有一个回滚段


oracle数据库在正常运行期间都使用的是undo表空间里面这一堆
也就是_SYSSMU1$到_SYSSMU10$这十个段


现在undo表空间是十个段
随着oracle数据库业务的增长,随着事务的增加
这十个段oracle可以自动增加,增加到10个15个20个段


undo表空间里面的这些段数量是自动地进行调整的


3)SYSTEM回滚段


系统表空间里面也有一个回滚段且只有一个回滚段
它叫SYSTEM回滚段


只有在一定时候oracle才会使用SYSTEM回滚段



第一种情况
oracle对系统表空间,oracle对数据字典进行操作的时候


如建立一个表的时候
表的名字、表里有多少列、列的名字、列的数据类型等等这些信息
oracle要写到数据字典里面去
写到数据字典里面去要写到系统表空间里面去


也就是对数据库的对象进行增加和删除的时候
这个时候需要操作oracle的数据字典,就会用到system表空间
也只有对system进行操作的时候才会用到SYSTEM这个undo段


还有一个地方会用到SYSTEM段


如果undo表空间坏了
oracle可能会使用SYSTEM段


所以记住有这么一个特殊的地方
oracle为了防止undo表空间出现问题
数据库启动不起来,或者没法使用
针对这么个情况
oracle在system里面还预留了
一直留着和少量地使用着一个回滚段



 

三)回滚段信息查询


既然有这么多的段了
我们再查一下某个段


1)回滚段基础信息


select SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEGMENT_NAME='_SYSSMU1$';


语句中_SYSSMU1$为段的名字,可以去复制


_SYSSMU1$是其中一个段
我们看第一个段的信息


SQL> select SEGMENT_NAME,BLOCKS,EXTENTS from dba_segments where SEGMENT_NAME='_SYSSMU1$';

SEGMENT_NAME             BLOCKS    EXTENTS
-------------------- ---------- ----------
_SYSSMU1$                   144          3



_SYSSMU1$是段的名字,它目前占了144个块,有3个区
这和我们普通的表空间里面的段非常的相似


2)回滚段中区的信息


既然说它占用了区,占了三个区,到底占了哪三个


语句


select SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='_SYSSMU1$';

可以查


SQL> select SEGMENT_NAME,TABLESPACE_NAME,EXTENT_ID,FILE_ID,BLOCK_ID,BLOCKS from dba_extents where SEGMENT_NAME='_SYSSMU1$';

SEGMENT_NAME         TABLESPACE_NAME       EXTENT_ID    FILE_ID   BLOCK_ID     BLOCKS
-------------------- -------------------- ---------- ---------- ---------- ----------
_SYSSMU1$            UNDOTBS1                      0          2          9          8
_SYSSMU1$            UNDOTBS1                      1          2         17          8
_SYSSMU1$            UNDOTBS1                      2          2       1161        128


从结果看_SYSSMU1$这个段占了三个区,EXTENT_ID区的编号0、1、2


EXTENT_ID为0的这个区
是FILE_ID为2的2号文件的第9号块后面的接着的8个块,就是从第9号到16号


接着还有第二个区EXTENT_ID为1的区,从块号为17开始的8个块


第三个区EXTENT_ID为2的区,块号从1161开始的128个块


undo表空间里面这个段分配区的情况
在一个位置分配了一个区有8个块
在另外一个位置又分配了8个块
在另外一个比较远的地方又分配128个块


这个undo段,段里面区的分配情况
分配一个区是八个块,区内是连续的,但是区和区之间不是连续的
在undo表空间里面,一个段分配区的时候它是不连续的


因为里面有很多段
有一个段一号段分配了一个区然后在使用这个区
这时候二号段也需要空间
它会使用一号段所使用区接下来的空间作为一个区


所以说
段中的区中的块是连续的
但是段中的区和区之间不连续
这就是一些小知识,段的一个使用情况



 

四)undo的管理


回顾了一下
oracle表空间、段区以及里面的块的情况
同时也告诉大家
第一、undo表空间是自动生成的
第二、undo表空间中的段是自动生成的
第三、oracle是自动使用undo段的
第四、undo段是自动的去分配区
也就是整个的oracle的undo表空间,
整个的oracle的undo这一块都是自动管理的


我们看一下undo表空间的管理方式


如果你不想深究oracle数据库的话
只要知道刚才讲的知识就行了
然后只要给undo足够的空间就可以了
因为一切都是oracle自动使用的


1)oracle的历史版本


在oracle9i以前,oracle有很多的版本


从老师个人来讲
老师是oracle7.3.2开始接触oracle
这是oracle的工作母主版
到oracle7.3.4,oracle就出企业版了


然后有oracle8.0.5这个版本
oracle 8.1.6,8.1.7 统称8i


oracle9i有R1和R2


oracle10g有R1和R2
R2现在到了10.2.0.5了


现在时兴的是oracle11g有R1和R2两个版本


一般对oracle来讲都是用R2
R1就是release1,第一版的意思,基本上没法用
至少用第二版


这就是oracle一些版本的变迁情况
不同的版本有不同的大的改进


2)undo表空间的管理历史


oracle在9i以前,比如在oracle8、oracle7的时候
undo表空间的管理是手工管理


undo表空间自动建立,undo段也是自动建立
但是undo段里面区的分配需要手工做


区的分配手工做是很讨厌的


一个undo段在使用过程中如果用完了的话
我们需要手工给它分区


如果我们不及时的手工分区
oracle使用这个undo段的事务就会挂起
这个会话就会死掉


所以如果你运行比较大的事务的时候


在oracle9i以前
运行大事务的时候经常会出现
undo表空间里面的undo段不够用的情况
然后你就手工给它分配区,然后操作就失败了


在9i以前经常会出现一些比较大的DML操作
经常会跑跑以后,因为undo表空间里面的undo段空间不够而失败


这个影响非常的恶劣
特别是要执行一个DML语句
要执行一个比较大的事务的时候


比如一个事务非常大
比如说一个批处理
我跑了一上午了,眼看就要ok了
突然undo段不够了这个操作失败了
这个时候我们需要重新做
这个影响非常恶劣


3)当前undo表空间的管理


oracle从9i开始
undo表空间就是自动管理


oralce表空间里的undo表空间里面的undo段,区的分配是自动的给它分配
空间不够了给它自动分区
加区、加区,只要undo表空间够就行
只要undo表空间空间容量够
那么有空间容量的情况下,区都自动给它分配


当然在某些情况下
这些区会被自动回收、自动回收


也就是oracle9i开始
undo表空间是自动管理
意味着undo表空间里面的undo段里面的区的分配和释放都是自动进行的
你只要给undo表空间足够的空间就行


这时候oracle的undo表空间的管理是非常的好了
解决了以前的undo段空间不够而失败的问题


所以oracle9i里面的一个很典型的一个进步的标准
就是oracle undo表空间的自动管理


oracle现在都是自动管理



 

五)undo的几个参数和相关的数据字典


1)关于undo的一些参数


SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1


undo的管理方式undo_management是AUTO
一定是AUTO


undo表空间undo_tablespace是UNDOTBS1


和undo相关的参数一个是管理方式是自动
表空间是UNDOTBS1


2)相关的数据字典


前面查询用到了几个表,后面在使用undo时也要经常使用几个数据字典
这里把相关的几个数据字典简单的列出来,以便于使用


V$ROLLNAME:回滚段名称和回滚段ID对应表
V$ROLLSTAT:该视图保存着所有UNDO表空间中每一个已分配的回滚段当前状态以及相关的统计信息
            不显示状态在OFFLINE的回滚段
DBA_ROLLBACK_SEGS:此字典显示所有回滚段的当前状态以及与存储空间分配相关的信息
V$UNDOSTAT:保存了某一时间段的整个UNDO表空间使用的统计信息以及UNDO自动优化的结果
            默认情况下每10分钟增加一条记录并只保留最近的576条的信息,
            超过期限的数据只能在DBA_HIST_UNDOSTAT中找到。
            此字典仅对自动UNDO管理模式有效
DBA_HIST_UNDOSTAT:保存了所有V$UNDOSTAT所存在的数据的一个历史记录
DBA_UNDO_EXTENTS:保存了UNDO表空间中所有已分配的数据区的存储空间分配情况与使用情况


另外有几个数据字典间接相关


V$TRANSACTION,DBA_EXTENTS,DBA_SEGMENTS,DBA_DATA_FILES


 

六)本节课小结


前面的内容简单讲了一下


undo表空间和普通表空间的区别
以及undo表空间里面的段区的情况
同时讲了undo表空间的管理方式


这节课先简单讲undo表空间这个概述
接下来会讲undo表空间的一些作用
以及oracle undo表空间的区的一些状态等等一些信息



2017年6月28日
  文字:韵筝

以上是关于oracle学习笔记 undo表空间概述的主要内容,如果未能解决你的问题,请参考以下文章

Oracle学习笔记 读一致性(ORA-01555错误机制分析)及Undo表空间大小设置

Oracle学习笔记 Oracle IMU及Redo Private Strands技术

oracle学习笔记 undo段及区的状态和使用

undo表空间概述-1

oracle undo表空间该如何估算,设计多大合适?

oracle undo表空间被删除,数据库无法启动,请问如何恢复