问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

undo表空间存放什么样的数据

发布网友 发布时间:2022-04-11 23:49

我来回答

2个回答

懂视网 时间:2022-04-12 04:11

下面我对UNDO段头块的格式做一个全面深入的解析。有助于我们了解事务的本质。 好,为了方便测试,我来创建一个很小的UNDO表空间,如下操作: gyj@OCM create undo tablespace undotbs4 datafile /u01/app/oracle/oradata/ocm/undotbs04.dbf size 192k;Tablesp

下面我对UNDO段头块的格式做一个全面深入的解析。有助于我们了解事务的本质。

好,为了方便测试,我来创建一个很小的UNDO表空间,如下操作:

gyj@OCM> create undo tablespace undotbs4 datafile '/u01/app/oracle/oradata/ocm/undotbs04.dbf' size 192k;

Tablespace created.

gyj@OCM> alter system set undo_tablespace=undotbs4;

System altered.
 
gyj@OCM> select * from v$rollname;

 USN NAME
---------- ------------------------------
  0 SYSTEM
 17 _SYSSMU17_3012809736$
 

发生一个事务:

gyj@OCM> update gyj_test set name='guoyJoe' where id=1;

1 row updated.

转储UNDO段头块:

gyj@OCM> alter system dump undo header"_SYSSMU17_3012809736$";

System altered.

找到DUMP的UNDO段头块的跟踪日志:

gyj@OCM> select * from v$diag_info wherename='Default Trace File';

INST_ID NAME VALUE

---------- ----------------------------------------------------------------------------

1Default Trace File /u01/app/oracle/diag/rdbms/ocm/ocm/trace/ocm_ora_6151.trc

分析UDNO段头块的日志

[root@mydb ~]# more/u01/app/oracle/diag/rdbms/ocm/ocm/trace/ocm_ora_6151.trc

********************************************************************************
Undo Segment: _SYSSMU17_3012809736$ (17)
********************************************************************************
 Extent Control Header
 -----------------------------------------------------------------
 Extent Header:: spare1: 0 spare2: 0 #extents: 2 #blocks: 15 
   last map 0x00000000 #maps: 0 offset: 4080 
 Highwater:: 0x0280000a ext#: 0 blk#: 1 ext size: 7 
 #blocks in seg. hdr's freelists: 0 
 #blocks below: 0 
 mapblk 0x00000000 offset: 0 
   Unlocked
 Map Header:: next 0x00000000 #extents: 2 obj#: 0 flag: 0x40000000

#extents: 2 表示17号UNDO段有两个区

#blocks: 15 表示17号UNDO回滚段两个区中有15个UNDO BLOCK可用。(为什么不是16个UNDO BLOCK块呢,去掉一个UNDO段头块)

ext#: 0 表示这个事务发生在第1个区(从0开始)

blk#: 1 表示这个事务发生在第1个区的第1个块上。

ext size: 7 表示1个区上有7个UNDO BLOCK可用

通过v$rollname视图查出是17号UNDO回滚段

gyj@OCM> select * from v$rollname;

USN NAME

---------- ------------------------------

0 SYSTEM

17 _SYSSMU17_3012809736$

通过dba_extents视图查出一共有两个区,共16个块

gyj@OCM> select extent_id,file_id,block_id,blocks,bytes fromdba_extents where segment_name='_SYSSMU17_3012809736$';

EXTENT_ID FILE_ID BLOCK_ID BLOCKS BYTES

---------- ---------- ---------- ---------- ----------

0 10 8 8 65536

1 10 16 8 65536

