oracle特殊恢復-bbed修改某個數據文件頭

數據文件頭中的scn要與控制文件中的scn一致,數據庫纔可以open,在open過程中我們可以通過bbed來修改某個數據文件頭的scn,來欺騙oracle,來open庫。

1、環境如下

使用Oracle 11gR2進行測試,具體版本爲11.2.0.4

SYS@xbtst SQL>select file#,name,checkpoint_change#,checkpoint_time from v$datafile;

     FILE# NAME                                     CHECKPOINT_CHANGE# CHECKPOINT_TIME
---------- ---------------------------------------- ------------------ -------------------
         1 /dbdata/oradata/xbtst/system01.dbf                  1233066 2016-11-10 11:23:44
         2 /dbdata/oradata/xbtst/sysaux01.dbf                  1233066 2016-11-10 11:23:44
         3 /dbdata/oradata/xbtst/undotbs01.dbf                 1233066 2016-11-10 11:23:44
         4 /dbdata/oradata/xbtst/users01.dbf                   1233066 2016-11-10 11:23:44
         5 /dbdata/oradata/xbtst/moe01.dbf                     1233066 2016-11-10 11:23:44

2、模擬某個數據文件在問題

shutdown immediate數據庫,然後拷貝moe01.dbf這個數據文件,然後打開數據庫,做日誌切換,然後shutdown immediate,再把之前的拷貝替換現在的moe01.dbf數據文件

SYS@xbtst SQL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@tstdb-25-220 xbtst]$ cp moe01.dbf moe01.dbf.bak
[oracle@tstdb-25-220 xbtst]$ ll
總用量 3872076
-rw-r-----. 1 oracle oinstall    9748480 11月 10 09:48 control01.ctl
-rw-r-----. 1 oracle oinstall    9748480 11月 10 09:48 control02.ctl
-rw-r-----. 1 oracle oinstall 1073750016 11月 10 09:48 moe01.dbf
-rw-r-----. 1 oracle oinstall 1073750016 11月 10 11:23 moe01.dbf.bak
-rw-r-----. 1 oracle oinstall   52429312 11月  9 13:13 redo01.log
-rw-r-----. 1 oracle oinstall   52429312 11月  9 22:00 redo02.log
-rw-r-----. 1 oracle oinstall   52429312 11月 10 09:48 redo03.log
-rw-r-----. 1 oracle oinstall  587210752 11月 10 09:48 sysaux01.dbf
-rw-r-----. 1 oracle oinstall  807411712 11月 10 09:48 system01.dbf
-rw-r-----. 1 oracle oinstall   30416896 11月  9 22:00 temp01.dbf
-rw-r-----. 1 oracle oinstall  131080192 11月 10 09:48 undotbs01.dbf
-rw-r-----. 1 oracle oinstall  111419392 11月 10 09:48 users01.dbf

SYS@xbtst SQL>startup
ORACLE instance started.

Total System Global Area 2455228416 bytes
Fixed Size                  2255712 bytes
Variable Size             620758176 bytes
Database Buffers         1811939328 bytes
Redo Buffers               20275200 bytes
Database mounted.
Database opened.

SYS@xbtst SQL>alter system switch logfile;

System altered.

SYS@xbtst SQL>alter system switch logfile;

System altered.

SYS@xbtst SQL>alter system switch logfile;

System altered.

SYS@xbtst SQL>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

[oracle@tstdb-25-220 xbtst]$ cp moe01.dbf moe01.dbf.bak.f
[oracle@tstdb-25-220 xbtst]$ cp moe01.dbf.bak moe01.dbf

啓動數據庫報錯
SYS@xbtst SQL>startup
ORACLE instance started.

Total System Global Area 2455228416 bytes
Fixed Size                  2255712 bytes
Variable Size             620758176 bytes
Database Buffers         1811939328 bytes
Redo Buffers               20275200 bytes
Database mounted.
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/dbdata/oradata/xbtst/moe01.dbf'

SYS@xbtst SQL>recover datafile 5;
ORA-00279: change 1233063 generated at 11/10/2016 09:48:02 needed for thread 1
ORA-00289: suggestion : /apps/oracle/11.2.0/db_1/dbs/arch1_24_925478204.dbf
ORA-00280: change 1233063 for thread 1 is in sequence #24


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log '/apps/oracle/11.2.0/db_1/dbs/arch1_24_925478204.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


ORA-00308: cannot open archived log '/apps/oracle/11.2.0/db_1/dbs/arch1_24_925478204.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

3、場景模擬出來了,下面是修復過程

