数据块转储及RDBA的转换

数据|转换

数据块转储及RDBA的转换

原文链接:

http://www.eygle.com/internal/How_to_dump_datablock.htm

Tuesday, 2004-08-31 17:51 Eygle

 
很多时候我们在进行进一步研究时需要转储(dump)Oracle的数据块,以研究其内容,Oracle提供了很好的方式,我们通过以下例子简单说明一下:

[oracle@jumper udump]$ sqlplus "/ as sysdba"SQL*Plus: Release 9.2.0.3.0 - Production on Tue Aug 31 17:01:27 2004Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.Connected to:Oracle9i Enterprise Edition Release 9.2.0.3.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.3.0 - ProductionSQL> select rowid,deptno,dname,loc from scott.dept;ROWID DEPTNO DNAME LOC------------------ ---------- -------------- -------------AAADZ7AABAAAGK6AAA 10 ACCOUNTING NEW YORKAAADZ7AABAAAGK6AAB 20 RESEARCH DALLASAAADZ7AABAAAGK6AAC 30 SALES CHICAGOAAADZ7AABAAAGK6AAD 40 OPERATIONS BOSTONSQL> select file_id,block_id,blocks from dba_extents where segment_name='DEPT'; FILE_ID BLOCK_ID BLOCKS---------- ---------- ---------- 1 25273 8SQL> alter system dump datafile 1 block min 25273 block max 25274;System altered.SQL> ![oracle@jumper udump]$ ls -ltotal 4-rw-r----- 1 oracle dba 3142 Aug 31 17:04 hsjf_ora_13674.trc[oracle@jumper udump]$ more hsjf_ora_13674.trc /opt/oracle/admin/hsjf/udump/hsjf_ora_13674.trcOracle9i Enterprise Edition Release 9.2.0.3.0 - ProductionWith the Partitioning, OLAP and Oracle Data Mining optionsJServer Release 9.2.0.3.0 - ProductionORACLE_HOME = /opt/oracle/product/9.2.0System name: LinuxNode name: jumper.hurray.com.cnRelease: 2.4.18-14Version: #1 Wed Sep 4 13:35:50 EDT 2002Machine: i686Instance name: hsjfRedo thread mounted by this instance: 1Oracle process number: 9Unix process pid: 13674, image: oracle@jumper.hurray.com.cn (TNS V1-V3)*** 2004-08-31 17:04:27.820*** SESSION ID:(8.3523) 2004-08-31 17:04:27.819Start dump data blocks tsn: 0 file#: 1 minblk 25273 maxblk 25274buffer tsn: 0 rdba: 0x004062b9 (1/25273)scn: 0x0000.0057c70d seq: 0x01 flg: 0x04 tail: 0xc70d1001frmt: 0x02 chkval: 0x12e3 type: 0x10=DATA SEGMENT HEADER - UNLIMITED Extent Control Header ----------------------------------------------------------------- Extent Header:: spare1: 0 spare2: 0 #extents: 1 #blocks: 7 last map 0x00000000 #maps: 0 offset: 4128 Highwater:: 0x004062bb ext#: 0 blk#: 1 ext size: 7 #blocks in seg. hdr's freelists: 1 #blocks below: 1 mapblk 0x00000000 offset: 0 Unlocked Map Header:: next 0x00000000 #extents: 1 obj#: 13947 flag: 0x40000000 Extent Map ----------------------------------------------------------------- 0x004062ba length: 7 nfl = 1, nfb = 1 typ = 1 nxf = 0 ccnt = 1 SEG LST:: flg: USED lhd: 0x004062ba ltl: 0x004062ba buffer tsn: 0 rdba: 0x004062ba (1/25274)scn: 0x0000.0131909b seq: 0x07 flg: 0x04 tail: 0x909b0607frmt: 0x02 chkval: 0xa8e7 type: 0x06=trans dataBlock header dump: 0x004062ba Object id on Block? Y seg/obj: 0x367b csc: 0x00.131909a itc: 2 flg: O typ: 1 - DATA fsl: 0 fnx: 0x0 ver: 0x01 Itl Xid Uba Flag Lck Scn/Fsc0x01 0x0001.02a.000003f3 0x0080000b.0188.08 C--- 0 scn 0x0000.0057c70e0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 data_block_dump,data header at 0xadb505c===============tsiz: 0x1fa0hsiz: 0x1apbl: 0x0adb505cbdba: 0x004062ba 76543210flag=--------ntab=1nrow=4frre=-1fsbo=0x1afseo=0x1f44avsp=0x1f2atosp=0x1f2a0xe:pti[0] nrow=4 offs=00x12:pri[0] offs=0x1f860x14:pri[1] offs=0x1f700x16:pri[2] offs=0x1f5c0x18:pri[3] offs=0x1f44block_row_dump:tab 0, row 0, @0x1f86tl: 26 fb: --H-FL-- lb: 0x0 cc: 3col 0: [ 2] c1 0bcol 1: [10] 41 43 43 4f 55 4e 54 49 4e 47col 2: [ 8] 4e 45 57 20 59 4f 52 4btab 0, row 1, @0x1f70tl: 22 fb: --H-FL-- lb: 0x0 cc: 3col 0: [ 2] c1 15col 1: [ 8] 52 45 53 45 41 52 43 48col 2: [ 6] 44 41 4c 4c 41 53tab 0, row 2, @0x1f5ctl: 20 fb: --H-FL-- lb: 0x0 cc: 3col 0: [ 2] c1 1fcol 1: [ 5] 53 41 4c 45 53col 2: [ 7] 43 48 49 43 41 47 4ftab 0, row 3, @0x1f44tl: 24 fb: --H-FL-- lb: 0x0 cc: 3col 0: [ 2] c1 29col 1: [10] 4f 50 45 52 41 54 49 4f 4e 53col 2: [ 6] 42 4f 53 54 4f 4eend_of_block_dumpEnd dump data blocks tsn: 0 file#: 1 minblk 25273 maxblk 25274

很多人经常提出的一个问题是,rdba是如何转换的?

rdba: 0x004062ba (1/25274)

我们通过这个例子介绍一下.

rdba从Oracle6->Oracle7->Oracle8发生了三次改变:

在Oracle6中,rdba由6位2进制数表示,也就是说数据块最多只能有2^6=64个数据文件(去掉全0和全1, 实际上最多只能代表62个文件)

在Oracle7中,rdba中的文件号增加为10位,为了向后兼容,从Block号的高位拿出4位作为文件号的高位.这样从6->7的Rowid无需发生变化.

在Oracle8中,文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7到Oracle8,Rowid仍然无需发生变化.

举例说明如下:

在Oracle6中:比如: file 8, block 5689226位block号==56892 vv vvvvvvvv vvvvvvvv vvvvvvvv00100000 00000000 11011110 00111100 ^^^^^^6位文件号==8在Oracle7中:比如:File 255, block 56892 11111100 11000000 11011110 00111100 F C C 0 D E 3 C \_____/\___/\_______________________/ | | | | |Block = 0xDE3C = 56892 \_____________ | \ V V 0011 111111 = 0xFF = 255 --注意这里高位和低位要置换才能得出正确的file#在Oracle8中:比如:File 255, block 56892 11111100 11000000 11011110 00111100 F C C 0 D E 3 C \_____/\___/\_______________________/ | | | | |Block = 0xDE3C = 56892 \_____________ | \ V V 0011 1111 0011 = 03F3 = 1011 --这就是相对文件号

 

对于我们测试中的例子:

rdba: 0x004062ba (1/25274)

也就是:0000 0000 0100 0000 0110 0010 1011 1010

前10位为rfile#: 0000 0000 01 = 1

后22位为Block#:00 0000 0110 0010 1011 1010 = 25274

时间: 2024-11-01 05:25:24

数据块转储及RDBA的转换的相关文章

简介ORACLE数据块转储及RDBA的转换

