Oracle不同檔案丟失/損壞的恢復方法

keeptrying發表於2013-11-13

一、SPFILE丟失

步驟:

RMAN> startup nomount;

RMAN> set dbid 1354067853;

RMAN> restore spfile from autobackup;

或者通過某個檔案:

RMAN> restore spfile from ‘path/file_name’;

RMAN> shutdown immediate;

set dbid 1354067853;

startup;

測試:

SQL> startup        --刪除SPFILE後,資料庫打不開,報錯

ORA-01078: failure in processing system parameters

LRM-00109: ???????????????? 'E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INITSORCL.ORA'

C:\Users\Administrator>rman target /   --使用RMAN

恢復管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 09:38:35 2013

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

已連線到目標資料庫 (未啟動)

RMAN> startup nomount;  --使用RMAN在無SPFILE下啟動到nomount

啟動失敗: ORA-01078: failure in processing system parameters

LRM-00109: ???????????????? 'E:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INITSORCL.ORA'

在沒有引數檔案的情況下啟動 Oracle 例項以檢索 spfile

Oracle 例項已啟動

系統全域性區域總計     159383552 位元組

Fixed Size                     1289436 位元組

Variable Size                 58721060 位元組

Database Buffers              92274688 位元組

Redo Buffers                   7098368 位元組

RMAN> set dbid 1354067853;     --設定DBID

正在執行命令: SET DBID

RMAN> restore spfile from autobackup;

啟動 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131113

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131112

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131111

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131110

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131109

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131108

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131107

通道 ORA_DISK_1: 沒有找到 7 天之內的自動備份

--沒有自動備份

RMAN> restore spfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_13\O1

_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP';

啟動 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 已找到的自動備份: E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_

11_13\O1_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP

通道 ORA_DISK_1: 從自動備份復原 SPFILE 已完成

完成 restore 13-11-13

--從指定備份檔案中恢復

RMAN> shutdown immediate;

Oracle 例項已關閉

SQL> startup             --啟動資料庫

ORACLE 例程已經啟動。

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             339742272 bytes

Database Buffers           29360128 bytes

Redo Buffers                7094272 bytes

資料庫裝載完畢。

資料庫已經開啟。

二、Controlfile全部丟失

步驟:

RMAN> set dbid 1354067853;

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

或者從指定檔案恢復:

RMAN> restore controlfile from ‘path/file_name’;

RMAN> alter database mount;

RMAN> recover database;(保證資料一致,因為控制檔案裡scn發生改變)

RMAN> alter database open resetlogs;

測試:

SQL> startup;                 --啟動資料庫報錯

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             356519488 bytes

Database Buffers           12582912 bytes

Redo Buffers                7094272 bytes

ORA-00205: error in identifying control file, check alert log for more info

SQL> select status from v$instance;

STATUS

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

STARTED                 

SQL> select * from v$database;

select * from v$database

              *

ERROR at line 1:

ORA-01507: database not mounted

SQL> shutdown abort;

ORACLE instance shut down.

C:\Users\Administrator>rman target /       --使用RMAN

恢復管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 10:47:59 2013

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

已連線到目標資料庫 (未啟動)

RMAN> set dbid 1354067853;         --設定DBID

正在執行命令: SET DBID

RMAN> startup nomount;              --啟動至nomount

Oracle 例項已啟動

系統全域性區域總計     377487360 位元組

Fixed Size                     1290688 位元組

Variable Size                360713792 位元組

Database Buffers               8388608 位元組

Redo Buffers                   7094272 位元組

RMAN> restore controlfile from autobackup;

啟動 restore 13-11-13

使用目標資料庫控制檔案替代恢復目錄

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

恢復區域目標: E:\oracle\product\10.2.0\flash_recovery_area

用於搜尋的資料庫名 (或資料庫的唯一名稱): ORCL

通道 ORA_DISK_1: 在恢復區域中未找到自動備份

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131113

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131112

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131111

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131110

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131109

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131108

通道 ORA_DISK_1: 尋找以下日期的自動備份: 20131107

通道 ORA_DISK_1: 沒有找到 7 天之內的自動備份

--沒有自動備份

RMAN> restore controlfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_

13\O1_MF_NCSNF_TAG20131113T092124_985O1HY9_.BKP';

啟動 restore 13-11-13

使用通道 ORA_DISK_1

通道 ORA_DISK_1: 正在復原控制檔案

通道 ORA_DISK_1: 恢復完成, 用時: 00:00:03

輸出檔名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_985T8O42_.CTL

輸出檔名=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_985T8OHP_.CTL

完成 restore 13-11-13

--使用指定的備份檔案恢復

RMAN> alter database mount;           --mount資料庫

資料庫已裝載

釋放的通道: ORA_DISK_1

RMAN> recover database;                --恢復資料庫

啟動 recover 13-11-13

啟動 implicit crosscheck backup 13-11-13

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=156 devtype=DISK

已交叉檢驗的 1 物件

