磁碟損壞造成RMAN備份檔案有壞塊的恢復案例

eric0435發表於2015-05-31

朋友客戶的資料庫由於磁碟損壞,從儲存級別抽取出了RMAN的備份檔案,但沒有抽取出資料檔案,聯機重做日誌,控制檔案,引數檔案等資料庫檔案。但抽取出來的備份檔案中有資料檔案,控制檔案,引數檔案的備份,歸檔重做日誌備份因為沒有磁碟空間沒有執行完成。新安裝Oracle軟體後建立引數檔案來使用RMAN備份來還原和恢復資料庫。但在還原資料檔案時出錯,錯誤如下所示:

RMAN> run
2> {
3> allocate channel t1 device type disk;
4> restore controlfile from 'E:\ORABACK\ORCLBPM_9BQ7K30M_20150522.BAK';
5> alter database mount;
6> release channel t1;
7> }

使用目標資料庫控制檔案替代恢復目錄
分配的通道: t1
通道 t1: SID=572 裝置型別=DISK

啟動 restore 於 29-5月 -15

通道 t1: 正在還原控制檔案
通道 t1: 還原完成, 用時: 00:00:03
輸出檔名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL01.CTL
輸出檔名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL02.CTL
輸出檔名=D:\ORACLE\ORADATA\ORCLBPM\CONTROL03.CTL
完成 restore 於 29-5月 -15

資料庫已裝載

釋放的通道: t1

RMAN> run
2> {
3> allocate channel t1 device type disk;
4> restore database;
5> recover database;
6> release channel t1;
7> }

分配的通道: t1
通道 t1: SID=572 裝置型別=DISK

啟動 restore 於 29-5月 -15
啟動 implicit crosscheck backup 於 29-5月 -15
已交叉檢驗的 200 物件
完成 implicit crosscheck backup 於 29-5月 -15

啟動 implicit crosscheck copy 於 29-5月 -15
完成 implicit crosscheck copy 於 29-5月 -15

搜尋恢復區中的所有檔案
正在編制檔案目錄...
沒有為檔案編制目錄


通道 t1: 正在開始還原資料檔案備份集
通道 t1: 正在指定從備份集還原的資料檔案
通道 t1: 將資料檔案 00001 還原到 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
通道 t1: 將資料檔案 00002 還原到 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
通道 t1: 將資料檔案 00003 還原到 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
通道 t1: 將資料檔案 00004 還原到 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
通道 t1: 將資料檔案 00005 還原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
通道 t1: 將資料檔案 00006 還原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
通道 t1: 將資料檔案 00007 還原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
通道 t1: 將資料檔案 00008 還原到 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
通道 t1: 將資料檔案 00009 還原到 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
通道 t1: 將資料檔案 00010 還原到 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF
通道 t1: 正在讀取備份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK
通道 t1: ORA-19870: 還原備份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 時出錯
ORA-19612: 資料檔案 1 沒有還原, 因為 missing or corrupt data

故障轉移到上一個備份

釋放的通道: t1
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: restore 命令 (在 05/29/2015 17:03:44 上) 失敗
RMAN-06026: 有些目標沒有找到 - 終止還原
RMAN-06023: 沒有找到資料檔案1的副本來還原

從錯誤資訊: ORA-19870: 還原備份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 時出錯,ORA-19612: 資料檔案 1 沒有還原, 因為 missing or corrupt data可以知道在執行還原資料檔案1時備份片段丟失或有壞塊,這裡明顯是有壞塊,因為其它資料檔案使用該備份片段已經還原成功了。這裡透過設定事件讓RMAN跳過壞塊來還原資料檔案。
C:\Users\Administrator>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on 星期五 5月 29 18:02:22 2015

Copyright (c) 1982, 2010, Oracle. All rights reserved.

連線到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> alter system set event='19548 trace name context forever’, ‘19549 trace name
context forever' scope=spfile;

系統已更改。

SQL> shutdown immediate
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。

SQL> startup mount
ORACLE 例程已經啟動。

Total System Global Area 7666352128 bytes
Fixed Size 2190736 bytes
Variable Size 3942646384 bytes
Database Buffers 3707764736 bytes
Redo Buffers 13750272 bytes
資料庫裝載完畢。

RMAN> restore database;

啟動 restore 於 29-5月 -15
使用目標資料庫控制檔案替代恢復目錄
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=1141 裝置型別=DISK

