【BBED】使用BBED修改資料檔案SCN,使該檔案從offline轉變為online

恩強Boy發表於2020-11-25

一、 使用場景

使用BBED 對資料檔案修改 scn 主要用於兩個方面:

1.  某個資料檔案早已被offline ,在將資料檔案進行 online 時,發現歸檔日誌早已不在,無法正常進行 recover 的極端情況。

這種情況原理很簡單。在正常情況下所有online 狀態的資料檔案 SCN 會持續前進,並保持一致。而將資料檔案 offline 時,該檔案的 SCN 就不會繼續前進了(落伍了),想要把這個檔案 SCN 拉起來,必須保證該檔案和其他檔案能擁有一樣的 SCN 號,這個時候就需要歸檔日誌來進行補充,幫助該檔案的 SCN 追上其他檔案。但是很多情況歸檔日誌進行被刪除了很多,無法達到這樣的目的。這時常規 recover 方式就不能發揮作用了。

2.  資料庫在進行冷備時,沒有關閉資料庫,導致進行了不一致的備份。然後恢復時發現問題,卻為時已晚。此時資料庫只能恢復到mount 狀態,不能進行 open

這種情況的原理,是因為在進行冷備時,要儲存所有資料檔案。正常情況下進行冷備時,資料庫用進行shutdown ,該過程要執行 checkpoint ,保證所有資料檔案和控制檔案保持一致的 SCN ,用以確保下次資料庫能夠正常開啟。而如果沒有進行 shutdown 就儲存資料檔案的話,就會導致資料檔案和控制檔案 scn 號參差不齊,肯定是無法正常開啟使用的。

上面兩種情況有著相同點。在將資料檔案online 或將資料庫進行 open 操作時,要保證所有的資料檔案在一條線上(相同 SCN ),這樣才能保證資料庫可以正常開啟,以達到正常使用的目的。

本文用以介紹使用BBED 將早已 offline 的資料檔案進行修改 SCN 的操作,以達到 online 該資料檔案的目的。

二、 測試環境準備

1) 建立表空間

SQL> create tablespace test1 datafile '/u01/app/oracle/oradata/orcl/test01.dbf' size 50m ;

2) 建立使用者

SQL> create user test01 identified by oracle default tablespace test1;

SQL> grant dba to test01;

3) 建立表資料

SQL> create table tab_test as select * from dba_objects;

SQL> select count(*) from tab_test;

  COUNT(*)

----------

      86958

4) 檢查資料檔案

SQL> set linesize 200

SQL> col name for a50

SQL> col scn for a10

SQL> select file#,name,to_char(checkpoint_change#) SCN,status from v$datafile;

FILE#   NAME                                     SCN        STATUS

----------  --- --------------------------------- ---------- -------

1     /u01/app/oracle/oradata/orcl/system01.dbf   1113225    SYSTEM

2   /u01/app/oracle/oradata/orcl/sysaux01.dbf   1113225    ONLINE

3   /u01/app/oracle/oradata/orcl/undotbs01.dbf 1113225     ONLINE

4   /u01/app/oracle/oradata/orcl/users01.dbf    1113225    ONLINE

5   /u01/app/oracle/oradata/orcl/example01.dbf   1113225     ONLINE

6   /u01/app/oracle/oradata/orcl/test01.dbf     1113225    ONLINE

7   /u01/app/oracle/oradata/orcl/test02.dbf     1113225    ONLINE

5) 檢查歸檔情況(非歸檔)

SQL> archive log list;

Database log mode               No Archive Mode

Automatic archival             Disabled

Archive destination            USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     7

Current log sequence           9

6) test01 資料檔案 offline

SQL> alter database datafile 6 offline drop;

7) 執行多次切換日誌

SQL> alter system switch logfile;

8) 再次檢視資料檔案情況

SQL> select file#,name,to_char(checkpoint_change#) SCN,status from v$datafile;

FILE#    NAME                                            SCN        STATUS

--------   ------------------------------------------ ---------- -------

1   /u01/app/oracle/oradata/orcl/system01.dbf 1115481    SYSTEM

2   /u01/app/oracle/oradata/orcl/sysaux01.dbf 1115481    ONLINE

