Oracle core02_数据块
数据更改
oracle core完成了oracle的核心功能,recovery,读一致性等。 深入的了解oracle的机制,就从一个最简单的更新开始。
对于oracle来说,最大的一个特性就是写了两次数据:
- 写数据到数据文件中
- 写数据的变更日志到日志文件中
对于最常见的数据更新来说,oracle主要做了一下动作:
- 创建数据块变更的日志记录即 redo change vector
- 创建数据块的映像即undo record
- 创建undo数据块变更的日志记录
- 更新数据块
下面就以update为例:记录变更的过程。
实验环境:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
oracle对于update,会依次做以下变更:
- 创建插入undo record的undo变更redo change vector
- 创建数据块变更的redo change vector
- 组合redo change vector为record写入log buffer
- undo record插入到undo块中
- 更新数据块
这里可以看到,对于oracle来说,所有的数据块的变更都是日志先行。
1. 准备数据:
SYS/SYS@ORCL>create table test(id number, name varchar2(100));
Table created.
SYS/SYS@ORCL>insert into test values(1,'xpchild_1');
1 row created.
SYS/SYS@ORCL>insert into test values(2,'xpchild_2');
1 row created.
SYS/SYS@ORCL>insert into test values(3,'xpchild_3');
1 row created.
SYS/SYS@ORCL>commit;
Commit complete.
2.dump 当前数据块
SYS/SYS@ORCL>select owner, segment_name, tablespace_name, HEADER_FILE, HEADER_BLOCK , blocks
from dba_segments where segment_name='TEST' AND OWNER='XPCHILD'; OWNER SEGMENT_NAME TABLESPACE_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------- -------------------- -------------------- ----------- ------------ ----------
XPCHILD TEST USERS 4 475 8 SYS/SYS@ORCL>select owner, segment_name, tablespace_name, file_id, block_id,blocks
from dba_extents where owner='XPCHILD' and segment_name='TEST'; OWNER SEGMENT_NAME TABLESPACE_NAME FILE_ID BLOCK_ID BLOCKS
-------------------- -------------------- -------------------- ---------- ---------- ----------
XPCHILD TEST USERS 4 473 8
上面的两个数据字典的查询,可以得出,test表在users表空间中,file_id为4。一共分配了一个extents,包括8个block。
SYS/SYS@ORCL>alter system dump datafile 4 block 473,474,475,476; System altered.
block 473,474分别是first level bitmap block,second level bitmap block。主要记录块的空闲情况。
如:
--------------------------------------------------------
DBA Ranges :
--------------------------------------------------------
0x010001d9 Length: 8 Offset: 0 0:Metadata 1:Metadata 2:Metadata 3:75-100% free
4:75-100% free 5:75-100% free 6:75-100% free 7:75-100% free
block 475为pagetable segment header。
block 480为存放真正数据的块,这也是堆管理的方式所决定,如下dump信息所示:
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.01e.000000f4 0x008000aa.00f0.14 --U- 3 fsc 0x0000.000d61e9
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0xe:pti[] nrow=3 offs=0
0x12:pri[] offs=0x1f88
0x14:pri[] offs=0x1f78
0x16:pri[] offs=0x1f68
block_row_dump:
tab 0, row 0, @0x1f88
tl: 16 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [] c1 02
col 1: [] 78 70 63 68 69 6c 64 5f 31
tab 0, row 1, @0x1f78
tl: 16 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [] c1 03
col 1: [] 78 70 63 68 69 6c 64 5f 32
tab 0, row 2, @0x1f68
tl: 16 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [] c1 04
col 1: [] 78 70 63 68 69 6c 64 5f 33
2, 更新数据
SYS/SYS@ORCL>SYS/SYS@ORCL>update test set name='it is beyond the current length' where id=2;
Session altered.
SYS/SYS@ORCL>alter system dump datafile 4 block 480;
System altered.
-------------------------------------------------------
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0001.01e.000000f4 0x008000aa.00f0.14 C--- 0 scn 0x0000.000d61e9
0x02 0x0001.018.000000f4 0x008000aa.00f0.26 --U- 1 fsc 0x0000.000d6475
0xe:pti[] nrow=3 offs=0
0x12:pri[] offs=0x1f88
0x14:pri[] offs=0x1f41
0x16:pri[] offs=0x1f68
block_row_dump:
tab 0, row 0, @0x1f88
tl: 16 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [] c1 02
col 1: [] 78 70 63 68 69 6c 64 5f 31
tab 0, row 1, @0x1f41
tl: 39 fb: --H-FL-- lb: 0x2 cc: 2
col 0: [] c1 03
col 1: []
69 74 20 69 73 20 20 62 65 79 6f 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74
20 6c 65 6e 67 74 68
tab 0, row 2, @0x1f68
tl: 16 fb: --H-FL-- lb: 0x0 cc: 2
col 0: [] c1 04
col 1: [] 78 70 63 68 69 6c 64 5f 33
这里主要说明两点:
- @0x1f78变为@0x1f41,这里是代表的这一行的真正的行内偏移地址,因为update更新一个比当前大的值,需要一个更大的连续空间,所以在块内部行进行了迁移,即偏移量发生了变化,rowid指向的是slot的地址,所以update仅仅是更新了slot中存放的块内偏移量,rowid保持不变。
- 开始事务时,lock byte lb:变为了0x2。关联的事务标示为itl(interested transaction list)。
redo change vector
接下来看下redo change vector的内容:
SYS/SYS@ORCL>alter system switch logfile;
System altered.
SYS/SYS@ORCL>update test set name='ssssssss' where id=2;
1 row updated.
SYS/SYS@ORCL>commit;
Commit complete.
SYS/SYS@ORCL>alter system switch logfile;
System altered. SYS/SYS@ORCL>select * from v$Log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- -------------------
1 1 5 52428800 1 NO CURRENT 879223 2012-01-11 17:11:00
2 1 4 52428800 1 YES ACTIVE 879196 2012-01-11 17:09:52
3 1 3 52428800 1 YES ACTIVE 879176 2012-01-11 17:08:57
SYS/SYS@ORCL>select SEQUENCE# , name from v$archived_log;
SEQUENCE# NAME
---------- -----------------------------------------------------------------------------------
1 /opt/oracle/flash_recovery_area/ORCL/archivelog/2012_01_11/o1_mf_1_1_7jvkvdfo_.arc
2 /opt/oracle/flash_recovery_area/ORCL/archivelog/2012_01_11/o1_mf_1_2_7jw23sfk_.arc
3 /opt/oracle/flash_recovery_area/ORCL/archivelog/2012_01_11/o1_mf_1_3_7jw25j8o_.arc
4 /opt/oracle/flash_recovery_area/ORCL/archivelog/2012_01_11/o1_mf_1_4_7jw27nhp_.arc 23 rows selected. SYS/SYS@ORCL>alter system dump logfile
'/opt/oracle/flash_recovery_area/ORCL/archivelog/2012_01_11/o1_mf_1_4_7jw27nhp_.arc'; System altered. KTB Redo
op: 0x11 ver: 0x01
op: F xid: 0x0004.013.000000fb uba: 0x00800054.0110.05
Block cleanout record, scn: 0x0000.000d6a6c ver: 0x01 opt: 0x02, entries follow...
itli: 1 flg: 2 scn: 0x0000.000d6a12
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010001e0 hdba: 0x010001db
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 2 ckix: 10
ncol: 2 nnew: 1 size: 1
col 1: [] 73 73 73 73 73 73 73 73
这一部分代表的是更新数据库的redo。bdba代表更新的块,hdba代表segment header。
SYS/SYS@ORCL>select ubafil,ubablk,start_ubablk,used_ublk from v$transaction; UBAFIL UBABLK START_UBABLK USED_UBLK
---------- ---------- ------------ ----------
2 155 155 1 1 row selected.
SYS/SYS@ORCL>alter system dump datafile 2 block 155;
System altered.
对于更新的事务,根据v$transaction可以查询到这个事务使用的undo块的信息,然后dump这个块的情况:
*-----------------------------
* Rec #0x5 slt: 0x0f objn: 52634(0x0000cd9a) objd: 52634 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x00
Undo type: Regular undo Begin trans Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
uba: 0x0080009b.00f2.03 ctl max scn: 0x0000.000d56ca prv tx scn: 0x0000.000d56e5
txn start scn: scn: 0x0000.000d6dec logon user: 0
prev brb: 8389342 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0004.013.000000fb uba: 0x00800054.0110.05
flg: C--- lkc: 0 scn: 0x0000.000d6a70
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010001e0 hdba: 0x010001db
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 12
ncol: 2 nnew: 1 size: -1
col 1: [] 78 70 63 68 69 6c 64
这便是undo块的dump信息,这里也可以看到,undo的信息也仅仅只保留了被改变的那一部分信息,而不是整个块的原始镜像。
txn start scn: 0x0000.000d6a12 logon user: 0 prev brb: 8388689 prev bcl: 0 KDO undo record:
KTB Redo
op: 0x04 ver: 0x01
op: L itl: xid: 0x0001.018.000000f4 uba: 0x008000aa.00f0.26
flg: C--- lkc: 0 scn: 0x0000.000d6475
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x010001e0 hdba: 0x010001db
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 10
ncol: 2 nnew: 1 size: -1
col 1: [] 78 70 63 68 69 6c 64
这一部分代表undo的redo日志,因为oracle对所有对数据块的变更都写两份,一份是数据变更,一份是日志,这一部分就是
对undo 块变更的重做日志。
Oracle core02_数据块的更多相关文章
- oracle --(一)数据块(data Block)
基本关系:数据库---表空间---数据段---分区---数据块 数据块(data Block)一.数据块Block是Oracle存储数据信息的最小单位.这里说的是Oracle环境下的最小单位.Orac ...
- oracle数据块核心剖析
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp57 数据块(Oracle Data Blocks),本文简称为" ...
- ORACLE体系结构一 (逻辑结构)-表空间、段、区和数据块
一.Oracle的逻辑结构 Oracle的逻辑结构是一种层次结构.主要由:表空间.段.区和数据块等概念组成.逻辑结构是面向用户的,用户使用Oracle开发应用程序使用的就是逻辑结构.数据库存储层次结构 ...
- ORACLE体系结构逻辑结构-表空间、段、区和数据块
转自: https://www.cnblogs.com/sunziying/p/8994792.html 一.Oracle的逻辑结构 Oracle的逻辑结构是一种层次结构.主要由:表空间.段.区和数据 ...
- 对Oracle数据库坏块的理解
1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说 ...
- Oracle Block Cleanouts 块清除
当用户发出提交(commit)之后,oracle是需要写出redo来保证故障时数据可以被恢复,oracle并不需要在提交时就写出变更的数据块.由于在事务需要修改数据时,必须分配ITL事务槽,必须锁定行 ...
- Oracle数据块损坏篇之10231内部事件
实验:某个分区数据块损坏,不完全恢复此分区表数据 背景:数据库没有有效备份,某个分区中有数据块损坏. 要求:最大限度恢复此分区数据. 环境:RHEL 6.4 + Oracle 11.2.0.4 1. ...
- [转]Oracle数据块体系的详细介绍
数据块概述Oracle对数据库数据文件(datafile)中的存储空间进行管理的单位是数据块(data block).数据块是数据库中最小的(逻辑)数据单位.与数据块对应的,所有数据在操作系统级的最小 ...
- ORACLE 数据块dump
1. rdba(Tablespace relative database block address) 是相对数据块地址,是数据所在的地址,rdba可就是rowid 中rfile#+block#. 根 ...
随机推荐
- 20151214 jquery插件代码备份
;(function ($) { //局部性的 /*$.fn.extend({ 'nav' : function (color) { $(this).find('.nav').css({ 'list- ...
- android测试分析1
Android测试框架,开发环境中集成的一部分,提供一个架构和强有力的工具 可以帮助测试你的应用从单元到框架的每个方面. 测试框架有这些主要特征: 1.Android测试组件基于Junit.你可以使用 ...
- 高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)
高吞吐高并发Java NIO服务的架构(NIO架构及应用之一) http://maoyidao.iteye.com/blog/1149015 Java NIO成功的应用在了各种分布式.即时通信和中 ...
- Java根据出生年月日获取到当前日期的年月日
源码链接:http://pan.baidu.com/s/1sj61IUD
- ASP.NET MVC5总结(四)登陆中常用技术解析之验证码
在应用软件中,登陆系统我们往往会用到验证码技术,下面将介绍在MVC中用到的验证码技术. 1.前端代码段及前端效果图如下 <div class="row"> <in ...
- IOS中的NSTimer定时器详解
/* 在IOS中有多种定时器,这里我对NSTimer定时器做了一个简单的介绍.如果你是小白,你可能会从这篇文章中学习到一些知识,如果你是大牛,请别吝啬你的评论,指出我的不足,你的质疑是对我最大的帮助. ...
- 11_关于SqlMapperConfig.xml
[简述] SqlMapConfig.xml是Mybatis的全局配置文件,配置内容如下: 1.properties---------属性 2.settings-----------全局配置参数 3.t ...
- 删除Windows右键不用的选项
1.使用QQ电脑管家或者360的,一般都有小工具. 2.管理注册表 █以WindowsXP(SP2)为例,有些右键菜单中的选项你并不常用,或者有些软件已被删除,但其仍然占据着右键菜单.要删除这些无用的 ...
- unsigned int 转 RGB
unsigned int颜色存储格式:0xaabbggrr,其中a,b,g,r分别表示,透明度.蓝色.绿色.红色. 方法一:使用windows宏 unsigned int clr = 0x00FF00 ...
- WPF页面跳转
WPF页面跳转有两种:一种是windows,另外一种是page 1:windows页面跳转windows 页面跳转相信学过winform编程的哥们都知道,先实例化该窗体然后show一下就可以了.eg ...