oracle数据块dump信息,从数据块的dump信息能看出什么
本帖最后由 zcs0237 于 2013-6-13 16:57 编辑
a.本文搜集大量网友文章编写而成
b.为节省篇幅,部分输出结果做了精简
c.感谢对本帖补充、建议、错误更正
d.推荐网站:
=========本文内容:数据块dump相关知识简化总结===========
实验说明:将dump与select出的以下信息比较、分析
1、表的总行数、总列数
2、所改列为第几行第几列
3、从数据块中找到字段值
4、itl事务号与v$trasaction事务号
5、commit对itl中flag/scn的改变
6、commit仅改变itl 条目的flag,its lck和row-header的lb事务指针不变
************************************************
01.1-相关基础知识
一、data block相关原理1、事务修改数据块的流程
--server进程把block读入data buffer
--延迟block cleanout
--在块上请求ITL slot
--如果其他活跃事务通过ITL锁定了要修改的行,则入等待队列。
--锁定要修改的行:事务修改块中的行时,把行中row header中的lb字段置为该事务在该块中获得的ITL的编号,这就是oracle行锁的实现。
2、事务槽与事务表
事务槽:数据块头中(见下图中的Transaction Header),块头中每个ITL占46B,ITL编号范围为1~255,用一个字节即两个16进制数表示。
事务表:undo段的第一个块,undo段头块存放事务信息
3、dbwr有很多触发条件,经常性的把db buffer中的脏块写入磁盘
二、ITL中Flag所代表的事务状态---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN
三、块的物理结构
1、The Cache Header-------------------------------------------------------------------------------------------------------------------------
Start dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
buffer tsn: 8 rdba: 0x00c0007a (3/122)
scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Hex dump of corrupt header 3 = CHKVAL
Dump of memory from 0x0EB8B400 to 0x0EB8B414
… …
2、The Transaction Header(块中的transaction信息)
①ITL list的头信息-----------------------------------------------------------------------------------------------Object id on Block? Y
seg/obj: 0xc7cc csc: 0x00.86f4c itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000019 ver: 0x01 opc: 0
②Intrest Transaction List -------------------------------------------------------------------------------Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.00b.00000fac 0x00801885.008c.56 --U- 1 fsc 0x0000.0068d716
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
3、data area header
①table dictionary header------------------------------------------------------------------------------------------------------------------------
data_block_dump,data header at 0xeb8b464
===============
tsiz: 0x1f98 //total data area size
hsiz: 0x2e //data header size
pbl: 0x0eb8b464 //pointer指针to buffer holding the block
bdba: 0x01000020 //block dba / rdba
flag=-------- //n=pctfree hit(clusters),f=don't put on freelist,k=flushable cluster keys
ntab=1 //number of tables (>1 so this is a cluster)
nrow=14 //number of rows
frre=-1 //First free row index entry. -1=you have to add one.
fsbo=0x2e //free space begin offset
fseo=0x1d61 //free space end offset
avsp=0x1d33 //available space in the block
tosp=0x1d33 //total available space when all transactions commit
0xe:pti[0] nrow=14 offs=0
②row directroy 每增加一条row就多出2bytes用来记载该row--------------------------------------------------------------------------------------------------------------------------
0x12:pri[0] offs=0x1f72
0x14:pri[1] offs=0x1f47
……
0x2c:pri[13] offs=0x1d61
③row header--------------------------------------------------------------------------------------------------------------------------
tab 0表号, row 0行号, @0x1f72 //row header
tl: 38行size fb: --H-FL-- lb: 0x2事务槽号 cc: 8总列数
④row data--------------------------------------------------------------------------------------------------------------------------
col 0: [ 3] c2 4a 46 //column length
… …
col 6: *NULL*
col 7: [ 2] c1 15
************************************************
01.2-select查询得到的信息
一、emp表共14行SQL> select count(*) from scott.emp;
14
二、emp表共8字段,SAL为第6字段SQL> select * from scott.emp where rownum=1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
------ ------- ------ ------ --------- ----- ------ -------
7369 SMITH CLERK 7902 17-DEC-80 800 20
************************************************
01.3-dump出的信息(commit前)
一、修改第1行的第6个字段改为8000SQL> set heading off
select ename,sal from scott.emp where sal=800;
--SMITH 800薪水为800的只有一条记录
SQL> update scott.emp set sal=8000 where sal=800;
--1 row updated.
二、该条记录在4号文件第32号块上SQL> select 'file# '||dbms_rowid.rowid_relative_fno(rowid),'block# '||dbms_rowid.rowid_block_number(rowid) from scott.emp where sal=8000;
--file# 4 block# 32
三、dump导出4号文件32号块SQL> alter system dump datafile 4 block 32;
--System altered.
四、列出dump文件SQL> select '!vi ' || d.VALUE || '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_' || p.spid || '.trc' trace_file_name
FROM (select p.spid FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(select t.INSTANCE FROM v$thread t, v$parameter v WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(select value from v$parameter where name = 'user_dump_dest') d
/
-- !vi /u01/app/oracle/admin/orcl/udump/orcl_ora_3698.trc
五、在vi中输入/Itl搜第一个Itl(I要大写)=块的热点ITL Slot
SQL> !vi /u01/app/oracle/admin/orcl/udump/orcl_ora_3698.trc
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.000000f2 0x00805794.00c8.49 C--- 0 scn 0x0000.0006bfdb
0x02 0x0006.02c.00000108 0x0080073b.00c4.03 ---- 1 fsc 0x0000.00000000
1、flag=-----说明事务还在活动
2、0x02事务槽Lck=1——说明此事务锁定1行
3、scn/fsc为空——说明未clean out
补充:由此知道ORACLE中的row lock是记录在block header中的。
六、对比dump、select:事务ID相同1、查看ITL的XID(=usn#.slot#.wrap#)
SQL> select xidusn,xidslot,xidsqn from v$transaction;
-- 6 44 264
2、转换dump文件中的itl
SQL> select to_number('6','XX'),to_number('2c','XXX'),to_number('108','XXXX') from dual;
-- 6 44 264
七、用grep定位指向第0x2事务的行并分析
$ grep -E '\' -B1 -A 9 /u01/app/oracle/admin/orcl/udump/orcl_ora_3698.trctab 0, row 0, @0x1f72 //row0=第1行
tl: 38 fb: --H-FL-- lb: 0x2 cc: 8 //lb:0x2指向第二个Itl条目
col 0: [ 3] c2 4a 46 //第1个字段
... ...
col 5: [ 2] c2 51 //第6个字段
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 1, @0x1f47
1、row 0 lb: 0x2————证明我们update的是表的第1行
2、cc: 8和col 0~col 7——证明与select看到的8列一致
3、证明第6列已改为8000
SQL> select UTL_RAW.CAST_TO_NUMBER(replace(' c2 51 ',' ')) from dual;
--8000 //把oracle内部16进制转成表中字段的数据与update新值做比较
************************************************
01.4-dump出的信息(commit后)
一、提交后再dumpSQL> commit;
alter system dump datafile 4 block 32;
二、列出新的dump文件SQL> @gettracefile.sql
--!vi /u01/app/oracle/admin/orcl/udump/orcl_ora_3975.trc
三、查看事务槽——有两点变化SQL> !vi /u01/app/oracle/admin/orcl/udump/orcl_ora_3975.trc
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.000000f2 0x00805794.00c8.49 C--- 0 scn 0x0000.0006bfdb
0x02 0x0006.02c.00000108 0x0080073b.00c4.03 --U- 1 fsc 0x0000.000874f7
1、flag= U-----证明transaction committed
2、fsc、scn——证明fsc快速提交,且已clean out
3、Lck=1———证明falg=U事务已提交,Itl可重用了不需清除lck
四、查看行头——指向lb:0x2没变,利于commit效率提高
$ grep -E '\' -B1 -A 9 /u01/app/oracle/admin/orcl/udump/orcl_ora_3975.trctab 0, row 0, @0x1f72
tl: 38 fb: --H-FL-- lb: 0x2 cc: 8
col 0: [ 3] c2 4a 46
col 1: [ 5] 53 4d 49 54 48
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 50 03
col 4: [ 7] 77 b4 0c 11 01 01 01
col 5: [ 2] c2 51
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 1, @0x1f47
最近itpub发帖:
无GUI智能部署oracle脚本及视频
http://www.itpub.net/thread-1778735-1-1.html
有哪些Oracle进程?消耗了多少存?http://www.itpub.net/thread-1780654-1-1.html
oracle数据块dump信息,从数据块的dump信息能看出什么相关推荐
- oracle 数据块 修复,案例:Oracle坏块 使用RMAN工具的命令clear标记数据块为corrupt 修复坏块...
天萃荷净 运维DBA巡检发现数据文件中存在坏块,使用RMAN工具的命令clear标记数据坏块,使用bbed修复坏块 在rman中有隐藏的命令clear,可以标记数据块为corrupt,从而实现数据库坏 ...
- 区块链相关数据报表_重磅|京东云区块链数据服务(BDS)正式开源
今天,"区块链+京东云 大有可为"战略合作媒体沟通会在北京国家会议中心召开.会上,京东云与京东数科宣布在区块链技术服务领域深度合作,重磅发布了智臻链"云"建设规 ...
- 对象存储2:数据存储类型-文件存储、块存储、对象存储详解
上一篇介绍了传统存储的几个常用类型,本篇主要介绍云平台用到的常用存储类型,分别是文件存储.块存储和对象存储. 这种分类是以数据存储的方式来命名的,体现了不同的数据存储格式.文件存储会以文件和文件夹的层 ...
- TIA PORTAL 西门子博途中怎样设置DB块中的变量数据为保持型或不保持?
TIA PORTAL 西门子博途中怎样设置DB块中的变量数据为保持型或不保持? 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到网站. 自己用软件测试了以下 ...
- oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例
关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...
- ORACLE 常用的SQL语法和数据对象
一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSE ...
- oracle如何根据ID恢复部分数据,三种方法找回Oracle数据库误删除的数据
三种方法找回Oracle数据库误删除的数据 最新动态来源:点击数:6141更新时间:2018/5/10 有很多朋友都遇到过在操作数据库时误删除某些重要数据的情况,如果数据库没有备份而且数据有十分重要的 ...
- oracle数据库恢复aul_[数据库]oracle从dbf文件中恢复数据(通过AUL工具实现)
[数据库]oracle从dbf文件中恢复数据(通过AUL工具实现) 0 2013-09-27 00:00:18 背景故事:前几天,硬盘故障导致oracle崩溃.重要数据丢失,只剩下孤零零的dbf文件. ...
- Oracle 11g_管理表空间和数据文件(7)
1. 表空间和数据文件的关系 在Oracle数据库中,表空间和数据文件之间的关系非常密切,这二者之间相互依存,也就是说,创建表空间时必须创建数据文件,增加数据文件时也必须指定表空间. Oracle磁盘 ...
最新文章
- sega+model+3+android,世嘉MODEL2经典老游戏移植登场 追加联网对战
- SpringMVC Controller单例和多例
- Linux进程命令PS用法笔记
- undefined reference to `__isnanf'
- 让Mysql支持Emoji表情,解决[Err] 1366 - Incorrect string value: '\xF0\xA3\x84\x83'
- 基于php程序系统设计,PHP程序静态分析系统的设计与实现
- Leetcode PHP题解--D7 905. Sort Array By Parity
- 解决Vscode提示bodyparser已被弃用的问题
- Go语言的goroutine
- MonkeyTest脚本
- java 微信卡券开发 --创建微信卡券
- 惠普(HP) LaserJet Pro M1136 MFP 黑白多功能激光一体机 (打印 复印 扫描)驱动安装记录...
- Python实现数据透视表
- c#关于GMap离线地图加载的问题
- js二级联动,购物车
- 浅析搭建高速公路视频监控平台的建设方案及必要性
- 如何通过神经网络实现XNOR函数?
- Ubuntu16.04笔记本 安装R RStudio
- Tita OKR:掌握大局的仪表盘
- 微服务系统错误码设计
热门文章
- db2 v9.7 tablespace_state -“表空间状态”监视器元素 0x0400
- 1小时搞懂设计模式之工厂模式(方法工厂)
- 加快android编译速度
- vue 代码快捷键_你可能不知道的19种运行JavaScript代码工具
- 基于JAVA+Swing+MYSQL的在线考试系统
- 最简单的SpringMVC + Maven配置
- useradd或adduser命令
- springboot注释详解
- bootstrap入门
- angular drag and drop (ngDraggable) 笔记