深入解析Oracle undo原理-transaction

作者简介:惠星星,现就职于北京海天起点,持有OCP 10g、OCP 11g、OCM 11g证书,并有长达8年电力行业业务维护、数据库维护服务经验,擅长Oracle数据库性能优化、故障处理及数据可视化技术研究。

 

关于undo作用

Oracle数据库使用undo维护事务操作的记录,undo作用如下所示,

  • Roll back an active transaction
  • Recover a terminated transaction
  • Provide read consistency
  • Perform some logical flashback operations

深入理解Oracle数据库undo原理对于数据库异常恢复、性能优化具有重要意义。

关于oracle中的事务

事务是包含一个或多个SQL语句的逻辑原子单元。事务对SQL语句进行分组,使全部提交或全部回滚。Oracle数据库为每个事务分配一个称为transaction ID(XID)的惟一标识符。所有Oracle事务都遵循数据库事务的基本属性,即ACID属性。ACID解析如下:

Atomicity:事务的所有任务要么全部提交,要么全部回滚

Consistency:事务将数据库从一个一致的状态修改为另一个一致的状态。

Isolation:在提交事务之前,事务的变更对其他事务是不可见的。

Durability:提交的事务所做的变更是永久性的。

多个dml是一个事务还是多个事务?

测试表信息

同一session多个dml操作

不同session多个dml操作

小结

同一session中多个dml为同一事务,不同session中多个dml为不同事务。

深入解析undo段分配规则

当Oracle数据库undo剩余空间小于100%时,Oracle为每个事务分配一个新的回滚段,初始为2个extent各8 blocks;

2M undo测试结果

每个回滚段初始16 个blocks,合计128K,2M空间最多可生成16个回滚段,当生成第15个回滚段时开始回滚段重用,因此当UNDO表空间剩余空间小于100%时会一直创建新的回滚段,尽可能为每一个事务分配一个新的回滚段。

3M undo测试结果

根据2M undo的测试结果,推测3M undo在前23个事务都会创建新的回滚段,当开始第24个事务时,不会再创建回滚段,而是会和某事务共用某个已经存在的回滚段,测试结果和推测一致。

深入解析Tx Header

Tx Header由固定部分和可变部分组成。固定部分包含事务块头和一个描述符ITL。变量部分由零个或多个描述符itl组成,通过dump 数据块的方式,分析其内部结构:

查询数据物理块信息:

修改记录产生事务:

dump 数据块信息:

csc: 0x00.b6376 —块清除scn

itc: 3 — ITL数量

flg: E —大写的”O“表示Block is on free list

ITL各字段含义如下所示,

Column Description
Itl The array index for the list.The number isn’t physically stored in the block;it’s generated by the code that does the dump.This value isused in the lock byte(lb)for a row to show which transaction has locked the row.
Xid Identifier of the transaction owning the ITL, composed of three items: usn#.slot#.wrap#
Uba Undo block address (UBA) of the record in the undo segment: DBA.seq#.rec#
Flag —-:active(or “never existed” if every field in the Xid is zero)
–U-: Upper bound commit(also set during “fast commit”)
-B–: the recursive transactions for index block splits.
—T: transaction was active during block cleanout.
Lck Number of rows locked by this transaction in the block
Scn/Fsc If the transaction has been committed, the SCN of the transaction;
If the transaction has not been committed, the free space credits owned by this transaction (if any)

深入解析XID

事务标识符(XID)惟一地标识系统中的事务,结构如下所示,

XID = usn# (2 bytes). slot# (2 bytes). wrap#/sqn(4 bytes)
usn: Undo segment number
slot: Transaction table slot number
wrap: Sequence number or wrap#

使用bbed查看xid内部结构如下所示,

查询事务信息

查询回滚段信息

dump95号回滚段:

State:

9 表示:Inactive, no local Tx
10 表示:Active, begin local Tx

深入解析UBA

UBA惟一地标识给定事务的undo block。包含在ITL中,

UBA = DBA(4 bytes). seq#(2 bytes). rec#(2 bytes)
dba: Data block address (DBA) of the block
seq: The sequence number of the block
rec: The record number within the block

使用bbed查看UBA内部结构如下所示,


说明

以上内容为个人多次测试结果,由于个人原因,如有分析不足之处还请见谅及指正,谢谢。

未经允许不得转载:Oracle一体机用户组 » 深入解析Oracle undo原理-transaction

相关推荐