使用BBED,將文件頭的SCN等關鍵信息修改到與控制文件control file相匹配即可

SYS@xbtst SQL>select file#, CHECKPOINT_CHANGE# from v$datafile;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1            1233692
         2            1233692
         3            1233692
         4            1233692
         5            1233692

SYS@xbtst SQL>select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#
------------------
           1233692

SYS@xbtst SQL>select file#, recover, fuzzy, CHECKPOINT_CHANGE# from v$datafile_header;

     FILE# REC FUZ CHECKPOINT_CHANGE#
---------- --- --- ------------------
         1 NO  NO             1233692
         2 NO  NO             1233692
         3 NO  NO             1233692
         4 NO  NO             1233692
         5 YES NO             1233063

控制文件中datafile5的scn是:1233692,而數據文件頭中的scn是:1233063

使用bbed將datafile5的數據文件頭對應的SCN修改爲與其他文件相同,我們先看一下users01.dbf這個文件的文件頭

BBED> set filename '/dbdata/oradata/xbtst/users01.dbf'
        FILENAME        /dbdata/oradata/xbtst/users01.dbf

BBED> set block 1
        BLOCK#          1

BBED> map
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                                     Dba:0x00000000
------------------------------------------------------------
 Data File Header

 struct kcvfh, 860 bytes                    @0       

 ub4 tailchk                                @8188

因爲我們要修改數據文件頭,因此我們需要關注四個偏移量offset點,分別爲484、492、140和148

1、datafile 的file header 存儲在第一個block裏

2、Oracle considers four attributes of this data structure when determining if a datafile is sync with the other data files of the database:(不同oracle版本offset可能不同)

(1)kscnbas (at offset 484) – SCN of last change to the datafile.

(2)kcvcptim (at offset 492) -Time of the last change to the datafile.

(3)kcvfhcpc (at offset 140) – Checkpoint count.

(4)kcvfhccc (at offset 148) – Unknown, but is always 1 less than thecheckpoint point count.

Oracle有4個屬性來判斷datafile 是否和其他的datafile 一致,如果都一致,可以正常操作,如果不一致,那麼會報ORA-01113錯誤

下面我們看下這幾個offset

BBED> set offset 484
        OFFSET          484

BBED> dump
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                Offsets:  484 to  995           Dba:0x00000000
------------------------------------------------------------------------
 1cd31200 00000000 bd384937 01000000 1b000000 30010000 100051f2 02000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 0d000d00 0d000100 00000000 00000000 00000000 02000001 03000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> set offset 492
        OFFSET          492

BBED> dump
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                Offsets:  492 to 1003           Dba:0x00000000
------------------------------------------------------------------------
 bd384937 01000000 1b000000 30010000 100051f2 02000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 0d000d00 0d000100 
 00000000 00000000 00000000 02000001 03000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> set offset 140
        OFFSET          140

BBED> dump
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                Offsets:  140 to  651           Dba:0x00000000
------------------------------------------------------------------------
 78000000 14ff4737 77000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 04000000 05005553 45525300 00000000 00000000 00000000 00000000 00000000 
 00000000 04000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 7ac92131 01000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 1cd31200 00000000 
 bd384937 01000000 1b000000 30010000 100051f2 02000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 0d000d00 0d000100 

 <32 bytes per line>

BBED> set offset 148
        OFFSET          148

BBED> dump
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                Offsets:  148 to  659           Dba:0x00000000
------------------------------------------------------------------------
 77000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 04000000 05005553 
 45525300 00000000 00000000 00000000 00000000 00000000 00000000 04000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 7ac92131 01000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 1cd31200 00000000 bd384937 01000000 
 1b000000 30010000 100051f2 02000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 0d000d00 0d000100 00000000 00000000 

 <32 bytes per line>

其中,位於484和488偏移量的是數據文件對應的SCN編號。在Oracle內部,SCN是使用wrap*4*1024*1024*1024+base來進行標示的。通常我們看到的數據庫wrap都是0。位於492偏移量的是最後一次檢查點對應的時間信息。位於140和148偏移量的是檢查點次數。這些信息都是會由於時間推動和檢查點動作引起變化,我們嚴格情況下,需要保證文件頭塊的信息和控制文件信息一致。


另外一點,由於Linux是Little字節系統,要關注寫入時候的格式問題。最簡單的方式是dump一下偏移量,看看是怎麼保存的。

BBED> dump
 File: /dbdata/oradata/xbtst/users01.dbf (0)
 Block: 1                Offsets:  484 to  995           Dba:0x00000000
