【BBED】使用BBED修改資料檔案SCN,使該檔案從offline轉變為online
一、 使用場景
使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【kingsql分享】使用BBED修改Oracle資料檔案頭推進SCNSQLOracle
- BBED 修改oracle 資料檔案的 SCN 號來做資料庫不完全恢復。Oracle資料庫
- 使用BBED跳過歸檔檔案
- ORA-01190使用bbed強制online資料檔案
- [20160329]bbed修復offline的資料檔案.txt
- Oracle 之利用BBED修改資料塊SCN----沒有備份資料檔案的資料恢復Oracle資料恢復
- 【BBED】使用bbed修改數字型別資料型別
- 【BBED】使用bbed修改字元型別資料字元型別
- [20160405]bbed修改檔案頭.txt
- 使用BBED修改檔案頭解決資料庫Open驗證問題(下)資料庫
- 使用BBED修改檔案頭解決資料庫Open驗證問題(上)資料庫
- 【BBED】使用bbed 修改日期型別的資料型別
- bbed 與檔案頭恢復
- ORACLE 10g中使用BBED修復損壞資料檔案Oracle 10g
- BBED 修改檔案頭 解決 ORA-01190
- oracle_bbed.Datafile.Header_System.資料檔案頭資訊OracleHeader
- 透過修改控制檔案scn推進資料庫scn資料庫
- [20160407]bbed修改檔案頭2(補充).txt
- 使用DUMP資料塊與BBED檢視BLOCK對比資料庫修改時的SCNBloC資料庫
- 用bbed檢視資料檔案的資料塊block 0及block 1BloC
- 使用BBED檢視SYSTEM檔案頭的root dba及bootstrap$boot
- oracle 資料檔案offlineOracle
- [20150527]bbed解決資料檔案大小問題.txt
- 利用BBED修改資料塊SCN----極端環境下的資料恢復資料恢復
- 【BBED】 SYSTEM檔案頭損壞的恢復(4)
- oracle bbed修改資料塊的例子Oracle
- 表空間與資料檔案的offline和online操作
- online/offline 表空間和資料檔案需謹慎!
- 【BBED】使用bbed恢復已經刪除的行資料
- bbed 之資料修改Ktbbh(Ktbbh資料)
- 修改資料檔案地址
- 資料檔案offline後,再online時,提示需要介質恢復。
- 資料檔案的SCN和資料塊的SCN有何區別
- 修改資料檔案路徑
- 修改online redo日誌檔案大小
- OFFLINE和DROP資料檔案的理解
- 【原創】ASM下的資料檔案轉換為普通檔案ASM
- 重建控制檔案, 資料檔案檢查點SCN到底來自哪裡?