联系:手机/微信(+86 17813235971) QQ(107644445)
标题:系统中数据文件第一个数据块和oracle 中第一个数据块关系
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
数据文件第一个数据块到底有没有纳入数据块的数据块计算中,也就是我们通常所说的rdba(file#,block),是否真的是从数据文件的第一个数据块开始计算的?下面通过实验验证
相关信息和准备工作
SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production CORE 9.2.0.3.0 Production TNS for Linux: Version 9.2.0.4.0 - Production NLSRTL Version 9.2.0.4.0 - Production SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') "www.xifenfei.com" from dual; www.xifenfei.com ------------------- 2012-05-29 19:39:48 SQL> select name,block_size from v$datafile where file#=9; NAME BLOCK_SIZE ------------------------------------------------------------ ---------- /u01/oracle/oradata/xifenfei/users01.dbf 8192 --dd出来数据文件第一和第二个数据块 [oracle@xifenfei ~]$ dd if=/u01/oracle/oradata/xifenfei/users01.dbf of=user.01 bs=8192 count=1 1+0 records in 1+0 records out [oracle@xifenfei ~]$ dd if=/u01/oracle/oradata/xifenfei/users01.dbf of=user.02 bs=8192 count=1 skip=1 1+0 records in 1+0 records out [oracle@xifenfei ~]$ ll user.* -rw-r--r-- 1 oracle oinstall 8192 May 26 04:43 user.01 -rw-r--r-- 1 oracle oinstall 8192 May 26 04:44 user.02
bbed验证
[oracle@xifenfei ~]$ bbed password=blockedit blocksize=8192 listfile=/home/oracle/bbed_new.file mode=edit BBED: Release 2.0.0.0.0 - Limited Production on Sat May 26 04:56:49 2012 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> info File# Name Size(blks) ----- ---- ---------- 1 /u01/oracle/oradata/xifenfei/users01.dbf 0 2 /home/oracle/user.01 0 3 /home/oracle/user.02 0 --users01.dbf(完整数据文件,第一个数据块) BBED> set file 1 FILE# 1 BBED> set block 1 BLOCK# 1 BBED> d /v count 128 File: /u01/oracle/oradata/xifenfei/users01.dbf (1) Block: 1 Offsets: 0 to 127 Dba:0x00400001 ------------------------------------------------------- 0b020000 01004002 00000000 00000104 l ......@......... 7f4b0000 00002009 00000008 cdb41453 l .K.... ........S 58494645 4e464549 c7010000 800c0000 l XIFENFEI........ 00200000 09000300 00000000 00000000 l . .............. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 47180000 00000000 cf4d851e l ....G........M.. 8f40512e 78ab0200 00000000 00000000 l .@Q.x........... <16 bytes per line> --直接设置file 2错误(后续提供其他方法) BBED> set file 2 BBED-00307: incorrect blocksize (8192) or truncated file --查看users01.dbf(第二个数据块) BBED> set file 3 FILE# 3 BBED> set block 1 BLOCK# 1 BBED> d /v count 128 File: /home/oracle/user.02 (3) Block: 1 Offsets: 0 to 127 Dba:0x00c00001 ------------------------------------------------------- 0b020000 01004002 00000000 00000104 l ......@......... 7f4b0000 00002009 00000008 cdb41453 l .K.... ........S 58494645 4e464549 c7010000 800c0000 l XIFENFEI........ 00200000 09000300 00000000 00000000 l . .............. 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 47180000 00000000 cf4d851e l ....G........M.. 8f40512e 78ab0200 00000000 00000000 l .@Q.x........... <16 bytes per line> --查看users01.dbf(真正第一个数据块) BBED> set filename 'user.01' FILENAME user.01 BBED> d /v count 128 File: user.01 (0) Block: 1 Offsets: 0 to 127 Dba:0x00000000 ------------------------------------------------------- 00020000 00200000 800c0000 5d5c5b5a l ..... ......]\[Z 00000000 86280000 00000000 00000000 l .....(.......... 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ 00000000 00000000 00000000 00000000 l ................ <16 bytes per line>
通过这个对比可以知道:当我们直接使用bbed查看数据块内容的时候,自动屏蔽了数据文件上真正的第一个数据块.其实block 1是数据文件上的第二个数据块
hexdump验证
--users01.dbf(完整文件) [oracle@xifenfei ~]$ hexdump -C /u01/oracle/oradata/xifenfei/users01.dbf|head -20 00000000 00 02 00 00 00 20 00 00 80 0c 00 00 5d 5c 5b 5a |..... ......]\[Z| 00000010 00 00 00 00 86 28 00 00 00 00 00 00 00 00 00 00 |.....(..........| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00002000 0b 02 00 00 01 00 40 02 00 00 00 00 00 00 01 04 |......@.........| 00002010 7f 4b 00 00 00 00 20 09 00 00 00 08 cd b4 14 53 |.K.... ........S| 00002020 58 49 46 45 4e 46 45 49 c7 01 00 00 80 0c 00 00 |XIFENFEI........| 00002030 00 20 00 00 09 00 03 00 00 00 00 00 00 00 00 00 |. ..............| 00002040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00002060 00 00 00 00 47 18 00 00 00 00 00 00 cf 4d 85 1e |....G........M..| 00002070 8f 40 51 2e 78 ab 02 00 00 00 00 00 00 00 00 00 |.@Q.x...........| 00002080 00 00 00 00 00 00 00 00 00 00 04 00 58 0d 0b c0 |............X...| 00002090 2c 0b 00 00 5a ea be 2e 01 00 aa bd 15 00 00 00 |,...Z...........| 000020a0 02 00 00 00 10 00 ff bf 02 00 00 00 00 00 00 00 |................| 000020b0 5a 00 00 00 4f ea be 2e 59 00 00 00 00 00 00 00 |Z...O...Y.......| 000020c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000020f0 00 00 00 00 09 00 00 00 05 00 55 53 45 52 53 00 |..........USERS.| 00002100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| --users01.dbf(第一个数据块文件) [oracle@xifenfei ~]$ hexdump -C user.01 00000000 00 02 00 00 00 20 00 00 80 0c 00 00 5d 5c 5b 5a |..... ......]\[Z| 00000010 00 00 00 00 86 28 00 00 00 00 00 00 00 00 00 00 |.....(..........| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00002000 --users01.dbf(第二个数据块文件) [oracle@xifenfei ~]$ hexdump -C user.02|head -20 00000000 0b 02 00 00 01 00 40 02 00 00 00 00 00 00 01 04 |......@.........| 00000010 7f 4b 00 00 00 00 20 09 00 00 00 08 cd b4 14 53 |.K.... ........S| 00000020 58 49 46 45 4e 46 45 49 c7 01 00 00 80 0c 00 00 |XIFENFEI........| 00000030 00 20 00 00 09 00 03 00 00 00 00 00 00 00 00 00 |. ..............| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00000060 00 00 00 00 47 18 00 00 00 00 00 00 cf 4d 85 1e |....G........M..| 00000070 8f 40 51 2e 78 ab 02 00 00 00 00 00 00 00 00 00 |.@Q.x...........| 00000080 00 00 00 00 00 00 00 00 00 00 04 00 58 0d 0b c0 |............X...| 00000090 2c 0b 00 00 5a ea be 2e 01 00 aa bd 15 00 00 00 |,...Z...........| 000000a0 02 00 00 00 10 00 ff bf 02 00 00 00 00 00 00 00 |................| 000000b0 5a 00 00 00 4f ea be 2e 59 00 00 00 00 00 00 00 |Z...O...Y.......| 000000c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000000f0 00 00 00 00 09 00 00 00 05 00 55 53 45 52 53 00 |..........USERS.| 00000100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000110 00 00 00 00 00 00 00 00 09 00 00 00 00 00 00 00 |................| 00000120 00 00 00 00 f9 e9 be 2e 00 00 00 00 00 00 00 00 |................| 00000130 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
通过hexdump对三个文件的对比可以知道users01.dbf的头两个数据文件确实是由第一和第二个数据块组成.然后结合上面bbed dump出来的结果.可以再次证明数据文件第一个数据块,不能被bbed识别(从第二个数据文件开始)
实验总结
我们的数据文件其实是从文件的第二个数据块开始记录起(该数据块为block 1).也就是说系统的数据块和oracle中的rdba标示的数据块不是一致.而是系统数据块比oracle数据块多1.
因这个原因解释了以前的一个疑问:Oracle数据文件大小的限制为什么指定数据文件最大值为(2^22-1*block_size),而不是根据rowid的2^22*block_size
关于类此问题在windows验证请见:在UltraEdit中定位数据文件内容
那就是说 在Linux 下 文件第一个块 0号块 是操作系统管理的块,oracle bbed 无法识别。Window侧是从 1号块开始,1号块属于系统块
set block 2
ub4 rdba_kcbh @4 0x00400001