最近学习数据块,在书上看到一个dbv的命令可以检查数据文件,模拟实验环境的时候出了点差错,
环境:
-
SQL> select * from v$version where rownum <2;
-
BANNER
-
--------------------------------------------------------------------------------
-
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
-
SQL>
-
[oracle@a ~]$ cat /etc/issue
-
Red Hat Enterprise Linux Server release 6.4 (Santiago)
-
Kernel \r on an \m
1、模拟破坏数据文件
-
[oracle@a his]$ dd of=/oracle/app/oracle/his/system01.dbf conv=notrunc bs=8192<
-
> nicaibushiyigemeiyougushidenvtongxue
-
> EOF
-
0+1 records in
-
0+1 records out
-
37 bytes (37 B) copied, 3.8678e-05 s, 957 kB/s
-
[oracle@a his]$
其实网上是这样的
-
[oracle@ora ~]$ dd of=/u01/app/oracle/oradata/orcl/users01.dbf bs=8192 conv=notrunc seek=524 <
-
> abcdefghicklmn
-
> EOF
-
0+1 records in
-
0+1 records out
-
15 bytes (15 B) copied, 3.1499e-05 s, 476 kB/s
dd命令也没用过,只是想看看seek这个参数具体是干嘛的,就没加测试了一下。结果当然是数据文件操作系统头被破坏了,数据库起不来,dbv和bbed都用不了
-
[oracle@a his]$ dbv file=/oracle/app/oracle/his/system01.dbf blocksize=8192
-
DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 25 11:22:09 2015
-
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
-
DBV-00107: Unknown header format (105) (1852798070)
-
-
BBED> info
-
File# Name Size(blks)
-
----- ---- ----------
-
1 /oracle/app/oracle/his/system01.dbf 94720
-
2 /oracle/app/oracle/his/sysaux01.dbf 65280
-
BBED> set file 1 block 0
-
FILE# 1
-
BBED-00309: out of range block number (0)
-
BBED> set file 2 block 0
-
FILE# 2
-
BLOCK# 0
-
-
BBED> dump count 32
-
File: /oracle/app/oracle/his/sysaux01.dbf (2)
-
Block: 0 Offsets: 0 to 31 Dba:0x00800000
-
------------------------------------------------------------------------
-
00a20000 0000c0ff 00000000 00000000 66050000 00200000 00ff0000 7d7c7b7a
-
<32 bytes per line>
-
BBED>
可以看到system01.dbf的block 0已经损坏,sysaux01.dbf block 0是好的,bbed可以看到16进制的block 0,这个待会再说
mount的数据库是这个样子
-
SQL> select name,bytes from v$datafile;
-
NAME BYTES
-
---------------------------------------- ----------
-
/oracle/app/oracle/his/system01.dbf 0
-
/oracle/app/oracle/his/sysaux01.dbf 534773760
-
/oracle/app/oracle/his/undotbs01.dbf 73400320
-
/oracle/app/oracle/his/users01.dbf 5242880
-
SQL>
好吧,回过头来看看dd这个命令:
输入或输出
dd if=[STDIN] of=[STDOUT]
强迫输入或输出的Size为多少Bytes
bs: dd -ibs=[BYTE] -obs=[SIZE]
跳过一段以后才输出
seek=BLOCKS
count=blocks 只拷贝输入的blocks块。
conv = ASCII 把EBCDIC码转换为ASCIl码。
conv = ebcdic 把ASCIl码转换为EBCDIC码。
conv = ibm 把ASCIl码转换为alternate EBCDIC码。
conv = block 把变动位转换成固定字符。
conv = ublock 把固定位转换成变动位。
conv = ucase 把字母由小写转换为大写。
conv = lcase 把字母由大写转换为小写。
conv = notrunc 不截短输出文件。
conv = swab 交换每一对输入字节。
conv = noerror 出错时不停止处理。
conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。
只是其中摘抄的一部分,seek可以看到是跳过多少block输出,这个应该是操作系统block size的block数量
而oracle数据文件block 0是操作系统头,其中记录了数据文件的block size、数据文件大小等信息。
再回去看没有被破坏的sysaux01.dbf文件
-
BBED> dump count 32
-
File: /oracle/app/oracle/his/sysaux01.dbf (2)
-
Block: 0 Offsets: 0 to 31 Dba:0x00800000
-
------------------------------------------------------------------------
-
00a20000 0000c0ff 00000000 00000000 66050000 00200000 00ff0000 7d7c7b7a
-
<32 bytes per line>
-
BBED>
-
-
-
-
-
BBED> set offset 1
-
OFFSET 1
-
BBED> dump
-
File: /oracle/app/oracle/his/sysaux01.dbf (2)
-
Block: 0 Offsets: 1 to 32 Dba:0x00800000
-
------------------------------------------------------------------------
-
a2000000 00c0ff00 00000000 00000066 05000000 20000000 ff00007d 7c7b7aa0
-
-
-
-
-
<32 bytes per line>
-
BBED>
看这个
Offsets: 1 to 32
前面缩进了2位,dump是以十六进制的形式来显示块的。一个字节占8 bit,最大能表示2的8次方255,一个十六进制位最大0xF是15,2个十六进制位最大0xFF是255,即,一个字节表示2个十六进制位,所以我设了offset 1的时候块最前面00a20000变成了a2000000,缩进了2个十六进制位。
继续
Offset:0020~0022 0x0020两个字节表示该数据文件的数据块大小。
Offset:0024~0027 0x804c0100这四个字节存放的是改数据文件的数据块数量(不包含操作系统头)(这两句摘自《Oracle DBA实战攻略》周亮)
他这里的0x804c0100就是我上面的0x00ff0000
但是 0x0020的十进制是32,oracle的数据块大小当然不可能是32了,就有点不懂了。
-
SQL> show parameter db_block_s
-
NAME TYPE VALUE
-
------------------------------------ ----------- ------------------------------
-
db_block_size integer 8192
-
SQL>
-
SQL> select to_number('0020','XXXXXXXXXXXXX') from dual;
-
TO_NUMBER('0020','XXXXXXXXXXXXX')
-
---------------------------------
-
32
-
SQL> select to_number('00ff0000','XXXXXXXXXXXXX') from dual;
-
TO_NUMBER('00FF0000','XXXXXXXXXXXXX')
-
-------------------------------------
-
16711680
-
BBED> show dba
-
DBA 0x00800000 (8388608 2,0)
当然,这个是sysaux01.dbf的
看来对这个dba还不是很了解,网上的说法也很多,不敢苟同,也可能是我理解不到位,接下来继续学习吧。
阅读(1389) | 评论(0) | 转发(0) |