完成 implicit crosscheck backup 13-11-13

啟動 implicit crosscheck copy 13-11-13

使用通道 ORA_DISK_1

完成 implicit crosscheck copy 13-11-13

搜尋恢復區域中的所有檔案

正在編制檔案目錄...

目錄編制完畢

已列入目錄的檔案的列表

=======================

檔名: E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_13\O1_MF_NCSNF_TAG201311

13T092124_985O1HY9_.BKP

使用通道 ORA_DISK_1

正在開始介質的恢復

存檔日誌執行緒 1 序列 3 已作為檔案 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3

_93F18M64_.LOG 存在於磁碟上

存檔日誌檔名 =E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_3_93F18M64_.LOG

=1 序列 =3

介質恢復完成, 用時: 00:00:02

完成 recover 13-11-13

RMAN> alter database open resetlogs;    --resetlogs開啟

資料庫已開啟

三、Redo Log File損壞

1Current Online Redo損壞

這種情況在之前的文章中介紹過:

http://space.itpub.net/25744374/viewspace-776419/

這裡再寫一下步驟:

1)、如果有歸檔和備份,可以用不完全恢復

SQL> startup mount;

SQL> recover database until cancel;先選擇auto,儘量恢復可以利用的歸檔日誌,然後重新執行:

SQL> recover database until cancel;這次輸入cancel,完成不完全恢復,用resetlogs開啟資料庫:

SQL> alter database open resetlogs;

2)、強制恢復,這種方法可能會導致資料不一致

SQL> startup mount;

SQL> alter system set “_allow_resetlogs_corruption”=true scope=spfile;

SQL> recover database until cancel;

SQL> alter database open resetlogs;

由於使用該方式開啟會造成資料的丟失,且資料庫的狀態不一致,因此,這種情況下oracle建議通過exp方式匯出資料庫,重建新資料庫後,再匯入。

2、非Current損壞

這種情況下的恢復比較簡單,因為redo log是已經完成歸檔或者正在歸檔,沒有正在使用,可以通過v$log檢視redo log的狀態。

1)、如果statusinactive,則表示已經完成了歸檔,直接清除掉這個redo log即可。

SQL> startup mount;

SQL> alter database clear logfile group 3;

SQL> alter database open;

測試:

SQL> select group#,sequence#,bytes,members,archived,status from v$log;

    GROUP#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

         1          2   52428800          2 YES ACTIVE

         2          3   52428800          2 NO  CURRENT

         3          1   52428800          2 YES INACTIVE

--當前INACTIVE狀態的redogroup3

SQL> shutdown immediate;  --關閉資料庫,手工修改破壞group3日誌

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup                    --資料庫啟動報錯

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             352325184 bytes

Database Buffers           16777216 bytes

Redo Buffers                7094272 bytes

Database mounted.

ORA-00313: open failed for members of log group 3 of thread 1

ORA-00312: online log 3 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\ONLINELOG\O1_MF_3_93F18LGH_

.LOG'

ORA-00312: online log 3 thread 1: 'E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF

_3_93F18M64_.LOG'

--根據提示的錯誤,可以看出是group 3日誌的問題,檢視一下:

SQL> select group#,sequence#,bytes,members,archived,status from v$log;

    GROUP#  SEQUENCE#      BYTES    MEMBERS ARC STATUS

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

         1          2   52428800          2 YES INACTIVE

         3          1   52428800          2 YES INACTIVE

         2          3   52428800          2 NO  CURRENT

SQL> alter database clear logfile group 3;

Database altered.          --清除日誌組3

SQL> alter database open;       --開啟資料庫

Database altered.

2)、如果statusACTIVE狀態,表示正在歸檔,此時需要使用如下語句:

SQL> startup mount;

SQL> alter database clear unarchived logfile group 3;

SQL> alter database open;

四、非系統表空間損壞

若出現介質故障導致某表空間不可用,恢復可以在資料庫處於openmount狀態下進行,步驟如下:

1.將該表空間至於offline狀態;

2.修復表空間資料;

3.恢復表空間並處於一致性;

4.將表空間online.

RMAN> sql ‘alter tablespace ts1 offline’;

如果檔案不存在,就加immediate引數:

RMAN> sql ‘alter tablespace ts1 offline immediate’;

RMAN> restore tablespace ts1;

RMAN> recover tablespace ts1;

RMAN> sql ‘alter tablespace ts1 online’;

五、資料檔案損壞

如果出現介質故障導致某表空間資料檔案丟失(這種情況也可以參照表空間損壞的恢復),恢復可以在資料庫處於openmount狀態下進行:步驟如下:

1.將資料檔案置於offline狀態;

2.修復資料檔案(指定資料檔案編號);

3.修復資料檔案;

4.將資料檔案online.

RMAN> sql ‘alter datafile 5 offline’;

RMAN> restore datafile 5;

RMAN> recover datafile 5;

RMAN> sql ‘alter datafile 5 online’;

測試:

SQL> startup

