开篇我们先用一个实验引出事务:
sys@ORCL> select xid,xidusn,xidslot,xidsqn,ubablk,ubafil from v$transaction;
no rows selected
没找到相应的事务信息,用hr发起一条事务:
hr@ORCL> select * from p;
ID TEST
---------- -----
2 f
3 g
1 a
hr@ORCL> update p set test='w' where id=1;
1 row updated.
再次查看事务信息:
sys@ORCL> /
XID XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL
---------------- ---------- ---------- ---------- ---------- ----------
02000800E2010000 2 8 482 3339 2
查看hr发起事务所对应的回滚段:
sys@ORCL> select xidusn,sid,username from v$transaction t,v$session s where t.ses_addr=s.saddr;
XIDUSN SID USERNAME
---------- ---------- ------------------------------
2 141 HR
9 158 SCOTT
查看2号回滚段的段名:
sys@ORCL> 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.
然后把2号回滚段的段头dump出来,到udump目录下去找:
sys@ORCL> select header_block,header_file from dba_segments where segment_name='_SYSSMU2$';
HEADER_BLOCK HEADER_FILE
------------ -----------
41 2
sys@ORCL> alter system dump undo header '_SYSSMU2$';
System altered.
查看当前会话的server process的进程编号:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
SPID
------------
5446
2号undo段头部dump出来的部分内容如下:
Version: 0x01
FREE BLOCK POOL::
uba: 0x00800017.027b.0b ext: 0x2 spc: 0x19d8
uba: 0x00000000.027b.02 ext: 0x2 spc: 0x1f06
uba: 0x00000000.0278.1f ext: 0x10 spc: 0xf54
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x01e8 0x001d 0x0000.0014d967 0x00800016 0x0000.000.00000000 0x00000001 0x00000000 1343716115
0x01 9 0x00 0x01e9 0x002d 0x0000.0014db8f 0x00800017 0x0000.000.00000000 0x00000001 0x00000000 1343717092
0x02 9 0x00 0x01e8 0x0009 0x0000.0014d4b9 0x00800012 0x0000.000.00000000 0x00000001 0x00000000 13437138
这里面有个很重要的概念叫:xid
xid是事务的编号,也是地址,它由三部分组成:
1)使用哪个undo segment header(块号)
2)使用undo segment header里面的事务表的哪一行(行号)
3)是第几次被覆盖(覆盖的次数)
一个事务开始时,会在两个位置,做两件事:
a)在相对空闲的回滚段的段头的事务表(最多47行)标注事务信息,其中包括了xid,uba;并且分配回滚块
b)把要修改的数据块的块头的事务槽(最多255个槽位)上标注事务信息,其中包含了xid,uba
整个过程有四个地方发生了变化:undo segment header,回滚块,数据块的块头,数据块。这四个地方的变化都得到了redo的保护。
分享到:
相关推荐
### 专题之Undo工作原理剖析 #### 一、Oracle 10g中Undo表空间的原理 在深入了解Oracle 10g中Undo的工作原理之前,我们先简要回顾一下Undo的概念及其在数据库中的作用。Undo数据是用于实现事务的一致性、隔离性和...
- **读的一致性**:当一个事务正在执行时,其他事务读取该数据时,Oracle会使用UNDO信息来构造一致性读视图(CR块),确保读者看到的数据是事务开始时的状态。 - **回滚**:如果事务被回滚,Oracle会利用UNDO信息...
每个事务分配一个Undo段,而一个Undo段可能服务于多个事务。在事务处理过程中,Undo信息用于支持回滚操作,确保在多用户环境中数据的一致性,并防止因事务失败导致的数据丢失。 Undo表空间有其特殊性质,它只能与...
当一个事务开始时,数据库会为这个事务创建一个undo log段,用于存储所有更改操作的原始值。如果事务正常提交,这些记录通常会被清理;但如果事务被回滚,undo log就成为恢复原始数据的关键。 事务的四大特性(ACID...
资源名称:Oracle 11g体系结构深入剖析和运维管理(五)资源目录:【】37_深入剖析事务槽及Oracle多种提交方式【】38_OracleIMU及RedoPrivateStrands技术【】39_读一致性(ORA-01555错误机制分析)及Undo表空间大小设置...
当一个事务进行修改操作时,Oracle会将旧的值存储到undo表空间中,以便在事务回滚或查询历史数据时使用。 2. **Undo表空间利用率** 表空间的利用率是衡量其使用情况的重要指标。高利用率可能表明undo表空间不足,...
资源名称:Oracle 11g体系结构深入剖析和运维管理(四)资源目录:【】28_存储结构_段区块【】29_检查点队列(checkpointqueue)【】30_实例崩溃恢复原理剖析【】31_系统改变号(SCN)详解【】32_事务概述【】33_事务ACID...
- **操作注册**:每当用户执行一个新的操作,框架需要记录这个操作,创建对应的命令对象,并将其添加到undo栈。 - **撤销与重做管理**:框架需要维护两个栈,一个是undo栈,存储可撤销的操作;另一个是redo栈,...
在Oracle数据库系统中,"重做undo表空间"是一个至关重要的概念,它是数据库事务处理的基础。Undo表空间是用来存储事务撤销操作时所需信息的地方,这些信息被称为重做日志(Redo Log)。当一个事务对数据进行修改时,...
- **私有性**:每个会话都有一个私有的Temporary Undo Segment,用于存储该会话所操作的临时表的Undo记录。 **2. Temporary Undo 的生命周期** - **生命周期**:Temporary Undo Segment 的生命周期与创建它的会话...
UNDO表空间用来存放改变前的旧值。... ORACLE开始一个事务的时候,会用到表空间。将修改前的数据保存在UNDO段里。 Undo的三个作用 读的一致性,构造CR块 回滚 实例恢复(时的回滚) --查询UNDO表空间的名字 -----
MVCC(多版本并发控制)机制是数据库事务隔离...undo log版本链通过保存数据的历史状态,让读操作能够无阻塞地访问到一个一致性的数据快照,而无需等待其他事务的完成。这对于实现大规模并发处理有着极其重要的意义。
这个类维护两个堆栈,一个用于保存undo操作,另一个用于保存redo操作。每次用户执行一个可撤销的操作时,都需要向撤销堆栈添加一个新的undo状态。 3. **实现步骤**: - **创建undo对象**:首先,你需要为你的特定...
在开发Windows应用程序时,撤销/重做功能是一个重要的用户交互元素,它允许用户撤销或恢复他们的操作,提高用户体验。在C#中实现这样的框架可以帮助开发者更轻松地为各种编辑控件(如TextBox、RichTextBox、ComboBox...
Oracle UNDO 机制是 Oracle 数据库中的一种重要机制,用于记录和回滚事务的操作。UNDO 段是 Oracle 数据库中的一种特殊类型的段,用于存储事务的回滚信息。 undo 段的介绍 undo 段是 Oracle 数据库中的一种特殊...
在IT行业中,“Undo”是一个非常基础且重要的概念,它广泛应用于各种软件和应用程序中,特别是在文本编辑器、图像处理软件以及编程环境中。这个功能允许用户撤销最近的操作,恢复到操作前的状态,极大地提高了工作...
当一个事务执行时,如果发生回滚或者在查询过程中需要查看事务开始前的数据状态,撤销段就会提供这些信息。 在达梦数据库中,修改UNDO_RETENTION参数主要是为了平衡数据库的性能和空间利用率。过短的UNDO_RETENTION...
1. 当事务开始时,Oracle 数据库会创建一个 undo 日志文件,用于记录事务的所有操作。 2. 在事务执行过程中,Oracle 数据库会将所有的操作记录到 undo 日志文件中。 3. 当事务撤销时,Oracle 数据库会将 undo 日志...