通过dba_segments视图查出UNDO段头块,即10号文件的8号块是UNDO段头块(所以#blocks:15)

gyj@OCM> select header_file,header_block from dba_segments wheresegment_name='_SYSSMU17_3012809736$';

HEADER_FILE HEADER_BLOCK

----------- ------------

10 8

 Extent Map
 -----------------------------------------------------------------
 0x02800009 length: 7 
 0x02800010 length: 8 

17号UNDO回滚段的区地图一共有两个区:

第一个区对应的是10号文件1号块、2号块、3号块、4号块、5号块、6号块、7号块,共7个UNDO BLOCK

第一个区对应的是10号文件9号块、10号块、11号块、12号块、13号块、14号块、15号块,16号块,共8个UNDO BLOCK

Retention Table 
 -----------------------------------------------------------
 Extent Number:0 Commit Time: 1389838948
 Extent Number:1 Commit Time: 1389838948

区的提交时间戳,是从1970年1月1号零晨开始的(以秒为单位记录)
TRN CTL:: seq: 0x000d chd: 0x000a ctl: 0x000b inc: 0x00000000 nfb: 0x0000
  mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
  uba: 0x0280000a.000d.2e scn: 0x0000.0028a2af

事务控制:

seq: 0x000d 表示此事务修改前的值所在的UNDOBLOCK块被覆盖了13次,与下面的uba: 0x0280000a.000d.2e中的000d对应。

chd:0x000a 表示发生一个新的事务,此时会在下面的TRNTBL::(事务表)的index=0x000a槽中放入新事务信息,即事务表的链头或叫入口。

ctl: 0x000b 表示事务表的链尾(实际上大家可以去TRN TBL::看index=0x000b,它对应的SCN=0x0000.0028a4d5是本事务表中最大的SCN,即此事务槽最后才会被覆盖)

nfb: 0x0000 表示UNDO块在空闲池的空闲块数,0x0000表示池中没有空闲UNDO块了,即FREE BLOCKPOOL::没空闲的块了。

flg: 0x0001 表示该块的用途,1=KTUUNDO HEADER(2=KTU UNDO BLOCK等等)

uba: 0x0280000a.000d.2e 表示新事务的第一条UNDO记录(由三部分组成undo块的地址、UNDO块被重用的次数、在UNDO块的第几条记录)

undo块的地址: 0x0280000a 即10号文件的10号块

UNDO块被重用的次数: 000d 即UNDO块被覆盖了13次

在UNDO块的第几条记录 2e 即在UNDO块的第46条

scn: 0x0000.0028a2af 表示17号UNDO段头块中最小的提交的SCN。实际上这个SCN就是事务表中最小的SCN所对应的事务槽上的SCN

注:下面的事务控制,是我在发生事务前(即做update gyj_test set name='GGGGG' where id=1;前所DUMP的事务控制)

TRN CTL:: seq: 0x000d chd: 0x0017 ctl: 0x000b inc: 0x00000000 nfb:0x0001

mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)

uba: 0x0280000a.000d.2b scn: 0x0000.0028a26a

OK,我们从chd: 0x0017,找到事务表中的INDEX=0x0017

TRN TBL::

index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt

------------------------------------------------------------------------------------------------

0x17 9 0x00 0x001c 0x000a 0x0000.0028a2af 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 1389839441

有没有发现上面的scn=0x0000.0028a2af,是不是就是我们事务控制中所记录的SCN,明白了吧,实在不明白的来ORACLE DSI群讨论(群号127149411)

FREE BLOCK POOL::
 uba: 0x00000000.000d.2d ext: 0x0 spc: 0x8b8 
 uba: 0x00000000.000d.0d ext: 0x0 spc: 0x19e8 
 uba: 0x00000000.0009.08 ext: 0x0 spc: 0x932 
 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 
 uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0 

UNDO块的空闲池,当事务做了提交会把此事务所在的UNDO块加入空闲池中。

uba: 由三部分组成undo块的地址、UNDO块被重用的次数、在UNDO块的第几条记录,当undo块的地址为0说明UNDO块不是空闲的,即0x00000000

ext: UNDO块是在哪个区(extent)

spc: UNDO块中多少空闲空间,单位字节

从上面的UNDO空闲池中看,没有空闲的UNDO块。

 TRN TBL::
 
 index state cflags wrap# uel  scn  dba  parent-xid nub stmt_num cmt
 ------------------------------------------------------------------------------------------------
 0x00 9 0x00 0x001d 0x001f 0x0000.0028a444 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x01 9 0x00 0x001d 0x000e 0x0000.0028a454 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x02 9 0x00 0x001d 0x0003 0x0000.0028a448 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x03 9 0x00 0x001d 0x0005 0x0000.0028a44a 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x04 9 0x00 0x001d 0x000b 0x0000.0028a4d3 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984076
