[20130530]OS block header破壞以及恢復.txt

lfree發表於2013-05-30
[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每個檔案都有.找到一個連結,大家自己看吧:
不完全詳解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,這樣就會出現對這個塊的大量讀寫(我自己的理解,不知道
是否正確),極可能導致損壞,特別在機器記憶體不足的情況下.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-762523/,如需轉載,請註明出處,否則將追究法律責任。

相關文章