[20130530]OS block header破坏以及恢复.txt
oracle文件的第一个块(block 0)是OS block header,在数据库中查询不到信息,记录的是OS信息,以及文件大小的等信息:
如果损坏,应该对数据文件影响大吗? 自己做一个测试看看.
1.介绍OS block header:
@ver
SQL> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
CREATE TABLESPACE AAA DATAFILE
'/u01/app/oracle11g/oradata/test/aaa01.dbf' SIZE 64M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED
LOGGING
ONLINE
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT AUTO
FLASHBACK ON;
$ ls -l /u01/app/oracle11g/oradata/test/aaa01.dbf
-rw-r----- 1 oracle11g oinstall 67117056 2013-05-30 08:27:44 /u01/app/oracle11g/oradata/test/aaa01.dbf
SQL> select file_id,file_name,bytes from dba_data_files where file_id=11 ;
FILE_ID FILE_NAME BYTES
---------- -------------------------------------------------- ----------
11 /u01/app/oracle11g/oradata/test/aaa01.dbf 67108864
-- 64M=67108864,67117056-67108864=8192,可以发现从文件系统的OS上的大小比数据库里的大小多了一个BLOCK。
$ od -tx1 -N 8192 aaa01.dbf
0000000 00 a2 00 00 00 00 c0 ff 00 00 00 00 00 00 00 00
0000020 66 da 00 00 00 20 00 00 00 20 00 00 7d 7c 7b 7a
0000040 a0 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0020000
--可以发现信息在前面48个字节.我的机器是intel的,这样显示才和bvi的显示一致.
--如果使用-tx 以及tx2都不一致.切记!
$ od -tx -N 8192 aaa01.dbf
0000000 0000a200 ffc00000 00000000 00000000
0000020 0000da66 00002000 00002000 7a7b7c7d
0000040 000081a0 00000000 00000000 00000000
0000060 00000000 00000000 00000000 00000000
*
0020000
$ od -tx2 -N 8192 aaa01.dbf
0000000 a200 0000 0000 ffc0 0000 0000 0000 0000
0000020 da66 0000 2000 0000 2000 0000 7c7d 7a7b
0000040 81a0 0000 0000 0000 0000 0000 0000 0000
0000060 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000
2.关闭数据库,做一个冷备份.
$ cp /u01/app/oracle11g/oradata/test/aaa01.dbf /data/testtest/
--注意不能这样使用dd命令,这样文件大小8192,不知道这种情况如何使用dd,难道只能拼接在一起吗?切记小心.我开始就是这样做的,文件破坏!!
$ dd if=/dev/zero f=/u01/app/oracle11g/oradata/test/aaa01.dbf bs=8192 count=1
1+0 records in
1+0 records out
---切记小心!!!!!!!
$ bvi -s 64 aaa01.dbf
--使用R命令,具体细节忽略.
$ od -tx1 -N 8192 /u01/app/oracle11g/oradata/test/aaa01.dbf
0000000 00000000 00000000 00000000 00000000
*
0020000
SQL> startup
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2228784 bytes
Variable Size 1006636496 bytes
Database Buffers 587202560 bytes
Redo Buffers 7344128 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 11 - see DBWR trace file
ORA-01110: data file 11: '/u01/app/oracle11g/oradata/test/aaa01.dbf'
SQL> select open_mode from v$database ;
OPEN_MODE
--------------------
MOUNTED
--数据库仅仅到mounted模式.
3.使用bvi编辑回来后:
SQL> alter database open;
Database altered.
4.如何填写这些信息,最简单的方法建立一个大小一样的文件(这样消耗空间),取出相应的内容填写回去就OK了.
当然如果有备份也许使用rman也不错.
$ ls -l aaa01.dbf test01.dbf
-rw-r----- 1 oracle11g oinstall 67117056 2013-05-30 10:30:10 aaa01.dbf
-rw-r----- 1 oracle11g oinstall 67117056 2013-05-30 10:30:10 test01.dbf
$ od -tx1 -N 8192 aaa01.dbf
0000000 00 a2 00 00 00 00 c0 ff 00 00 00 00 00 00 00 00
0000020 66 da 00 00 00 20 00 00 00 20 00 00 7d 7c 7b 7a
0000040 a0 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0020000
$ od -tx1 -N 8192 test01.dbf
0000000 00 a2 00 00 00 00 c0 ff 00 00 00 00 00 00 00 00
0000020 66 da 00 00 00 20 00 00 00 20 00 00 7d 7c 7b 7a
0000040 a0 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
0020000
--可以发现test01.dbf与aaa01.dbf的os block header 是一样的.
我的感觉也许能猜出一些,比如7d 7c 7b 7a每个文件都有.找到一个链接,大家自己看吧:
http://www.killdb.com/2011/09/05/不完全详解os block header.html
5.改变数据大小看看:
--(64*1024*1024-8192)/1024= 65528.减少1个块.65528/8=8191(0x1fff)
alter database datafile '/u01/app/oracle11g/oradata/test/aaa01.dbf' resize 65528k;
--交换字节看看:
$ od -tx2 -N 8192 aaa01.dbf
0000000 a200 0000 0000 ffc0 0000 0000 0000 0000
0000020 e599 0000 2000 0000 1fff 0000 7c7d 7a7b
0000040 81a0 0000 0000 0000 0000 0000 0000 0000
0000060 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000
--024-025(八进制) 2000=应该表示块大小,8K=0x2000.
--028-031 1fff=表示占用数据库的数量.(64*1024*1024-8192)/1024= 65528.减少1个块.65528/8=8191(0x1fff)
--020-021 表示什么?
--其他地方的没变,不知道表示什么?
6.补充:
实际上这个测试来源前几天别人给我讲的情况,他们的OS block header损坏,是物理损坏.按照我的理解一旦出现物理无法读出,
硬盘快over了.当然使用rman很快恢复.
select * from x$bh where file#=11;并不能查询dbablk=0 的记录.
或者
select * from v$bh where block#=0;
--这个块应该是缓存的,但是如果出现链接的情况:
http://space.itpub.net/267265/viewspace-758059
定义数据文件没有指定next大小,而仅仅打开AUTOEXTEND ON,这样文件扩展每次仅仅8k,这样就会出现对这个块的大量读写(我自己的理解,不知道
是否正确),极可能导致损坏,特别在机器内存不足的情况下.