正在略過資料檔案 2; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
正在略過資料檔案 3; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
正在略過資料檔案 4; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
正在略過資料檔案 5; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
正在略過資料檔案 6; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
正在略過資料檔案 8; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
正在略過資料檔案 9; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
正在略過資料檔案 10; 已還原到檔案 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF
通道 ORA_DISK_1: 正在開始還原資料檔案備份集
通道 ORA_DISK_1: 正在指定從備份集還原的資料檔案
通道 ORA_DISK_1: 將資料檔案 00001 還原到 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
通道 ORA_DISK_1: 將資料檔案 00007 還原到 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
通道 ORA_DISK_1: 正在讀取備份片段 E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK
通道 ORA_DISK_1: 段控制程式碼 = E:\ORABACK\ORCLBPM_9AQ7K1NM_20150522.BAK 標記 = TAG2015052
通道 ORA_DISK_1: 已還原備份片段 1
通道 ORA_DISK_1: 還原完成, 用時: 00:02:45
完成 restore 於 29-5月 -15

下面對之前還原報錯的資料檔案SYSTEM01.DBF,HB_SY03.DBF進行驗證
C:\Users\Administrator>dbv file=D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF blocksize
=8192

DBVERIFY: Release 11.2.0.1.0 - Production on 星期五 5月 29 18:29:19 2015

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

DBVERIFY - 開始驗證: FILE = D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF

DBVERIFY - 驗證完成

檢查的頁總數: 280064
處理的頁總數 (資料): 242009
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 13233
失敗的頁總數 (索引): 0
處理的頁總數 (其他): 3322
處理的總頁數 (段) : 1
失敗的總頁數 (段) : 0
空的頁總數: 21500
標記為損壞的總頁數: 0
流入的頁總數: 0
加密的總頁數 : 0
最高塊 SCN : 87501555 (0.87501555)

C:\Users\Administrator>dbv file=D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF blocksize=
8192

DBVERIFY: Release 11.2.0.1.0 - Production on 星期五 5月 29 18:30:35 2015

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

DBVERIFY - 開始驗證: FILE = D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF

DBVERIFY - 驗證完成

檢查的頁總數: 524288
處理的頁總數 (資料): 256890
失敗的頁總數 (資料): 0
處理的頁總數 (索引): 52837
失敗的頁總數 (索引): 0
處理的頁總數 (其他): 196657
處理的總頁數 (段) : 0
失敗的總頁數 (段) : 0
空的頁總數: 17904
標記為損壞的總頁數: 0
流入的頁總數: 0
加密的總頁數 : 0
最高塊 SCN : 87500838 (0.87500838)

從上面的驗證可以看到沒有壞塊,幸運哈哈。我們來檢查一個控制檔案中記錄的資料檔案檢查點SCN與資料檔案頭SCN是否相同,如果不同可能需要恢復。

SQL> select file#,checkpoint_change#,to_char(checkpoint_time,'yyyy-mm-dd hh24:mi
:ss') checkpoint_time from v$datafile;

     FILE# CHECKPOINT_CHANGE# CHECKPOINT_TIME
---------- ------------------ -------------------
         1           87500284 2015-05-22 23:00:42
         2           87500284 2015-05-22 23:00:42
         3           87500284 2015-05-22 23:00:42
         4           87500284 2015-05-22 23:00:42
         5           87500284 2015-05-22 23:00:42
         6           87500284 2015-05-22 23:00:42
         7           87500284 2015-05-22 23:00:42
         8           87500284 2015-05-22 23:00:42
         9           87500284 2015-05-22 23:00:42
        10           87500284 2015-05-22 23:00:42

已選擇10行。
SQL> select file#,checkpoint_change#,name from v$datafile_header;

     FILE# CHECKPOINT_CHANGE# NAME
---------- ------------------ ----------------------------------
         1           87499953 D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF
         2           87499953 D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF
         3           87499953 D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF
         4           87499953 D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF
         5           87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF
         6           87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF
         7           87499953 D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF
         8           87499953 D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF
         9           87499953 D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF
        10           87499953 D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF


已選擇10行。

可以看到所有資料檔案頭記錄的檢查點scn都一樣,控制檔案中記錄的所有資料檔案檢查點scn都一樣,但資料檔案頭檢查點scn與控制檔案中記錄的資料檔案檢查點scn不一樣,所以選擇重建控制檔案來執行恢復,這裡將控制檔案備份到跟蹤檔案中。

SQL> oradebug setmypid
已處理的語句
SQL> alter database backup controlfile to trace
  2  ;

資料庫已更改。

