Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239111
  • 博文数量: 59
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 592
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-01 12:51
个人简介

你们都是我的客户,所以,我对你们是透明的

文章分类

全部博文(59)

文章存档

2016年(29)

2015年(30)

分类: Oracle

2015-12-11 09:47:33

最近学习数据块,在书上看到一个dbv的命令可以检查数据文件,模拟实验环境的时候出了点差错,

环境

点击(此处)折叠或打开

  1. SQL> select * from v$version where rownum <2;
  2.  BANNER
  3.  --------------------------------------------------------------------------------
  4.  Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
  5.  SQL>

点击(此处)折叠或打开

  1. [oracle@a ~]$ cat /etc/issue
  2. Red Hat Enterprise Linux Server release 6.4 (Santiago)
  3. Kernel \r on an \m

1、模拟破坏数据文件
 

点击(此处)折叠或打开

  1. [oracle@a his]$ dd of=/oracle/app/oracle/his/system01.dbf conv=notrunc bs=8192<
  2. > nicaibushiyigemeiyougushidenvtongxue
  3. > EOF
  4. 0+1 records in
  5. 0+1 records out
  6. 37 bytes (37 B) copied, 3.8678e-05 s, 957 kB/s
  7. [oracle@a his]$

其实网上是这样的
 

点击(此处)折叠或打开

  1. [oracle@ora ~]$ dd of=/u01/app/oracle/oradata/orcl/users01.dbf bs=8192 conv=notrunc seek=524 <
  2. > abcdefghicklmn
  3. > EOF
  4. 0+1 records in
  5. 0+1 records out
  6. 15 bytes (15 B) copied, 3.1499e-05 s, 476 kB/s

 dd命令也没用过,只是想看看seek这个参数具体是干嘛的,就没加测试了一下。结果当然是数据文件操作系统头被破坏了,数据库起不来,dbv和bbed都用不了
 

点击(此处)折叠或打开

  1. [oracle@a his]$ dbv file=/oracle/app/oracle/his/system01.dbf blocksize=8192
  2.  DBVERIFY: Release 11.2.0.4.0 - Production on Wed Nov 25 11:22:09 2015
  3.  Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
  4.  DBV-00107: Unknown header format (105) (1852798070)

  5. BBED> info
  6.   File# Name Size(blks)
  7.   ----- ---- ----------
  8.       1 /oracle/app/oracle/his/system01.dbf 94720
  9.       2 /oracle/app/oracle/his/sysaux01.dbf 65280
  10.  BBED> set file 1 block 0
  11.          FILE# 1
  12.  BBED-00309: out of range block number (0)
  13.  BBED> set file 2 block 0
  14.          FILE# 2
  15.          BLOCK# 0

  16. BBED> dump count 32
  17.   File: /oracle/app/oracle/his/sysaux01.dbf (2)
  18.   Block: 0 Offsets: 0 to 31 Dba:0x00800000
  19.  ------------------------------------------------------------------------
  20.   00a20000 0000c0ff 00000000 00000000 66050000 00200000 00ff0000 7d7c7b7a
  21.   <32 bytes per line>
  22.  BBED>


可以看到system01.dbf的block 0已经损坏,sysaux01.dbf block 0是好的,bbed可以看到16进制的block 0,这个待会再说

mount的数据库是这个样子
 

点击(此处)折叠或打开

  1. SQL> select name,bytes from v$datafile;
  2.  NAME BYTES
  3.  ---------------------------------------- ----------
  4.  /oracle/app/oracle/his/system01.dbf 0
  5.  /oracle/app/oracle/his/sysaux01.dbf 534773760
  6.  /oracle/app/oracle/his/undotbs01.dbf 73400320
  7.  /oracle/app/oracle/his/users01.dbf 5242880
  8.  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文件
 

点击(此处)折叠或打开

  1. BBED> dump count 32
  2.   File: /oracle/app/oracle/his/sysaux01.dbf (2)
  3.   Block: 0 Offsets: 0 to 31 Dba:0x00800000
  4.  ------------------------------------------------------------------------
  5.   00a20000 0000c0ff 00000000 00000000 66050000 00200000 00ff0000 7d7c7b7a
  6.   <32 bytes per line>
  7.  BBED>




  8. BBED> set offset 1
  9.          OFFSET 1
  10.  BBED> dump
  11.   File: /oracle/app/oracle/his/sysaux01.dbf (2)
  12.   Block: 0 Offsets: 1 to 32 Dba:0x00800000
  13.  ------------------------------------------------------------------------
  14.   a2000000 00c0ff00 00000000 00000066 05000000 20000000 ff00007d 7c7b7aa0




  15.  <32 bytes per line>
  16.  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了,就有点不懂了。
 

点击(此处)折叠或打开

  1. SQL> show parameter db_block_s
  2.  NAME TYPE VALUE
  3.  ------------------------------------ ----------- ------------------------------
  4.  db_block_size integer 8192
  5.  SQL>
  6.  SQL> select to_number('0020','XXXXXXXXXXXXX') from dual;
  7.  TO_NUMBER('0020','XXXXXXXXXXXXX')
  8.  ---------------------------------
  9.                                 32
  10.  SQL> select to_number('00ff0000','XXXXXXXXXXXXX') from dual;
  11.  TO_NUMBER('00FF0000','XXXXXXXXXXXXX')
  12.  -------------------------------------
  13.                               16711680
  14.  BBED> show dba
  15.          DBA 0x00800000 (8388608 2,0)


当然,这个是sysaux01.dbf的
看来对这个dba还不是很了解,网上的说法也很多,不敢苟同,也可能是我理解不到位,接下来继续学习吧。
阅读(1389) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:pygame 一个很简单的窗口

给主人留下些什么吧!~~