UNDO表空间详解.docx
- 文档编号:16223747
- 上传时间:2023-07-11
- 格式:DOCX
- 页数:29
- 大小:760.42KB
UNDO表空间详解.docx
《UNDO表空间详解.docx》由会员分享,可在线阅读,更多相关《UNDO表空间详解.docx(29页珍藏版)》请在冰点文库上搜索。
UNDO表空间详解
UNDO表空间详解
目录
UNDO表空间详解1
一、描述2
二、作用3
1.回退事务3
2.读一致性3
3.事务恢复3
4.倒叙查询(FlashBackQuery)4
三、UNDO参数4
1.UNDO_MANAGEMENT4
2.UNDO_TABLESPACE4
3.UNDO_RETENTION4
四、UNDO表空间操作5
1.建立UNDO表空间5
2.修改UNDO表空间5
3.切换UNDO表空间6
4.删除UNDO表空间6
五、其他操作(段、区、块)6
1.UNDO表空间及大小:
6
2.undo段7
3.undo段中区的状态:
8
六、统计信息9
1.显示UNDO表空间统计信息9
2.显示UNDO段统计信息.10
3.显示UNDO区信息11
4.显示活动事务信息.11
5.V$ROLLSTAT中的常用列11
七、参考文档:
12
附件1:
12
附件2:
21
一、描述
undo表空间是Oracle特有的概念,undo表空间中会自动分配undo段,这些undo段用来保存事务中的DML语句的undo信息,也就是来保存数据在被修改之前的值。
在rollback,实例恢复(前滚),一致性读CR块的构造时会使用到undo信息,由于undo的引入,从而Oracle的select语句实现一致性读时,不需要任何锁。
undo表空间和其它表空间有很多类似的地方:
undo数据块也会被读到buffercache缓存起来,修改时也会产生redolog,数据也会写回到undo表空间的磁盘上。
所以崩溃后,undo块的buffercache也会恢复过来。
Undo:
是基于回滚的,当数据被误修改时,可以从修改的新状态回退到老状态,实现事物回滚,相当于撤销操作。
是回滚,就像倒录音带一样,把走过的路反向再走一遍回到原点。
Redo:
是基于安全考虑的,会记录数据库的所有变化,当数据被误修改时,使用redo可重新生成,事物重做。
是前滚,就是从无到有的新创建。
一个新生命的诞生。
二、作用
1.回退事务
当执行DML操作修改数据时,UNDO数据被存放到UNDO段,而新数据则被存放到数据段中,如果事务操作存在问题,旧需要回退事务,以取消事务变化.假定用户A执行了语句UPDATEempSETsal=1000WHEREempno=7788后发现,应该修改雇员7963的工资,而不是雇员7788的工资,那么通过执行ROLLBACK语句可以取消事务变化.当执行ROLLBACK命令时,oracle会将UNDO段的UNDO数据800写回的数据段中.
2.读一致性
用户检索数据库数据时,oracle总是使用用户只能看到被提交过的数据(读取提交)或特定时间点的数据(SELECT语句时间点).这样可以确保数据的一致性.例如,当用户A执行语句UPDATEempSETsal=1000WHEREempno=7788时,UNDO记录会被存放到回滚段中,而新数据则会存放到EMP段中;假定此时该数据尚未提交,并且用户B执行SELECTsalFROMempWHEREempno=7788,此时用户B将取得UNDO数据800,而该数据正是在UNDO记录中取得的.
3.事务恢复
事务恢复是例程恢复的一部分,它是由oracleserver自动完成的.如果在数据库运行过程中出现例程失败(如断电,内存故障,后台进程故障等),那么当重启oracleserver时,后台进程SMON会自动执行例程恢复,执行例程恢复时,oracl会重新做所有未应用的记录.回退未提交事务.
4.倒叙查询(FlashBackQuery)
倒叙查询用于取得特定时间点的数据库数据,它是9i新增加的特性,假定当前时间为上午11:
00,某用户在上午10:
00执行UPDATEempSETsal=3500WHEREempno=7788语句,修改并提交了事务(雇员原工资为3000),为了取得10:
00之前的雇员工资,用户可以使用倒叙查询特征.
三、UNDO参数
5.UNDO_MANAGEMENT
该初始化参数用于指定UNDO数据的管理方式.如果要使用自动管理模式,必须设置该参数为AUTO,如果使用手工管理模式,必须设置该参数为MANUAL,使用自动管理模式时,oracle会使用undo表空间管理undo数据,使用手工管理模式时,oracle会使用回滚段管理undo数据,需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告.
6.UNDO_TABLESPACE
该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间.
在RAC(RealApplicationCluster)结构中,因为一个UNDO表空间不能由多个例程同时使用,所以必须为每个例程配置一个独立的UNDO表空间.
7.UNDO_RETENTION
该初始化参数用于控制UNDO数据的最大保留时间,其默认值为900秒,从9i开始,通过配置该初始化参数,可以指定undo数据的保留时间,从而确定倒叙查询特征(FlashbackQuery)可以查看到的最早时间点.
如果UNDO表空间的大小是固定的,即不可自动扩展,那么在这种情况下,UNDO_RETENTION参数是会自动忽略,不会生效,数据库根据系统活动情况和undo表空间大小来调整undoretentionperiod为最佳值。
如果undo表空间是自动扩展的,那么数据会尝试使用UNDO_RETENTION参数,如果表空间不足时,不会去重写没有过期(仅仅是没有过期的committed的数据)的undo数据,而是会自动扩展undo表空间。
当undo表空间扩展达到MAXSIZE值时,数据库开始重写没有过期的undo数据。
四、UNDO表空间操作
8.建立UNDO表空间
UNDO表空间专门用于存放UNDO数据,并且在UNDO表空间尚不能建立任何数据对象(表,索引,簇)。
1)使用CREATEDATABASE命令建立UNDO表空间.
当使用CREATEDATABASE命令建立数据库时,通过指定UNDOTABLESPACE选项,可以建立UNDO表空间.示例如下:
1.CREATE DATABASE db01
2.…
3.UNDO TABLESPACE undotbs_01
4.DATAFILE '/opt/oracle/oradata/ge01/UNDOTBS1.dbf' SIZE 30M;
注意:
UNDOTABLESPACE子句不是必须的,如果使用自动UNDO管理模式,并且没有指定该子句,那么建立数据库时会自动生成名为UNDOTBS1的UNDO表空间.
2)使用CREATEUNDOTABLESPACE命令建立UNDO表空间.
create undo tablespace undotbs2 datafile '/opt/oracle/oradata/ge01/UNDOTBS2.dbf' size 100m reuse autoextend on next 50m maxsize 5000m;
9.修改UNDO表空间
使用ALTERTABLESPACE命令修改UNDO表空间.
当事务用尽了UNDO表空间后,使用ALTERTABLESPACE…ADDDATAFILE增加数据文件。
当UNDO表空间所在的磁盘填满是,使用ALTERTABLESPACE…RENAMEDATAFIEL命令移动数据文件到其他磁盘上。
使用ALTERDATABASE…OFFLINE/ONLINE使表空间脱机/联机。
当数据库处于ARCHIVELOG模式时,使用ALTERTABLESPACE…BEGINBACKUP/ENDBACKUP命令备份UNDO表空间.
10.切换UNDO表空间
启动例程并打开数据库后,同一时刻特定例程只能使用一个UNDO表空间,切换UNDO表空间是指停止例程当前使用的UNDO表空间,并启动其他UNDO表空间,下面以启用undotbs2表空间为例,说明切换UNDO表空间的方法.
ALTERSYSTEMSETundo_tablespace=undotbs02;
在RAC(RealApplicationCluster)结构中,不同例程必须使用独立的UNDO表空间,而不能共用同一个UNDO表空间.
11.删除UNDO表空间
当前例程正在使用的UNDO表空间是不能被删除的,如果确定要删除当前例程正在使用的UNDO表空间,应首先切换UNDO表空间.然后删除相应的UNDO表空间.
DROPTABLESPACEundotbs3;
五、其他操作(段、区、块)
以192.168.88.62上面的数据库为例:
12.UNDO表空间及大小:
SQL>showparameterundo_tablespace;
SQL>selectfile_name,bytes/1024/1024size_Mfromdba_data_fileswheretablespace_name='UNDOTBS1';
显示数据库的所有UNDO表空间:
SQL>SELECTtablespace_nameFROMdba_tablespacesWHEREcontents='UNDO';
13.undo段
显示undo段:
SQL>select*fromv$rollname;
注意:
其中name=SYSTEM的undo段位于SYSTEM表空间,当涉及到对SYSTEM表空间修改时,使用的是上面name=SYSTEM的表空间。
比如DDL语句使用的就是SYSTEM这个undo段。
另外当我们的undo表空间UNDOTBS1损坏了时,也会使用SYSTEM这个undo段。
随着系统的负载,undo段会根据需要自动增加。
根据undo段的名字来查看段的信息:
SQL>selectsegment_name,blocks,extentsfromdba_segmentswheresegment_name='_SYSSMU1_3724004606$';
可见undo段_SYSSMU1_3724004606$分配了4个区,272个block.下面我具体查看四个区的信息:
SQL>selectsegment_name,tablespace_name,extent_id,file_id,block_id,blocksfromdba_extentswheresegment_name='_SYSSMU1_3724004606$';
可见_SYSSMU1_3724004606$段的第一个区占用了从第128号block开始的8个block;已经从152号block开始的8个block;已经从640号block开始的128个block;已经从2048号block开始的128个block.从而我们知道:
段与段之间是不连续的,而段内部的block是连续的。
从Oracle9i开始,undo表空间是自动管理,undo中的段、区等都是自动分配自动释放的,我只需要保证undo表空间有足够的大小。
SQL>showparameterundo;
14.undo段中区的状态:
SQL>selectextent_id,bytes,statusfromdba_undo_extentswheresegment_name='_SYSSMU1_3724004606$';
free:
区没有被使用;
active:
区中的undo信息对应的事务没有提交;
inactive:
对应的事务已经提交;
expired:
事务提交后,还没有超过undo_retention秒;
Oracle尽量会使用free的undo区,不够再去扩充,再不够会使用expired的undo区,Oracle原则上是不覆盖inactive的区,但是当undo空间不够时,也可能会使用inactive状态的区;我们可以使用下面的命令来强制Oracle不能覆盖inactive的区:
altertablespaceundotbs1retentionguarantee(强制保证不覆盖)
altertablespaceundotbs1retentionnoguarantee(不保证不被覆盖)
SQL>selecttablespace_name,retentionfromdba_tablespaces;
六、统计信息
15.显示UNDO表空间统计信息
使用自动UNDO管理模式时,需要合理地设置UNDO表空间的尺寸,为了合理规划UNDO表空间尺寸,应在数据库运行的高峰阶段搜集UNDO表空间的统计信息.最终根据该统计信息确定UNDO表空间的尺寸.通过查询动态性能视图V$UNDOSTAT,可以搜集UNDO统计信息.
SQL>SELECTTO_CHAR(BEGIN_TIME,'HH24:
MI:
SS')BEGIN_TIME,TO_CHAR(END_TIME,'HH24:
MI:
SS')END_TIME,UNDOBLKSFROMV$UNDOSTAT;
BEGIN_TIME用于标识起始统计时间,END_TIME用于标识结束统计时间,UNDOBLKS用于标识UNDO数据所占用的数据块个数.oracle每隔10分钟生成一行统计信息.
16.显示UNDO段统计信息.
使用自动UNDO管理模式时,oracle会在UNDO表空间上自动建立10个UNDO段,通过查询动态信息视图V$ROLLNAME,可以显示所有联机UNDO段的名称,通过查询动态性能视图V$ROLLSTAT,可以显示UNDO段的统计信息.通过在V$ROLLNAME和V$ROLLSTAT之间执行连接查询,可以监视特定UNDO段的特定信息.
SELECTa.name,b.xacts,b.writes,b.extentsFROMv$rollnamea,v$rollstatbWHEREa.usn=b.usn;
Name用于标识UNDO段的名称,xacts用于标识UNDO段所包含的活动事务个数,Writes用于标识在undo段上所写入的字节数,extents用于标识UNDO段的区个数。
17.显示UNDO区信息
数据字典视图dba_undo_extents用于显示UNDO表空间所有区的详细信息.包括UNDO区尺寸和状态等信息.
SELECTextent_id,bytes,statusFROMdba_undo_extentsWHEREsegment_name='_SYSSMU1_3724004606$';
其中,extent_id用于标识区编号,bytes用于标识区尺寸,status用于标识区状态(ACTIVE:
表示该区处于活动状态,EXPIRED:
标识该区未用).
18.显示活动事务信息.
当执行DML操作时,oracle会将这些操作的旧数据放到UNDO段中,动态性能视图v$session用于显示会话的详细信息,动态性能视图v$transaction用于显示事务的详细信息,动态性能视图v$rollname用于显示联机UNDO段的名称.通过在这3个动态性能视图之间执行连接查询,可以确定正在执行事务操作的会话,事务所使用的UNDO段,以及事务所占用的UNDO块个数.
Colusernameformata10
Colnameformata10
SELECTa.username,b.name,c.used_ublkFROMv$sessiona,v$rollnameb,v$transactioncWHEREa.saddr=c.ses_addrANDb.usn=c.xidusnANDa.username='NBPHSC';
19.V$ROLLSTAT中的常用列
USN:
回滚段标识
RSSIZE:
回滚段默认大小
XACTS:
活动事务数
在一段时间内增量用到的列
WRITES:
回滚段写入数(单位:
bytes)
SHRINKS:
回滚段收缩次数
EXTENDS:
回滚段扩展次数
WRAPS:
回滚段翻转(wrap)次数
GETS:
获取回滚段头次数
WAITS:
回滚段头等待次数
七、参考文档:
附件1:
一. 什么是UNDO
OracleDatabasecreatesandmanagesinformationthatisusedtorollback,orundo,changestothedatabase.Suchinformationconsistsofrecordsoftheactionsoftransactions,primarilybeforetheyarecommitted.Theserecordsarecollectivelyreferredtoas undo.
Undorecordsareusedto:
--Undo 记录使用在如下情况:
(1) Rollbacktransactionswhena ROLLBACK statementisissued
(2) Recoverthedatabase
(3) Providereadconsistency
(4) AnalyzedataasofanearlierpointintimebyusingOracleFlashbackQuery
(5) RecoverfromlogicalcorruptionsusingOracleFlashbackfeatures
Whena ROLLBACK statementisissued,undorecordsareusedtoundochangesthatweremadetothedatabasebytheuncommittedtransaction.Duringdatabaserecovery,undorecordsareusedtoundoanyuncommittedchangesappliedfromtheredologtothedatafiles.Undorecordsprovidereadconsistencybymaintainingthebeforeimageofthedataforuserswhoareaccessingthedataatthesametimethatanotheruserischangingit.
二. AUM(AutomaticUndoManagement)说明
Oracleprovidesafullyautomatedmechanism,referredtoasautomaticundomanagement,formanagingundoinformationandspace.Withautomaticundomanagement,thedatabasemanagesundosegmentsinanundotablespace.BeginningwithRelease11g,automaticundomanagementisthedefaultmodeforanewlyinstalleddatabase.Anauto-extendingundotablespacenamed UNDOTBS1 isautomaticallycreatedwhenyoucreatethedatabasewithDatabaseConfigurationAssistant(DBCA).
--Oracle 使用了一个完全自动的机制:
AUM 来管理undo 的信息和空间。
使用AUM之后,数据库在undo表空间里管理undosegments。
从Oracle11g开始,新建的数据库默认就是用AUM。
在使用DBCA 创建实例时,会自动创建一个自动扩展的UNDO表空间:
UNDOTBS1.
Whentheinstancestarts,thedatabaseautomaticallyselectsthefirstavailableundotablespace.Ifnoundotablespaceisavailable,theinstancestartswithoutanundotablespaceandstoresundorecordsinthe SYSTEM tablespace.Thisisnotrecommended,andanalertmessageiswrittentothealertlogfiletowarnthatthesystemisrunningwithoutanundotablespace.
--当启动实例时,db 会自动选择第一个可用的undo 表空间,如果没有undo 表空间可用,那么实例也会启动,但这种情况undo 记录是存在SYSTEM 表空间的rollbacksegment里,这种情况是不推荐使用,并且在使用SYSTEM 表空间时,alertlog里也会出现警告信息,说没有使用undo 表空间。
Ifthedatabasecontainsmultipleundotablespaces,youcanoptionallyspecifyatstartupthatyouwanttouseaspecificundotablespace.Thisisdonebysettingthe UNDO_TABLESPACE initializationparameter,asshowninthisexample:
--如果数据库包含多个undo 表空间,那么可以选择在启动时通过UNDO_TABLESPACE参数来决定使用哪个表空间,如下:
UNDO_TABLESPACE=undotbs_01
Ifthetablespacespecifiedintheinitializationparameterdoesnotexist,the STARTUP commandfails.The UNDO_TABLESPACE parametercanbeusedtoassignaspecificundotablespacetoaninstanceinanOracleRealApplicationClustersenvironment.
--如果在初始化参数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UNDO 空间 详解