SQL> oradebug tracefile_name
d:\app\administrator\diag\rdbms\orclbpm\orclbpm\trace\orclbpm_ora_1704.trc

下面用跟蹤檔案的控制檔案建立語句來重新建立控制檔案,這裡要使用resetlogs方式來建立,因為RMAN的備份檔案中沒有聯機重做日誌檔案。

SQL> shutdown immediate
ORA-01109: ??????


已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。

Total System Global Area 7666352128 bytes
Fixed Size                  2190736 bytes
Variable Size            3942646384 bytes
Database Buffers         3707764736 bytes
Redo Buffers               13750272 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "ORCLBPM" RESETLOGS  ARCHIVELOG
  2      MAXLOGFILES 16
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 100
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 'D:\ORACLE\ORADATA\ORCLBPM\REDO01.LOG'  SIZE 50M BLOCKSIZE 512,
  9    GROUP 2 'D:\ORACLE\ORADATA\ORCLBPM\REDO02.LOG'  SIZE 50M BLOCKSIZE 512,
 10    GROUP 3 'D:\ORACLE\ORADATA\ORCLBPM\REDO03.LOG'  SIZE 50M BLOCKSIZE 512
 11  -- STANDBY LOGFILE
 12  DATAFILE
 13    'D:\ORACLE\ORADATA\ORCLBPM\SYSTEM01.DBF',
 14    'D:\ORACLE\ORADATA\ORCLBPM\SYSAUX01.DBF',
 15    'D:\ORACLE\ORADATA\ORCLBPM\UNDOTBS01.DBF',
 16    'D:\ORACLE\ORADATA\ORCLBPM\USERS01.DBF',
 17    'D:\ORACLE\ORADATA\ORCLBPM\HB_SY01.DBF',
 18    'D:\ORACLE\ORADATA\ORCLBPM\HB_SY02.DBF',
 19    'D:\ORACLE\ORADATA\ORCLBPM\HB_SY03.DBF',
 20    'D:\ORACLE\ORADATA\ORCLBPM\BPMSY01.DBF',
 21    'D:\ORACLE\ORADATA\ORCLBPM\HMBPM01.DBF',
 22    'D:\ORACLE\ORADATA\ORCLBPM\BLOCK01.DBF'
 23  CHARACTER SET ZHS16GBK
 24  ;

控制檔案已建立。

檢查一個控制檔案中記錄的資料檔案檢查點SCN與資料檔案頭SCN是否相同,資料檔案頭檢查點scn與控制檔案中記錄的資料檔案檢查點scn一樣,在沒有聯機重做日誌和歸檔重做日誌的情況下,我們只能將資料庫恢復到scn:87499953時間點,並以open resetlogs選項來open資料庫

SQL> select FILE#,CHECKPOINT_CHANGE# from v$datafile_header;

     FILE# CHECKPOINT_CHANGE#
---------- ------------------
         1           87499953
         2           87499953
         3           87499953
         4           87499953
         5           87499953
         6           87499953
         7           87499953
         8           87499953
         9           87499953
        10           87499953

已選擇10行。

SQL> select FILE#, CHECKPOINT_CHANGE#,LAST_CHANGE# from v$datafile;

     FILE# CHECKPOINT_CHANGE# LAST_CHANGE#
---------- ------------------ ------------
         1           87499953
         2           87499953
         3           87499953
         4           87499953
         5           87499953
         6           87499953
         7           87499953
         8           87499953
         9           87499953
        10           87499953

已選擇10行。

這裡需要設定隱含引數_allow_resetlogs_corruption=true來open資料庫。

SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile;

系統已更改。

SQL> shutdown immediate
ORA-01109: ??????


已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。

Total System Global Area 7666352128 bytes
Fixed Size                  2190736 bytes
Variable Size            3942646384 bytes
Database Buffers         3707764736 bytes
Redo Buffers               13750272 bytes
資料庫裝載完畢。
SQL> alter database open resetlogs;

資料庫已更改。

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\ORCLBPM\TEMP01.DBF' R
EUSE;

表空間已更改。

SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。

Total System Global Area 7666352128 bytes
Fixed Size                  2190736 bytes
Variable Size            3942646384 bytes
Database Buffers         3707764736 bytes
Redo Buffers               13750272 bytes
資料庫裝載完畢。
資料庫已經開啟。

直此將資料庫恢復到備份生成的時間點,但沒有歸檔重做日誌和聯機重做日誌丟失了半天的資料。

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

相關文章