3   /u01/app/oracle/oradata/orcl/undotbs01.dbf   1115481    ONLINE

4   /u01/app/oracle/oradata/orcl/users01.dbf    1115481    ONLINE

5   /u01/app/oracle/oradata/orcl/example01.dbf  1115481    ONLINE

6   /u01/app/oracle/oradata/orcl/test01.dbf      1115069      RECOVER

7   /u01/app/oracle/oradata/orcl/test02.dbf     1115481    ONLINE

9) test01 進行 online

SQL> alter database datafile 6 online;

alter database datafile 6 online

*

ERROR at line 1:

ORA-01113: file 6 needs media recovery

ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/test01.dbf'

 

SQL> recover datafile 6;

ORA-00279: change 1115069 generated at 11/09/2020 21:45:11 needed for thread 1

ORA-00289: suggestion : /u01/app/oracle/fast_recovery_area/ORCL/archivelog/2020_11_09/o1_mf_1_9_%u_.arc

ORA-00280: change 1115069 for thread 1 is in sequence #9

10) 解決思路

我們發現被offline 的資料檔案的 SCN 小於其他資料檔案的 SCN ,我們只需要將 datafile 6 SCN 1115069 修改為 1115481 即可。

為了測試方便需要將庫切換到mount 狀態,為了防止資料庫進行 checkpoint ,導致 SCN 號的再次向前推進(實際上只要保證資料庫不執行 checkpoint, 就不需要停庫)。這樣一會操作的時候就不會受到 ckpt 程式的干擾了,這裡需要注意的一點是,停庫是會做 checkpoint 的,所以起到 mount 狀態後,我們再查一次,結果如下:

FILE#   NAME                                     SCN        STATUS

--------  ------- ----------------------------   --------   ----------------

1   /u01/app/oracle/oradata/orcl/system01.dbf   1121994    SYSTEM

2   /u01/app/oracle/oradata/orcl/sysaux01.dbf   1121994    ONLINE

3   /u01/app/oracle/oradata/orcl/undotbs01.dbf 1121994    ONLINE

4   /u01/app/oracle/oradata/orcl/users01.dbf      1121994    ONLINE

5   /u01/app/oracle/oradata/orcl/example01.dbf  1121994    ONLINE

6   /u01/app/oracle/oradata/orcl/test01.dbf       1115069     RECOVER

7   /u01/app/oracle/oradata/orcl/test02.dbf      1121994    ONLINE

三、 使用BBED 進行修正

1)  編輯filelist 檔案

$ vi  filelist.txt

1 /u01/app/oracle/oradata/orcl/system01.dbf 786432000

2 /u01/app/oracle/oradata/orcl/sysaux01.dbf 576716800

3 /u01/app/oracle/oradata/orcl/undotbs01.dbf 94371840

4 /u01/app/oracle/oradata/orcl/users01.dbf 5242880

5 /u01/app/oracle/oradata/orcl/example01.dbf 328335360

6 /u01/app/oracle/oradata/orcl/test01.dbf 52428800

7 /u01/app/oracle/oradata/orcl/test02.dbf 62914560

上述檔案可以用以下SQL 進行查詢

SQL> select file#||' '||name||' '||bytes from v$datafile ;

2)  編輯 bbed.par 檔案

$ vi  / home/oracle /bbed.par

blocksize=8192

listfile=/ home/oracle /filelist.txt

mode=edit

3)  使用引數檔案進入bbed

$ bbed parfile=/home/oracle/bbed.par

Password: 預設密碼 blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Tue Nov 10 01:19:17 2020

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED>

4)  檢視需要編輯的檔案

BBED>  info

 File#  Name                                                         Size(blks)

 -----  ----                                                        ----------

     1  /u01/app/oracle/oradata/orcl/system01.dbf                        96000

     2  /u01/app/oracle/oradata/orcl/sysaux01.dbf                        70400

     3  /u01/app/oracle/oradata/orcl/undotbs01.dbf                       11520

     4  /u01/app/oracle/oradata/orcl/users01.dbf                           640

     5  /u01/app/oracle/oradata/orcl/example01.dbf                       40080

     6  /u01/app/oracle/oradata/orcl/test01.dbf                           6400

     7  /u01/app/oracle/oradata/orcl/test02.dbf                           7680