ORACLE instance started.

Total System Global Area  377487360 bytes

Fixed Size                  1290688 bytes

Variable Size             352325184 bytes

Database Buffers           16777216 bytes

Redo Buffers                7094272 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 5 - see DBWR trace file

ORA-01110: data file 5: 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\TS01.DBF'

--手工修改了表空間ts1的資料檔案,資料庫開啟時報錯

RMAN> restore datafile 5;        --restore資料檔案

啟動 restore 13-11-13

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=155 devtype=DISK

通道 ORA_DISK_1: 正在開始恢復資料檔案備份集

通道 ORA_DISK_1: 正在指定從備份集恢復的資料檔案

正將資料檔案00005恢復到E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\DATAFILE\TS01.DBF

通道 ORA_DISK_1: 正在讀取備份段 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_

13\O1_MF_NNNDF_TAG20131113T134432_9864G11O_.BKP

通道 ORA_DISK_1: 已恢復備份段 1

段控制程式碼 = E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\BACKUPSET\2013_11_13\O1_MF_NNNDF_TAG20131

113T134432_9864G11O_.BKP 標記 = TAG20131113T134432

通道 ORA_DISK_1: 恢復完成, 用時: 00:00:05

完成 restore 13-11-13

RMAN> recover datafile 5;       --recover資料檔案

啟動 recover 13-11-13

使用通道 ORA_DISK_1

正在開始介質的恢復

介質恢復完成, 用時: 00:00:03

完成 recover 13-11-13

SQL> alter database open;         --啟動資料庫

Database altered.

六、基於時間點/SCN/日誌序列的不完全恢

基於時間點/SCN/日誌序列的不完全恢復,可以將資料庫、表空間、資料檔案等恢復至恢復備份集儲存時間點中的任何一個時間點/SCN/日誌序列,但須謹慎,操作前一定需要做好備份,具備條件的情況下最好先恢復到異機。

1、基於時間點

run{

      set until time “to_date(‘11/13/13 13:00:00’,’mm/dd/yy hh24:mi:ss’)”;

      restore database;

      recover database;

      alter database open resetlogs;

    }

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

SQL> startup nomount;

SQL> alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’;

SQL> recover database until time ‘2013-11-13 13:10:00’;

SQL> alter database open resetlogs;

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

SQL> startup mount;

SQL> recover database until time “to_date(‘2013-11-13 13:10:00’,’YYYY-MM-DD HH24:MI:SS’)”;

SQL> alter database open resetlogs;

2、基於SCN

RMAN> startup mount;

RMAN> restore database until scn 10000;

RMAN> recover database until scn 10000;

RMAN> alter database open resetlogs;

3、基於日誌序列

RMAN> startup mount;

RMAN> restore database until SEQUENCE 100 thread 1;

      //100是日誌序列

RMAN> recover database until SEQUENCE 100 thread 1;

RMAN> alter database open resetlogs;

七、catalog下完全恢復

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

RMAN> alter database mount;

RMAN> restore database;

RMAN> recover database;

RMAN> alter database open resetlogs;

測試:

--刪除全部資料檔案、控制檔案

C:\Users\Administrator>rman target /

恢復管理器: Release 10.2.0.3.0 - Production on 星期三 11 13 16:46:40 2013

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

已連線到目標資料庫 (未啟動)

RMAN> startup nomount;

Oracle 例項已啟動

系統全域性區域總計     377487360 位元組

Fixed Size                     1290688 位元組

Variable Size                352325184 位元組

Database Buffers              16777216 位元組

Redo Buffers                   7094272 位元組

--restore控制檔案

RMAN> restore controlfile from 'E:\oracle\product\10.2.0\flash_recovery_area\ORCL\BACKUPSET\2013_11_

13\O1_MF_NCSNF_TAG20131113T163801_986GN47H_.BKP';

啟動 restore 13-11-13

使用目標資料庫控制檔案替代恢復目錄

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: sid=157 devtype=DISK

通道 ORA_DISK_1: 正在復原控制檔案

通道 ORA_DISK_1: 恢復完成, 用時: 00:00:01

輸出檔名=E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\CONTROLFILE\O1_MF_986H53FG_.CTL

輸出檔名=E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\CONTROLFILE\O1_MF_986H53RV_.CTL

完成 restore 13-11-13

RMAN> alter database mount;       --mount資料庫

資料庫已裝載

釋放的通道: ORA_DISK_1

RMAN> recover database;           --恢復資料庫

啟動 recover 13-11-13

使用通道 ORA_DISK_1

正在開始介質的恢復

存檔日誌執行緒 1 序列 1 已作為檔案 E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1

_93F18H07_.LOG 存在於磁碟上

存檔日誌檔名 =E:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\ORCL\ONLINELOG\O1_MF_1_93F18H07_.LOG

=1 序列 =1

介質恢復完成, 用時: 00:00:03

完成 recover 13-11-13

RMAN> alter database open resetlogs;

資料庫已開啟

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

相關文章