2
 0x05 9 0x00 0x001d 0x001d 0x0000.0028a44c 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x06 9 0x00 0x001d 0x000d 0x0000.0028a493 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984061
2
 0x07 9 0x00 0x001d 0x0008 0x0000.0028a452 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x08 9 0x00 0x001d 0x0001 0x0000.0028a453 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x09 9 0x00 0x001d 0x0016 0x0000.0028a457 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x0a 9 0x00 0x001c 0x0020 0x0000.0028a2e3 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138983956
2
 0x0b 9 0x00 0x001d 0xffff 0x0000.0028a4d5 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984076
2
 0x0c 9 0x00 0x001d 0x0006 0x0000.0028a459 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x0d 9 0x00 0x001d 0x0012 0x0000.0028a495 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984061
2
 0x0e 9 0x00 0x001c 0x0009 0x0000.0028a455 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x0f 9 0x00 0x001d 0x0011 0x0000.0028a498 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984061
2
 0x10 9 0x00 0x001d 0x0014 0x0000.0028a4c3 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984073
7
 0x11 9 0x00 0x001d 0x0010 0x0000.0028a499 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984061
2
 0x12 9 0x00 0x001d 0x000f 0x0000.0028a497 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984061
2
 0x13 9 0x00 0x001d 0x0004 0x0000.0028a4d1 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984076
2
 0x14 9 0x00 0x001d 0x0013 0x0000.0028a4c8 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138984074
0
 0x15 9 0x00 0x001c 0x0019 0x0000.0028a2f9 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138983956
2
 0x16 9 0x00 0x001a 0x000c 0x0000.0028a458 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x17 10 0x80 0x001d 0x0000 0x0000.0028a4f7 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 0
 0x18 9 0x00 0x001c 0x0021 0x0000.0028a3de 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984016
1
 0x19 9 0x00 0x001c 0x001c 0x0000.0028a31e 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138983966
3
 0x1a 9 0x00 0x001c 0x001e 0x0000.0028a35f 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138983984
8
 0x1b 9 0x00 0x001c 0x0007 0x0000.0028a450 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x1c 9 0x00 0x001c 0x001a 0x0000.0028a35e 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138983984
8
 0x1d 9 0x00 0x001b 0x001b 0x0000.0028a44e 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x1e 9 0x00 0x001c 0x0018 0x0000.0028a3dc 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984016
1
 0x1f 9 0x00 0x001c 0x0002 0x0000.0028a446 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984044
9
 0x20 9 0x00 0x001b 0x0015 0x0000.0028a2ee 0x0280000a 0x0000.000.00000000 0x00000001 0x00000000 138983956
2
 0x21 9 0x00 0x001c 0x0000 0x0000.0028a3e0 0x02800009 0x0000.000.00000000 0x00000001 0x00000000 138984016
1

TRN TBL::(事务表)是UNDO段头块最重要的。我们一一来解释每个字段的意思:

index 表示事务表中槽号,只是一个序列而已,从0x00开始到0x21结束,11g的版本有34个槽。

state 表示事务状态:9代表事务不活动,10代表事务正在活动,从这里我们看出16进制第0x17号槽上的事务正在活动。大家有没有发现,我们在发生事务前,Oracle会找事务控制列表中的chd=0x0017,说白了就是重从index=0x17的槽,存放当前最新的事务:

注:下面的事务控制,是我在发生事务前(即做update gyj_test set name='GGGGG' where id=1;前所DUMP的事务控制)

TRN CTL:: seq: 0x000d chd: 0x0017 ctl: 0x000b inc: 0x00000000 nfb:0x0001

mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)

uba: 0x0280000a.000d.2b scn: 0x0000.0028a26a

cflags 表示正在使用穿上事务槽的事务的状态:0x00表示非活动事务、0x80表示活动事务、0x10表示死事务、0x90表示被回滚的死事务

平时我们看到的最多就是0x00表示非活动事务、0x80表示活动事务,后面的很少发生。

wrap# 表示事务表上的事务槽被重用的次数,它是XID的一部分。0x001d表示此时事务槽被重用了29次。

uel 表示当前活动事务所在事务槽的下一个事务槽的指针(即如果又发生一个新的事务,此时就会用到UEL指向的事务槽上的index)。

scn 表示务事启动、提交、回滚的SCN.