5)  檢視其它檔案的檔案頭資訊(datafile 7

BBED> set file 7 block 1

        FILE#           7

        BLOCK#          1

BBED> map

 File: /u01/app/oracle/oradata/orcl/test02.dbf (7)

 Block: 1                                     Dba:0x01c00001

------------------------------------------------------------

 Data File Header

  struct kcvfh, 860 bytes                     @0       

 ub4 tailchk                                @8188

從上圖我們可以看出包含兩個大的結構,kcvfh tailcjk

6)  檢視kcvfh 結構

BBED> p kcvfh

上圖顯示,在kcvfhckp 結構下面有一個 kcvcpscn

7)  檢視kcvfhckp

BBED> p kcvfhckp

上圖所示, kcvcpscn 這個結構就是存的 SCN ,他基於 8K 的偏移量為 484

8)  檢視偏移量為484 的資訊

BBED> set offset 484

        OFFSET          484

BBED> dump

 File: /u01/app/oracle/oradata/orcl/test02.dbf (7)

 Block: 1                Offsets:  484 to  995           Dba:0x01c00001

-----------------------------------------------------------------

 ca1e1100  00000000 3c63f23e 01000000 18000000 552a0000 10000b8b 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 0200c001 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

根據上面結果顯示,ca1e1100 ”就是 11 號檔案的 SCN 號。這裡存的是 16 進位制,需要轉換為 10 進位制。由於 linux 存的是小位元組序,意味著實際存的數是反過來的。所以“ ca|1e|11|00 ”反過來就是“ 00|11|1e|ca ”,在計算器算一下,該數轉換為 10 進位制後的數字為“ 1121994 ”,正好是檔案 7 SCN 號!

現在我們明確了,需要將6 號檔案頭的對應位置改為“ ca1e1100 ”即可

9)  檢視datafile 6 的檔案頭資訊

BBED> set file 6 block 1

        FILE#           6

        BLOCK#          1

BBED> set offset 484

        OFFSET          484

BBED> dump

 File: /u01/app/oracle/oradata/orcl/test01.dbf (6)

 Block: 1                Offsets:  484 to  995           Dba:0x01800001

---------------------------------------------------------

 bd031100  00000000 e72ef23e 01000000 09000000 475d0000 10000000 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 02008001 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

10)  修改datafile 6 檔案頭

BBED> modify / x ca1e11

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y

 File: /u01/app/oracle/oradata/orcl/test01.dbf (6)

 Block: 1                Offsets:  484 to  995           Dba:0x01800001

---------------------------------------------------------

  ca1e1100 00000000 e72ef23e 01000000 09000000 475d0000 10000000 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 02008001 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

BBED> sum apply           -- 重新生成校驗值

Check value for File 6, Block 1:

current = 0xe6d3, required = 0xe6d3

 

BBED> verify

DBVERIFY - Verification starting

FILE = /u01/app/oracle/oradata/orcl/test01.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

此時已經修改完成

四、 修改完驗證

SQL> recover datafile 6;

Media recovery complete.

 

SQL> alter database open;

Database altered.

 

SQL> alter database datafile 6 online;

Database altered.

 

SQL> alter system checkpoint;

System altered.

 

SQL> select file#,name,to_char(checkpoint_change#) SCN,status from v$datafile;

     FILE# NAME                                                         SCN        STATUS

---------- --------- ------ -------------------------------   -------------------

1 /u01/app/oracle/oradata/orcl/system01.dbf                    1123830    SYSTEM

2 /u01/app/oracle/oradata/orcl/sysaux01.dbf                    1123830    ONLINE

3 /u01/app/oracle/oradata/orcl/undotbs01.dbf                   1123830    ONLINE

4 /u01/app/oracle/oradata/orcl/users01.dbf                     1123830    ONLINE

5 /u01/app/oracle/oradata/orcl/example01.dbf                   1123830    ONLINE

6 /u01/app/oracle/oradata/orcl/test01.dbf                       1123830     ONLINE

7 /u01/app/oracle/oradata/orcl/test02.dbf                      1123830    ONLINE

SQL> select count(*) from test01. tab_test;

  COUNT(*)

----------

      86958

 

 

 

 

---- end ----


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

相關文章