mysql 数据块_系统中数据文件第一个数据块和oracle 中第一个数据块关系

本文通过实验详细探讨了Oracle数据文件的第一个数据块(RDBA)是否从文件的第一个物理块开始计算的问题。实验涉及dd命令、bbed工具和hexdump工具,结果显示Oracle数据文件实际从第二个数据块开始记录,而bbed工具无法识别第一个数据块。这解释了Oracle数据文件大小限制的疑问,并揭示了系统数据块与Oracle RDBA的不一致之处。
摘要由CSDN通过智能技术生成

数据文件第一个数据块到底有没有纳入数据块的数据块计算中,也就是我们通常所说的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中定位数据文件内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值