------------------------------------------------------------------------
 1cd31200 00000000 bd384937 01000000 1b000000 30010000 100051f2 02000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

然後我們修改moe01.dbf的文件頭(修改這幾個offset,我這裏只修改了484、492就可以open庫了)

BBED> set filename '/dbdata/oradata/xbtst/moe01.dbf'
        FILENAME        /dbdata/oradata/xbtst/moe01.dbf

BBED> set block 1
        BLOCK#          1

BBED> set mode edit
        MODE            Edit

BBED> set offset 484
        OFFSET          484

BBED> dump
 File: /dbdata/oradata/xbtst/moe01.dbf (0)
 Block: 1                Offsets:  484 to  995           Dba:0x00000000
------------------------------------------------------------------------
 a7d01200 00000000 52204937 01000000 18000000 4d8d0000 100051f2 02000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 0d000d00 0d000100 00000000 00000000 00000000 02004001 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> m /x 1cd31200 484
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /dbdata/oradata/xbtst/moe01.dbf (0)
 Block: 1                Offsets:  484 to  995           Dba:0x00000000
------------------------------------------------------------------------
 1cd31200 00000000 52204937 01000000 18000000 4d8d0000 100051f2 02000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 0d000d00 0d000100 00000000 00000000 00000000 02004001 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> m /x bd384937 492
BBED-00209: invalid number (bd384937)


BBED> m /x bd38 492
 File: /dbdata/oradata/xbtst/moe01.dbf (0)
 Block: 1                Offsets:  492 to 1003           Dba:0x00000000
------------------------------------------------------------------------
 bd384937 01000000 18000000 4d8d0000 100051f2 02000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 0d000d00 0d000100 
 00000000 00000000 00000000 02004001 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> m /x 4937 494
 File: /dbdata/oradata/xbtst/moe01.dbf (0)
 Block: 1                Offsets:  494 to 1005           Dba:0x00000000
------------------------------------------------------------------------
 49370100 00001800 00004d8d 00001000 51f20200 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000d00 0d000d00 01000000 
 00000000 00000000 00000200 40010000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

 <32 bytes per line>

BBED> sum apply
Check value for File 0, Block 1:
current = 0x1683, required = 0x1683

BBED> verify
DBVERIFY - Verification starting
FILE = /dbdata/oradata/xbtst/moe01.dbf
BLOCK = 1


DBVERIFY - Verification complete

Total Blocks Examined         : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing   (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing   (Index): 0
Total Blocks Empty            : 0
Total Blocks Marked Corrupt   : 0
Total Blocks Influx           : 0
Message 531 not found;  product=RDBMS; facility=BBED

這時我們再次查看各個數據文件頭的scn,發現scn一致了

SYS@xbtst SQL>select file#, recover, fuzzy, CHECKPOINT_CHANGE# from v$datafile_header;

     FILE# REC FUZ CHECKPOINT_CHANGE#
---------- --- --- ------------------
         1 NO  NO             1233692
         2 NO  NO             1233692
         3 NO  NO             1233692
         4 NO  NO             1233692
         5 YES NO             1233692

試着open庫

SYS@xbtst SQL>alter database open
  2  ;
alter database open
*
ERROR at line 1:
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/dbdata/oradata/xbtst/moe01.dbf'


SYS@xbtst SQL>recover datafile 5;
Media recovery complete.
SYS@xbtst SQL>alter database open;

Database altered.

看一下alert文件

ALTER DATABASE RECOVER  datafile 5  
Media Recovery Start
Serial Media Recovery started
Media Recovery Complete (xbtst)
Completed: ALTER DATABASE RECOVER  datafile 5  
Thu Nov 10 13:47:24 2016
alter database open
Thu Nov 10 13:47:25 2016
Thread 1 opened at log sequence 27
  Current log# 3 seq# 27 mem# 0: /dbdata/oradata/xbtst/redo03.log
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Thu Nov 10 13:47:25 2016
SMON: enabling cache recovery
[20910] Successfully onlined Undo Tablespace 2.
Undo initialization finished serial:0 start:3710149144 end:3710149224 diff:80 (0 seconds)
Verifying file header compatibility for 11g tablespace encryption..
Verifying 11g file header compatibility for tablespace encryption completed
SMON: enabling tx recovery
Database Characterset is AL32UTF8
No Resource Manager plan active
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
Thu Nov 10 13:47:25 2016
QMNC started with pid=20, OS id=21409 
Completed: alter database open

在本次恢復過程中,recover是可行的,原因是該庫並沒做過resetlog,如果datafile是在 resetlog之前就已經offline的數據文件,那recover是不可行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章