Oracle 不同故障的恢复方案
?
?????? 之前在Blog中對RMAN 的備份和恢復做了說明,剛看了下,在恢復這塊還有知識點遺漏了。 而且恢復這塊很重要,如果DB 真要出了什么問題,就要掌握對應的恢復方法。 所以把DB的恢復這塊單獨拿出來說明一下。
?
RMAN 備份與恢復 實例
http://blog.csdn.net/tianlesoftware/archive/2009/10/19/4699320.aspx
?
如何搭建一個數據庫服務器平臺
http://blog.csdn.net/tianlesoftware/archive/2010/05/17/5602291.aspx
?
如何 搭建 RMAN 備份平臺
http://blog.csdn.net/tianlesoftware/archive/2010/07/16/5740896.aspx
?
?
?
在非Catalog模式下, 備份的信息存儲在controlfile中。 所以在RMAN 備份的時候,別忘了備份控制文件。
?
1. ?SPFILE丟失
startup nomount;
set dbid 3988862108;
restore spfile from autobackup;
或者通過某個文件
restore spfile from 'path/file_name'
shutdown immediate;
set dbid 3988862108;
startup;
?
2. Controlfile全部丟失
?
?????? 控制文件做了3個冗余,很少會發生全部丟失的情況,當遇到控制文件所有都丟失,恢復需要以下步驟:
?
RMAN>set dbid 3988862108;
RMAN>startup nomount;
RMAN>restore controlfile from autobackup;
或者從文件恢復
RMAN>restore controlfile from 'file_name';
RMAN>alter database mount;
RMAN>recover database; (保證數據一致,因為控制文件里scn發生改變)
RMAN>alter database open resetlogs;
?
resetlogs命令表示一個數據庫邏輯生存期的結束和另一個數據庫邏輯生存期的開始,每次使用resetlogs命令的時候,SCN不會被重置,不過oracle會重置日志序列號,而且會重置聯機重做日志內容. 這樣做是為了防止不完全恢復后日志序列會發生沖突(因為現有日志和數據文件間有了時間差)。
?
?
3. ?Redo Log File損壞
?????? 重做日志文件在數據庫中是要求最高的組件,首先其對磁盤的IO要求極高,其次一旦CURRENT組發生故障,數據庫會立即崩潰,并且100%會發生數據丟失,所以ORACLE建議至少每個組需要兩個成員,并且在數據庫運行過程中日志文件會一直被鎖定,以防不測。
?
Redo log的恢復分為兩種:CURRENT 和 非CURRENT
?
3.1 ?CURRENT 情況
造成redo 損壞,很多情況是與突然斷電有關。這種情況下是比較麻煩的。
?
(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;
?
?????? 運氣好的話,數據庫能正常打開,但是由于使用_allow_resetlogs_corruption方式打開,會造成數據的丟失,且數據庫的狀態不一致。因此,這種情況下Oracle建議通過EXP方式導出數據庫。重建新數據庫后,再導入。
?
redo 的損壞,一般還容易伴隨以下2種錯誤:ORA-600[2662](SCN有關)和 ORA-600[4000](回滾段有關)。
?
metalink上的兩篇文章介紹了兩種情況的處理方法:
TECH: Summary For Forcing The Database Open With `_ALLOW_RESETLOGS_CORRUPTION` with Automatic Undo Management [ID 283945.1]
http://blog.csdn.net/tianlesoftware/archive/2010/12/29/6106083.aspx
?
ORA-600 [2662] Block SCN is ahead of Current SCN [ID 28929.1]
http://blog.csdn.net/tianlesoftware/archive/2010/12/29/6106130.aspx
?
這兩種情況下的恢復有點復雜,回頭單獨做個測試,在補充進來。
?
?
3.2? 非CURRENT 情況
?????? 這種情況下的恢復比較簡單,因為redo log 是已經完成歸檔或者正在歸檔。 沒有正在使用。可以通過v$log 查看redo log 的狀態。
?
(1)如果STATUS是INACTIVE,則表示已經完成了歸檔,直接清除掉這個redo log即可。
?
SQL>startup mount;
SQL> alter database clear logfile group 3 ;
SQL>alter database open;
?
(2)如果STATUS 是ACTIVE ,表示正在歸檔, 此時需要使用如下語句:
SQL>startup mount;
SQL> alter database clear unarchived logfile group 3 ;
SQL>alter database open;
?
?
4. 非系統表空間損壞
????? 若出現介質故障導致某表空間不可用,恢復可以在數據庫處于 open 或 mount 狀態下進行,步驟如下:
1.??????? 將該表空間置于offline狀態
2.??????? 修復表空間數據
3.??????? 恢復表空間并處于一致性
4.??????? 將表空間online
?
rman> sql 'alter tablespace dave offline';
如果文件不存在,就加immediate參數
rman> sql 'alter tablespace dave offline immediate';
rman>restore tablespace dave;
rman>recovery tablespace dave;
rman>sql 'alter tablespace dave online';
?
?
5. 數據文件損壞
?????? 如果出現介質故障導致某表空間數據文件丟失(這種情況也可以參照表空間損壞的恢復)。
恢復可以在 數據庫處于 open 或 mount 狀態下進行,只需4個步驟
1.??????? 將該數據文件置于 offline 狀態
2.??????? 修復數據文件(指定數據文件編號)
3.??????? 恢復數據文件
4.??????? 將數據文件 online
?
rman> sql 'alter datafile 8 offline ';
rman>restore datafile 8;
rman>recovery datafile 8;
rman>sql 'alter datafile 8 online';
?
?
6. 基于時間點/SCN/日志序列的不完全恢復?
?????? 基于時間點/SCN/日志序列的不完全恢復,可以將數據庫、表空間、數據文件等恢復至恢復備份集保存時間中的任何一個時間點/SCN/日志序列,但須謹慎,操作前一定需要做好備份,具備條件的情況下最好先恢復到異機。
?
6.1 基于時間點
run{
? set until time "to_date(12/29/10 23: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 '2010-12-29 23:19:00';
SQL>ALTER DATABASE OPEN RESETLOGS;
?
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SQL>startup mount;
SQL>restore database until time "to_date('2010-12-29 23:19:00','YYYY-MM-DD HH24:MI:SS')";
SQL>recover database until time "to_date('2010-12-29 23:19:00','YYYY-MM-DD HH24:MI:SS')";
SQL>alter database open resetlogs;
?
?
6.2 基于 SCN:
SQL>startup mount;
SQL>restore database until scn 10000;
SQL>recover database until scn 10000;
SQL>alter database open resetlogs;
?
6.3 基于日志序列
SQL>startup mount;
SQL>restore database until SEQUENCE 100 thread 1; //100是日志序列
SQL>recover database until SEQUENCE 100 thread 1;
SQL>alter database open resetlogs;
?
日志序列查看命令:
SQL>select sequence from v$log;
resetlogs就會把sequence 置為1
?
?
7. 非catalog下完全恢復
SQL>startup nomount;
SQL>restore controlfile from autobackup;
SQL>alter database mount;
SQL>restore database;
SQL>recover database;
SQL>alter database open resetlogs;
?
示例:
oracle ora10g> rm *;
oracle ora10g> ls;
oracle ora10g>? //數據文件,控制文件全部刪除
?
oracle ora10g> rman target /; //因為controlfile 丟失,不能夠連接到rman
oracle ora10g> sqlplus /nolog;
oracle ora10g> connect / as sysdba;
oracle ora10g> shutdown abort;
oracle ora10g> rman target /
?
rman> startup nomount;
rman> restore controlfile from autabackup;
rman> alter database mount;
rman> restore database;
rman> recover database; //online redolog 不存在
?
SQL>recover database until cancel; //當redo log丟失,數據庫在缺省的方式下,是不容許進行recover操作的,那么如何在這種情況下操作呢
SQL>create pfile from spfile;
?
vi /u01/product/10.20/dbs/initora10g.ora,在這個文件的最后一行添加
*.allow_resetlogs_corruption='TRUE'; //容許resetlog corruption
?
SQL>shutdown immediate;
SQL>startup pfile='/u01/product/10.20/dbs/initora10g.ora' mount;
SQL>alter database open resetlogs;
?
?
?
?
?
?
?
------------------------------------------------------------------------------
Blog: http://blog.csdn.net/tianlesoftware
網上資源: http://tianlesoftware.download.csdn.net
相關視頻:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
DBA1 群:62697716(滿); DBA2 群:62697977(滿)
DBA3 群:62697850?? DBA 超級群:63306533;????
聊天 群:40132017
--加群需要在備注說明Oracle表空間和數據文件的關系,否則拒絕申請
轉載于:https://www.cnblogs.com/hibernate315/archive/2010/12/30/2399119.html
總結
以上是生活随笔為你收集整理的Oracle 不同故障的恢复方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文章标题注释
- 下一篇: 二本院校学生的命运,是中国最基本的底色