很多时候我们在进行进一步研究时需要转储(dump)Oracle的数据块,以研究其内容,Oracle提供了很好的方式,我们通过以下例子简单说明一下: [oracle@jumper udump]$ sqlplus "/ as sysdba" SQL*Plus: Release 9.2.0.3.0 - Production on Tue Aug 31 17:01:27 2004 Copyright (c) 1982, 2002, Oracle Corporation.  All rights

如何使用events DUMP buffer cache中指定的数据块

介绍了DUMP  buffer cache中全部数据块及指定RDBA的数据块方法. 1.DUMP  buffer cache中全部数据块 ALTER SESSION SET EVENTS 'immediate trace name buffers level n'; 1 buffer header 2 level 1 + block header 3 level 2 + block contents 4 level 1 + hash chain 5 level 2 + hash chain 6

[20161129]转储内存的内容还原成数据块.txt

[20161129]转储内存的内容还原成数据块.txt --昨天在做1128PAGETABLE SEGMENT HEADER损坏恢复,链接http://blog.itpub.net/267265/viewspace-2129195/ --在做还原成数据块时思路很乱,当时是一边做一边想,希望能找到好的方法,今天自己在重复做一次. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER --

如何转储数据文件和Buffer Cache中的数据块

这篇文章是为了补充<Oracle性能优化与诊断案例精选>一书中的案例而写的,但是想想,也许还可以扩展一下,对于刚接触 Oracle 数据库的朋友们,试着回答一下以下几个问题,看看自己能否找到正确的答案: 当我们 insert 一条记录,不提交,这个数据在内存还是磁盘? 当我们 insert 一条记录,提交,这个数据在内存还是磁盘? 当我们 insert 一条记录,不提交,检查点,这个数据在内存还是磁盘? 当我们 insert 一条记录,提交,检查点,这个数据在内存还是磁盘? 先看看我的测试:

[20161123]oracle数据块类型.txt

[20161123]oracle数据块类型.txt --oracle 数据块有许多类型,自己平时很少关注与记忆,自己做一个归纳总结: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------------

[20150518]关于块转储问题2.txt

[20150518]关于块转储问题2.txt --我自己在学习oracle有时候使用块转储时,发现转储的内容跟我自己的想象不一样. --正好前一阵子ITPUB有人也遇到类似的问题,自己做一个简单探究,参考链接如下: http://blog.itpub.net/267265/viewspace-1655497/ -- 我前面提到块转储alter system dump datafile 4 block 1523;,仅仅从数据文件读取.无论在何种情况下. -- 昨天看了相关文档,可以使用如下: AL

【体系结构】Oracle数据块详解

Oracle数据块详解 操作系统块是操作系统读写的最小操作单元,也是操作系统文件的属性之一.当创建一个Oracle数据库时,选择一个基于操作系统块的整数倍大小作为Oracle数据库块的大小.Oracle数据库读写操作则是以Oracle块为最小单位,而非操作系统块. 数据库块也称逻辑块或Oracle块,它对应磁盘上一个或多个物理块,它的大小由初始化参数DB_BLOCK_SIZE决定,可以定义数据块为2K.4K.8K.16K.32K甚至更大,默认Oracle块大小是8K.若一旦设置了Oracle数据

明明白白使用数据块:数据块格式深入解析

Data Block是数据库中最小的I/O单元,下面我来简单介绍下数据块的基本结构. OK!跟着我一步步实验: 一.建表空间 SQL>create tablespace tp1 datafile '/oradata/bxocp/tp01.dbf' size 10M; 二.建用户及授权 SQL>create user gyj identified by gyj default tablespace tp1; SQL>grant dba to gyj; 三.建表 SQL>conn gy

如何使用DUMP数据块与BBED查看BLOCK对比数据库修改时的SCN

实验思路: 先在数据库中对bys.a表的一行进行更新,查出此行对应的FILE# BLOCK# 然后DUMP此FILE# BLOCK#,查看SCN信息 使用BBED DUMP此FILE# BLOCK#,查看SCN信息 1.在数据库中对 bys.a表的一行进行更新,记录此行的ROWID. 19:55:13 BYS@ bys3>select * from a; B ---------- 55 7 3 19:55:15 BYS@ bys3>update a  set b=0 where b=7; 1