dba 表示uba:第一部分的undo块地址,这个DBA是(rollback)回滚的起始点,也就是说是记录事务修改的最后一条记录所在UNDO块的地址。

nub 表示当前事务所用到的UNDO块的个数。

cmt 表示最接近当前的提交时间戳,是从1970年1月1号零晨开始的(以秒为单位记录)。0表示事务正在活动。

先说到这儿,后继会对UNDO块格式,REDO块格式继续进行分析。最后通过一个事务的例子,把REDO块、UNDO段头块、UNDO块、DATA块串起来一起分析。

热心网友 时间:2022-04-12 01:19

UNDO表空间用于存放UNDO数据,当执行DML操作时,oracle会将这些操作的旧数据写入到UNDO段,以保证可以回滚或者一致读等,而临时表空间主要用来做查询和存放一些缓冲区数据。你听说UNDO也是临时表可能是因为这两个表空间都不会永久保存数据的原因。
-------------------------------------------------------------------------
oracle undo表空间

undo表空间用于存放undo数据,当执行DML操作(insert、update、delete)时,oracle会将这些操作的旧数据写入到undo段。

undo数据的作用

1.回退事务

当执行DML操作修改数据后,旧数据被存放在undo段中。只要数据为提交、回滚段未写满或者回滚段为超时的情况下,旧数据都能被回滚回来。

2.读一致性

通过DML操作后的数据没有提交之前,其他用户读取的数据都是回滚段里面的旧数据。

使用undo参数

1.undo_management

该初始化参数用于指定undo数据的管理方式。如果要使用自动管理模式,必须设置为auto,如果使用手工管理模式必须设置该参数为manual,使用自动管理模式时,oracle会使用undo表空间管理,使用手工管理模式时,oracle会使用回滚段管理undo数据。需要注意,使用自动管理模式时,如果没有配置初始化参数UNDO_TABLESPACE,oracle会自动选择第一个可用的UNDO表空间存放UNDO数据,如果没有可用的UNDO表空间,oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。

2,UNDO_TABLESPACE
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 undo段中的某个区是否只能同时被一个事物使用? undo的事务与Undo段 为什么我的程序中ExecuteSQL函数中若SQL语句中含有汉字就会添加失败? 怎么在SQL表中插入数据时使用函数求和? (46)以下叙述中错误的是 A.C程序必须由一个或一个以上的函数组成 B.函数调用可以作为一个独立的语句存在 以下叙述中错误的是( )A C程序必须由一个或一个以上的函数组成B函数调用可以作为一个独立的语句存在 面向对象的特征有哪些方面? 设计一个函数,函数的功能是向数组中插入一个数,插入后仍为有序数组 C程序中如果要使用数学函数,如sin(x),log(x)等,需要在程序中加入的语句是 在Excel中函数插入的技巧具体有哪些 ORACLE如何执行一个带有插入语句的函数 听人讲用BT下载东西会伤硬盘不知是不是呢?那用讯雷下载会伤硬盘吗? 电脑检测到一个硬盘问题 浅谈为什么需要买SSD固态硬盘 浅谈硬盘的分区与格式化 计算机毕业论文 浅谈硬盘数据恢复 电脑买什么牌子的比较好? 浅析三星750 evo和850 evo固态硬盘的不同区别 电脑很卡,检测硬盘重新分配扇门计数警告 怎么解决 用BT为什么会伤硬盘? oracle 回滚段设置多大 undotbs1 如何解决Ora-00600 4194错误 undo 表空间 多大 当有很多个.c和.h文件的时候,gdb如何调试啊?在A.c文件中有50行,在B.c文件中有50行,那么 请问一下,那位高手知道数据库语句中 in ,on ,with 等关键字的用法啊,求解....... 数据库中查询 with as 结果集的同时,得到结果集的行数,能实现吗? SQL 语句中的With(index(0)) in writing/by writing /with writing 的区别 如何在spring框架中解决多数据源 hibernate的相关问题 关于Hibernate的一些问题 hibernate常识小问题 关于hibernate的小问题 hibernate的一些问题 hibernate的问题 有关hibernate的问题 hibernate 的简单问题 Hibernate 中的问题 关于hibernate的问题。。 关于hibernate的问题