[20130530]OS block header破坏以及恢复.txt

[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,这样就会出现对这个块的大量读写(我自己的理解,不知道
是否正确),极可能导致损坏,特别在机器内存不足的情况下.

时间: 2024-08-22 04:33:18

[20130530]OS block header破坏以及恢复.txt的相关文章

oracle数据库ORA-15196: invalid ASM block header [kfc.c:26076] [hard_kfbh]问题

这是某个网友的数据库,11g ASM环境. 其中ASM元数据出现损坏,导致DiskGroup无法mount.不过比较万幸的存储有镜像.即使是这样,据说存储工程师恢复也花了1天多,对于我们的业务系统来讲,这是不可接受的. 我这里将该数据库case的信息贴出来,供大家参考!(备注:我们提供完善的数据库各种解决方案,详情请看:云和恩墨) WARNING: cache read  a corrupt block: group=3(DATAVG) dsk=27 blk=1 disk=27 (DATAVG_

[20170411]bbed删除记录的恢复.txt

[20170411]bbed删除记录的恢复.txt --//昨天上午做的测试,链接:http://blog.itpub.net/267265/viewspace-2136933/ --//我当时并没有选择恢复记录,仅仅看删除的内容.因为这样恢复是存在许多问题. --//执行 drop function scott.sleep ; 删除sys.source$相关记录仅仅是该命令的一小部分,恢复 --//sys.source$相关记录会存在许多问题,但是如果是应用数据恢复还是可以,实际上以前我的博客

[20120906]alter table set unused column后的恢复.txt

[20120906]alter table set unused column后的恢复.txt 我们知道表在alter table 表 set unused column 字段名 后的恢复,数据并没有真正的删除,昨天开发问如果出现误操作是否能够恢复(概率也太小了). 大家知道在执行以上操作后,执行很快,对应字段的数据并没有真正删除,自己觉得好奇,测试看看. 1.测试环境: SQL> select * from v$version ; BANNER ------------------------

[20150513]人为破坏数据块.txt

[20150513]人为破坏数据块.txt --演示的目的,参考链接: http://www.askmaclean.com/archives/oracle-make-block-physical-corruption.html --不要在生产系统测试!!!!! 1.建立测试环境: SCOTT@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -

[20140507]实例crash恢复.txt

[20140507]实例crash恢复.txt 如果发生了实例崩溃,只需要在日志文件中找到检查点位置(low cache rba),从此开始应用所有的重做日志文件, 就完成了前滚操作. 实例崩溃后,再次启动数据库,oracle会到控制文件中读取low cache rba,这就是检查点位置. 从此处开始应用重做日志,应用到on disk rba的位置.on disk rba是磁盘中重做日志文件的最后一条重做记录的rba. 加快恢复速度,确定恢复日志的起点. 不管redo记录的事务提交还是非提交,都

[20171121]rman使用copy image恢复.txt

[20171121]rman使用copy image恢复.txt --//上个星期做数据文件块头恢复时,提到使用rman备份数据文件时,文件头数据库信息是最后写入备份集文件的,在filesperset=1的情况 --//下写入备份集文件中的倒数第2块就是文件头的备份.参考链接: http://blog.itpub.net/267265/viewspace-2147297/=>[20171115]恢复数据文件块头4补充.txt --//而且我最后还做了测试证明如果resotre数据文件,实际上文件

[20170105]关于使用datafilecopy恢复.txt

[20170105]关于使用datafilecopy恢复.txt --如果指定恢复数据文件是从datafilecopy,必须加括号,写一个例子说明: 1.环境: SYS@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ------------------------------------------------

[20141218]误操作删除dual表的恢复.txt

[20141218]误操作删除dual表的恢复.txt --没事,做一个误操作删除dual表的恢复,没想到不能按照网上介绍的方法恢复,做一个记录. 1.建立测试数据库: mkdir -p /mnt/ramdisk mount -t tmpfs -o size=8G tmpfs /mnt/ramdisk $ORACLE_HOME/bin/dbca -createDatabase -templateName General_Purpose.dbc -gdbName test -sid test -s

[20150430]列删除的简单恢复.txt

[20150430]列删除的简单恢复.txt SCOTT@test> @ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx