oracle數據庫恢復系列之控制文件恢復

一、不同場景控制文件損壞時的恢復方法

場景

恢復方法

恢復條件

其中一個控制文件損壞

1.1 拷貝冗餘的控制文件

1、具有多路冗餘控制文件鏡像
 2、其它冗餘控制文件沒有損壞

1.2 修改control_files參數去除損壞文件

同上、但不推薦該方法進行恢復

所有的控制文件損壞

有備份

2.1 通過rman備份控制文件進行完全恢復

1、通過rman備份了控制文件
 2、備份了控制文件之後有連續的歸檔和redo文件

2.2 通過rman備份控制文件進行不完全恢復

1、通過rman備份了控制文件
 2、備份了控制文件之後歸檔或redo文件丟失

2.3 通過trace備份控制文件進行完全恢復

1、通過trace備份了控制文件
 2、備份了控制文件之後有連續的歸檔和redo文件

2.4 通過trace備份控制文件進行不完全恢復

1、通過trace備份了控制文件
 2、備份了控制文件之後歸檔或redo文件丟失

無備份

2.5 通過手工重建控制文件進行恢復(noresetlogs)

1、無有效的備份控制文件
 2、redo文件無丟失和無損壞

2.6 通過手工重建控制文件進行恢復(resetlogs)

1、無有效的備份控制文件
 2、redo文件丟失或損壞

2.7 通過SNAPSHOT CONTROLFILE文件進行恢復

此處爲記錄一個恢復控制文件的方法(不常使用)

二、不同場景控制文件損壞的恢復思路及演示

2.1 其中一個控制文件損壞恢復思路

A. shutdown abort 關閉數據庫(控制文件損壞後不能正常關閉數據庫,只能使用abort強制關閉)

B. 拷貝其中一個完好的控制文件(推薦)或者修改control_files參數去除損壞文件(不推薦)

C. startup啓動數據庫

 

2.2 其中一個控制文件損壞恢復演示

SQL> show parameter control_files
 
NAME                                        TYPE                    VALUE
---------------------------------------------------------- ------------------------------
control_files                           string                   /u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
                                                                             data/racdg/control02.ctl
SQL> !mv/u/app/oracle/oradata/racdg/control02.ctl /u/app/oracle/oradata/racdg/control02.ctl.bak
 
SQL> shutdown immediate;  --無正常關閉數據庫,需要abort強制關閉
ORA-00210: cannot open the specifiedcontrol file
ORA-00202: control file:'/u/app/oracle/oradata/racdg/control02.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
SQL> shutdown abort;  --只能shutdown abort強制關閉
ORACLE instance shut down.
SQL> startup;  --啓動數據庫
ORACLE instance started.
ORA-00205: error in identifying controlfile, check alert log for more info  --啓動報錯,找不到指定的控制文件,在告警日誌文件alert_sid.log中可以看到如下報錯:
ORA-00210: cannot open the specifiedcontrol file
ORA-00202: control file:'/u/app/oracle/oradata/racdg/control02.ctl'
 
SQL> !pwd 
/u/app/oracle/oradata/racdg
 
SQL> !cp control01.ctl control02.ctl  
 
--或者:
SQL>alter system set control_files=’ /u/app/oracle/oradata/racdg/control01.ctl’scope=both; --不建議,因爲這樣一來就只剩一份控制文件了,起不到冗餘作用,再此次發生丟失,恢復就變得麻煩了。
 
SQL> alter database mount;
 
Database altered.


使用ASM存放控制文件,其中一個控制文件損壞恢復演示

SQL> show parameter control_files;
NAME                                        TYPE       VALUE
----------------------------------------------- ------------------------------
control_files                           string     +DATA/racdb/controlfile/current.256.935676497, +DATA/racdb/c
                                                                 ontrolfile/current.478.957977179
 
SQL> shutdown abort;  --這裏我是爲了演示才直接關閉數據的,因爲在線情況下asm的文件是不能刪除的
ORACLE instance shut down.
 
SQL> !su - grid -c "asmcmd -p rm +DATA/racdb/controlfile/current.478.957977179"
Password: 
 
SQL> startup nomount;  --將數據庫啓動到nomount狀態
ORACLE instance started.
 
SQL> !rman target /  --這裏使用rman來恢復,當然使用之前的兩種方法拷貝和去除也是可以的
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sat Oct 21 16:53:15 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDB (notmounted)
 
RMAN> restore controlfile from'+DATA/racdb/controlfile/current.256.935676497';  --其實這裏就是拷貝的方式
 
Starting restore at 2017/10/21 16:54:18
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=143 instance=racdb1device type=DISK
 
channel ORA_DISK_1: copied control filecopy
output filename=+DATA/racdb/controlfile/current.256.935676497
output filename=+DATA/racdb/controlfile/current.478.957977659
Finished restore at 2017/10/21 16:54:22
 
RMAN> sql 'alter database mount';
 
sql statement: alter database mount
released channel: ORA_DISK_1

說明一下,這裏我分了文件系統和ASM存儲存放控制文件的情況,其恢復原理都是一樣的,無論是在線或者關閉數據庫後損壞了其中部分控制文件,恢復方法都是一樣的。

 

2.3所有的控制文件損壞,有備份場景

2.3.1通過rman備份控制文件進行完全恢復思路

A. 若在線損壞,shutdown abort關閉數據庫;若關閉數據庫後損壞,到第二步

B. startup nomount啓動數據庫到nomount狀態。

C. 使用rman從備份中恢復控制文件:restorecontrolfile from '/path';

D. alter database mount;啓動數據庫到mount狀態

E. recover database using backupcontrolfile until cancel; 應用歸檔文件

F. 再執行recover databaseusing backup controlfile; 應用未歸檔的redo文件

G. alter database open resetlogs; resetlogs的方式打開數據庫

 

2.3.2通過rman備份控制文件進行完全恢復演示

SQL> show parameter control_files;
NAME                                        TYPE                    VALUE
---------------------------------------------------------- ------------------------------
control_files                           string                   /u/app/oracle/oradata/racdg/control01.ctl,/u/app/oracle/ora
data/racdg/control02.ctl, /u/app/oracle/oradata/racdg/control03
.ctl
SQL> !rm control01.ctl control02.ctlcontrol03.ctl  --刪除所有的控制文件,模擬控制文件丟失
 
SQL> shutdown abort; --強制關閉數據庫
ORACLE instance shut down.
SQL> startup;      --啓動數據到nomount狀態
ORACLE instance started.
 
ORA-00205: error in identifying controlfile, check alert log for more info  --報錯,同時查看告警日誌,會發現所有控制文件都已經丟失。
 
SQL> !rman target /   --此前有做過RMAN控制文件備份,使用rman進行恢復
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sat Oct 21 17:24:11 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDG (notmounted)
 
RMAN> restore controlfile from'/u/app/oracle/zwdir/RACDG_20171021_0fshj32i_1_1.ctl'; --恢復控制文件
 
Starting restore at 2017/10/21 17:24:57
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=135 devicetype=DISK
 
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,elapsed time: 00:00:03
output filename=/u/app/oracle/oradata/racdg/control01.ctl
output filename=/u/app/oracle/oradata/racdg/control02.ctl
output filename=/u/app/oracle/oradata/racdg/control03.ctl
Finished restore at 2017/10/21 17:25:01
 
RMAN> sql 'alter database mount';  --將數據庫啓動到mount狀態
 
sql statement: alter database mount
released channel: ORA_DISK_1
 
RMAN> exit
 
Recovery Manager complete.
 
SQL> recover database using backupcontrolfile until cancel; 
ORA-00279: change 1041001 generated at10/21/2017 16:04:25 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_6_957480185.dbf
ORA-00280: change 1041001 for thread 1 isin sequence #6
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
auto
ORA-00279: change 1041011 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_7_957480185.dbf
ORA-00280: change 1041011 for thread 1 isin sequence #7
ORA-00278: log file'/u/app/oracle/oradata/arch/1_6_957480185.dbf' no longer needed for thisrecovery
 
ORA-00279: change 1041019 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion : /u/app/oracle/oradata/arch/1_8_957480185.dbf
ORA-00280: change 1041019 for thread 1 isin sequence #8
ORA-00278: log file'/u/app/oracle/oradata/arch/1_7_957480185.dbf' no longer needed for thisrecovery
 
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_8_957480185.dbf'
ORA-27037: unable to obtain file status  --缺少序號爲8的歸檔,這是因爲redo還存在歸檔未切換
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
 
ORA-01547: warning: RECOVER succeeded butOPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to beconsistent
ORA-01110: data file 1:'/u/app/oracle/oradata/racdg/system01.dbf'
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
GROUP# SEQUENCE# ARCHIV STATUS                     MEMBER
---------- ---------- ------------------------------------------------------------------------------------------------
          1         4 YES   INACTIVE     /u/app/oracle/oradata/racdg/redo01.log
          3         6NO     CURRENT      /u/app/oracle/oradata/racdg/redo03.log  --當前未歸檔的redo文件
          2         5 YES   INACTIVE     /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile;  --再次執行,應用未歸檔的redo文件
ORA-00279: change 1041019 generated at10/21/2017 16:20:36 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_8_957480185.dbf
ORA-00280: change 1041019 for thread 1 isin sequence #8  --這裏看到未歸檔的redo文件,歸檔序號爲6,而這裏需要恢復序列爲8的歸檔,所以應該是應用/u/app/oracle/oradata/racdg/redo02.log這個redo文件。
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo02.log
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs;   --以resetlogs的方式打開數據庫
 
Database altered.

resetlogsnoresetlogs的區別說明:

norestlogs控制文件的scn是來自當前日誌的highscn,而resetlogs控制文件的scn是來自數據文件。

noresetlogs會繼續使用已經存在,且有效的logfiles,而resetlogs會初始化logs,重置log sequence號,創建一個新的incarnation

 

2.3.3通過rman備份控制文件進行不完全恢復思路

A. 若在線損壞,shutdown abort關閉數據庫;若關閉數據庫後損壞,到第二步

B. startup nomount啓動數據庫到nomount狀態。

C. 使用rman從備份中恢復控制文件:restorecontrolfile from '/path';

D. alter database mount;啓動數據庫到mount狀態

E. recover database using backupcontrolfile until cancel; 應用儘可能多的歸檔文件

 

G. 若丟失redo文件:

shutdown immediate並啓動到startupnomount狀態

alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成創建控制文件的腳本

使用resetlogs方式創建控制文件

若未歸檔的redo文件可用:直接recover database,選用未歸檔的redo應用,alter database open resetlogs方式打開數據庫

若未歸檔的redo文件不可用:設置隱含參數_allow_resetlogs_corruption=true跳過一致性檢查,alterdatabase open resetlogs方式打開數據庫

 

F. 若丟失歸檔文件:

shutdown immediate並啓動到startupnomount狀態

alter database backup controlfile to traceas ‘/u/app/oracle/zwdir/controlfile.sql’; 生成創建控制文件的腳本

使用noresetlogs方式創建控制文件

recover database using backup controlfileuntil cancel; 應用redo文件

alter database open resetlogs; resetlogs的方式打開數據庫

若備份控制文件之後,數據庫結構發生了變化,如新增了表空間或數據文件,需要進行不完全恢復

 

2.3.4通過rman備份控制文件進行不完全恢復演示

這裏模擬演示模擬備份控制文件之後,新增表空間,歸檔文件全部丟失的不完全恢復的情況,丟失redo的情況,請看下一節“oracle數據庫恢復系列之redo文件恢復”

 [oracle@iscsi-asmzwdir]$ rman target /
 
RMAN> backup current controlfile format'/u/app/oracle/zwdir/use_this_%U.ctl' tag='ctl';  --備份當前的控制文件
 
Starting backup at 2017/10/29 17:03:31
using target database control file insteadof recovery catalog
piecehandle=/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl tag=CTL comment=NONE
channel ORA_DISK_1: backup set complete,elapsed time: 00:00:01
Finished backup at 2017/10/29 17:03:33
 
[oracle@iscsi-asm racdg]$ sqlplus / assysdba
 
SQL> create tablespace t_del_archdatafile '/u/app/oracle/oradata/racdg/t_del_arch01.dbf' size 20m; --新增表空間
 
Tablespace created.
 
SQL> create user t_arch identified bypassword default tablespace t_del_arch; --新建用戶
 
User created.
 
SQL> grant resource,connect to t_arch;  --授權
 
Grant succeeded.
 
SQL> alter system switch logfile; --切換歸檔日誌
 
System altered.
 
SQL> create table t_arch.t1 as select *from dba_objects where rownum<1000; --新建表,並插入數據
 
Table created.
 
SQL> alter system switch logfile; --切換歸檔日誌
 
System altered.
 
SQL> select count(*) from t_arch.t1;
 
 COUNT(*)
----------
      999
 
SQL> insert into t_arch.t1 select * fromt_arch.t1; --新增數據
 
999 rows created.
 
SQL> commit;
 
Commit complete.
 
SQL> alter system switch logfile; --切換日誌
 
System altered.
 
SQL> select count(*) from t_arch.t1; --記錄當前的數據,用作恢復的數據對比
 
 COUNT(*)
----------
     1998
 
SQL> archive log list;   --當前歸檔的序號
Database log mode       Archive Mode
Automatic archival         Enabled
Archive destination      /u/app/oracle/oradata/arch
Oldest online log sequence     5
Next log sequence to archive   7
Current log sequence             7
 
SQL> shutdown abort;  --關閉數據庫
ORACLE instance shut down.
SQL> !rm control01.ctl control02.ctl  --模擬控制文件丟失
 
SQL> !mv/u/app/oracle/oradata/arch/*.dbf /u/app/oracle/oradata/arch/tmp  --模擬歸檔文件全部丟失
 
SQL> startup nomount;
ORACLE instance started.
 
SQL> !rman target /
 
Recovery Manager: Release 11.2.0.4.0 -Production on Sun Oct 29 17:19:33 2017
 
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates.  All rights reserved.
 
connected to target database: RACDG (notmounted)
 
RMAN> restore controlfile from'/u/app/oracle/zwdir/use_this_08si88j3_1_1.ctl'; --通過舊備份控制文件進行恢復
 
Starting restore at 2017/10/29 17:19:44
using target database control file insteadof recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=10 device type=DISK
channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,elapsed time: 00:00:01
output filename=/u/app/oracle/oradata/racdg/control01.ctl
output filename=/u/app/oracle/oradata/racdg/control02.ctl
Finished restore at 2017/10/29 17:19:46
 
RMAN> exit
 
Recovery Manager complete.
 
SQL> alter database mount;
 
Database altered.
 
SQL> alter database backup controlfileto trace as '/u/app/oracle/zwdir/controlfile.sql';
 
Database altered. --此時歸檔文件已經丟失了,無法通過應用歸檔文件進行恢復,所以通過trc新建控制文件的方式進行恢復。
 
SQL> shutdown abort; --關閉數據庫
ORACLE instance shut down.
SQL> STARTUP NOMOUNT --啓動到nomount狀態
ORACLE instance started.
 
SQL> CREATE CONTROLFILE REUSE DATABASE"RACDG" NORESETLOGS  ARCHIVELOG
   MAXLOGFILES 16
   MAXLOGMEMBERS 3
   MAXDATAFILES 100
   MAXINSTANCES 8
   MAXLOGHISTORY 292
LOGFILE
 GROUP 1 '/u/app/oracle/oradata/racdg/redo01.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 2 '/u/app/oracle/oradata/racdg/redo02.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 3 '/u/app/oracle/oradata/racdg/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
 '/u/app/oracle/oradata/racdg/system01.dbf',
 '/u/app/oracle/oradata/racdg/sysaux01.dbf',
 '/u/app/oracle/oradata/racdg/undotbs01.dbf',
 '/u/app/oracle/oradata/racdg/users01.dbf'
CHARACTER SET WE8MSWIN1252
;
 
--以上新建控制文件的內容就是通過/u/app/oracle/zwdir/controlfile.sql裏面的記錄來進行新建的,裏面共有兩種方式,一種是noresetlogs,另一種是resetlogs的方式。這裏因爲redo文件是沒有丟失的,所以使用nosesetlogs的方式。
 
Control file created.
 
SQL> selectb.sequence#,a.member,b.status from v$logfile a, v$log b wherea.group#=b.group#; --查詢redo信息
 
 SEQUENCE# MEMBER                                         STATUS
------------------------------------------------------- --------------------------------
          7 /u/app/oracle/oradata/racdg/redo01.log CURRENT
          5 /u/app/oracle/oradata/racdg/redo02.log INACTIVE
          6 /u/app/oracle/oradata/racdg/redo03.log INACTIVE
 
SQL> select file#,name,status fromv$datafile;  --查詢數據文件信息,此時數據文件都是需要恢復
 
    FILE# NAME                                                 STATUS
------------------------------------------------------- --------------
          1 /u/app/oracle/oradata/racdg/system01.dbf      SYSTEM
          2 /u/app/oracle/oradata/racdg/sysaux01.dbf       RECOVER
          3 /u/app/oracle/oradata/racdg/undotbs01.dbf     RECOVER
          4 /u/app/oracle/oradata/racdg/users01.dbf          RECOVER
 
SQL> recover database using backupcontrolfile until cancel; --恢復數據庫,應用redo日誌
ORA-00279: change 932267 generated at10/29/2017 17:07:56 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_6_958668721.dbf
ORA-00280: change 932267 for thread 1 is insequence #6 
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo03.log
ORA-00279: change 932300 generated at10/29/2017 17:09:10 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_7_958668721.dbf
ORA-00280: change 932300 for thread 1 is insequence #7
ORA-00278: log file'/u/app/oracle/oradata/racdg/redo03.log' no longer needed for this recovery
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs; --以resetlogs的方式打開數據庫
 
Database altered.
 
SQL> select file#,name,status fromv$datafile;  --查看數據文件的狀態,備份控制文件之後的表空間對應的數據文件需要進一步恢復。
    FILE# NAME                                                         STATUS
-------------------------------------------------------------- --------------
          1 /u/app/oracle/oradata/racdg/system01.dbf               SYSTEM
          2 /u/app/oracle/oradata/racdg/sysaux01.dbf                ONLINE
          3 /u/app/oracle/oradata/racdg/undotbs01.dbf             ONLINE
          4 /u/app/oracle/oradata/racdg/users01.dbf                  ONLINE
          5/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005RECOVER
 
SQL> alter database datafile 5 offline;  --先將數據文件offline
 
Database altered.
 
SQL>alter database rename file'/u/app/oracle/product/11.2.0/db_1/dbs/MISSING00005' to'/u/app/oracle/oradata/racdg/t_del_arch01.dbf'; --重命名數據文件
 
Database altered.
 
SQL> alter tablespace t_del_arch online;  ---嘗試將表空間online,報錯
alter tablespace t_del_arch online
*
ERROR at line 1:
ORA-01190: control file or data file 5 isfrom before the last RESETLOGS
ORA-01110: data file 5: '/u/app/oracle/oradata/racdg/t_del_arch01.dbf'
 
SQL> alter system set"_allow_resetlogs_corruption"=true scope=spfile; --修改參數,忽略SCN一致性校驗
 
System altered.
 
SQL> startup force;  --再將數據庫重新啓動
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
Database opened.
 
SQL> selectts#,file#,name,status,checkpoint_change# from v$datafile;  --查詢數據文件的情況
 
      TS#     FILE# NAME                                              STATUS        CHECKPOINT_CHANGE#
---------- ---------- ----------------------------------------------------------- ------------------
          0         1 /u/app/oracle/oradata/racdg/system01.dbf           SYSTEM                    953040
          1         2 /u/app/oracle/oradata/racdg/sysaux01.dbf            ONLINE                    953040
          2         3 /u/app/oracle/oradata/racdg/undotbs01.dbf     ONLINE                        953040
          4         4 /u/app/oracle/oradata/racdg/users01.dbf     ONLINE                    953040
          6         5/u/app/oracle/oradata/racdg/t_del_arch01.dbf RECOVER                             0
 
SQL> alter session set events 'immediatetrace name adjust_scn level 1'; --通過設置adjust_scn使數據文件的CHECKPOINT_CHANGE#一致
 
Session altered.
 
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount; --啓動到mount狀態
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
SQL> recover until cancel; --恢復數據庫,注意這裏不是usingcontrolfile的方式
Media recovery complete.
 
SQL> alter database datafile 2,3,4,5online;  ---將所有的數據文件online,記得千萬不用漏了
 
Database altered.
 
SQL> alter database open resetlogs; --以resetlogs的方式打開數據庫
 
Database altered.
 
SQL> selectts#,file#,name,status,checkpoint_change# from v$datafile;   --查詢數據文件的情況
 
       TS#     FILE#NAME                                              STATUS        CHECKPOINT_CHANGE#
---------- ------------------------------------------------------- -------------- ------------------
          0         1 /u/app/oracle/oradata/racdg/system01.dbf           SYSTEM                    953040
          1         2 /u/app/oracle/oradata/racdg/sysaux01.dbf            ONLINE                    953040
          2         3/u/app/oracle/oradata/racdg/undotbs01.dbf    ONLINE                        953040
          4         4 /u/app/oracle/oradata/racdg/users01.dbf     ONLINE                    953040
          6         5 /u/app/oracle/oradata/racdg/t_del_arch01.dbf  ONLINE                               953040
 
SQL> select count(*) from t_arch.t1;  --對比數據,發現存在數據丟失,出現這種情況,只能把損失降到最小
 
 COUNT(*)
----------
      999
 
SQL> alter tablespace temp add tempfile'/u/app/oracle/oradata/racdg/temp01.dbf' reuse; --重建temp表空間
 
Database altered.


2.3.4通過trace備份控制文件進行完全恢復思路

A.備份控制文件到tracealterdatabase backup controlfile to trace as '/path/controlfile.sql';

B.若在線損壞,直接alterdatabase backup controlfile to 'file';之後重啓數據庫

C.若關閉數據庫後損壞,shutdownabort關閉數據庫後,startup nomount啓動數據庫到nomount狀態

D.使用備份到trace裏創建控制文件的語句,以noresetlogs方式創建控制文件

E.recover database恢復數據庫,恢復完後通過alterdatabase open打開數據庫

F.重建temp表空間:altertablespace temp add tempfile '/path/temp01.dbf' reuse;

 

2.3.5通過trace備份控制文件進行完全恢復演示

oracle數據庫提供了多種對控制文件的備份方式:rmanalterdatabase backup controlfile to tracealter databasebackup controlfile to filename 這裏只演示在線損壞時通過alter database backup controlfile to filename 的恢復,因爲通過trace備份的恢復演示在“2.3.4通過rman備份控制文件進行不完全恢復演示”章節已經寫了。

SQL> select open_mode from v$database;
 
OPEN_MODE
----------------------------------------
READ WRITE
 
SQL> !rm control01.ctl control02.ctl  --這種情況主要是數據庫還在運行狀態,手賤誤刪的恢復
 
SQL> alter database backup controlfileto '/u/app/oracle/oradata/racdg/control01.ctl.bak'; --備份成二進制文件
 
Database altered.
 
SQL> shutdown abort;
ORACLE instance shut down.
 
SQL> !cp control01.ctl.bak control01.ctl–直接拷貝使用
 
SQL> !cp control01.ctl.bak control02.ctl
 
SQL> startup mount;  --啓動到mount狀態
ORACLE instance started.
 
Total System Global Area  830930944 bytes
Fixed Size              2257800 bytes
Variable Size                536874104 bytes
Database Buffers      285212672 bytes
Redo Buffers                 6586368 bytes
Database mounted.
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
   GROUP#  SEQUENCE# ARCHIV STATUS             MEMBER
---------- ---------- --------------------- ----------------------------------------
          1         1 NO    CURRENT            /u/app/oracle/oradata/racdg/redo01.log
          3         0 YES   UNUSED       /u/app/oracle/oradata/racdg/redo03.log
          2         0 YES   UNUSED       /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile until cancel;
ORA-00279: change 932699 generated at10/31/2017 19:25:50 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_1_958850748.dbf
ORA-00280: change 932699 for thread 1 is insequence #1
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log  –應用redo文件
Log applied.
Media recovery complete.
 
SQL> alter database open resetlogs;  --以resetlogs的方式開啓數據庫
 
Database altered.


2.3.6通過trace備份控制文件進行不完全恢復思路

A.備份控制文件到tracealterdatabase backup controlfile to trace as '/path/controlfile.sql';

B.shutdown abort關閉數據庫後,startupnomount啓動數據庫到nomount狀態

C. 若丟失redo文件,歸檔未丟失:

使用備份到trace裏創建控制文件的語句,以resetlogs方式創建控制文件

alter database mount;啓動數據庫mount狀態

若未歸檔的redo文件可用:直接recover database,選用未歸檔的redo應用,alter database open resetlogs方式打開數據庫

若未歸檔的redo文件不可用:設置隱含參數_allow_resetlogs_corruption=true跳過一致性檢查,alterdatabase open resetlogs方式打開數據庫

D. 若丟失歸檔文件,redo未丟失:

使用備份到trace裏創建控制文件的語句,以resetlogs方式創建控制文件

alter database mount;啓動數據庫mount狀態

recover database using backup controlfileuntil cancel; 應用redo文件

alter database open resetlogs; resetlogs的方式打開數據庫

若備份控制文件之後,數據庫結構發生了變化,如新增了表空間或數據文件,需要進行不完全恢復

E. 若歸檔文件和redo文件都丟失:

步驟與若丟失歸檔文件,redo未丟失的恢復步驟一樣,主要是以resetlogs方式創建控制文件

F.重建temp表空間:altertablespace temp add tempfile '/path/temp01.dbf' reuse;

 

2.3.7通過trace備份控制文件進行不完全恢復演示

請參照“2.3.4通過rman備份控制文件進行不完全恢復演示”,主要注意以下幾點:

A.trace備份的控制文件並不是實時的備份,可能不是最新的,備份之後數據庫結構可能發生了變化

B.對於此類恢復一定需要謹慎,恢復完之後馬上做個全備,儘量將數據丟失降低到最小。

 

2.4所有的控制文件損壞,無備份場景

2.4.1通過手工重建控制文件進行恢復(noresetlogs)思路

A.shutdown abort關閉數據庫後,startupnomount啓動數據庫到nomount狀態

B.手工構造控制文件,以noresetlogs方式

C. alter database mount;啓動數據庫到mount狀態

D. recover database using backupcontrolfile until cancel; 應用歸檔文件

E. 再執行recover databaseusing backup controlfile; 應用未歸檔的redo文件

F. alter database open resetlogs; resetlogs的方式打開數據庫

 

2.4.2通過手工重建控制文件進行恢復(resetlogs)思路

A.shutdown abort關閉數據庫後,startupnomount啓動數據庫到nomount狀態

B.手工構造控制文件,以resetlogs方式

C. alter database mount;啓動數據庫到mount狀態

D. recover database using backupcontrolfile until cancel; 應用歸檔文件(不考慮歸檔文件丟失)

E. 再執行recover databaseusing backup controlfile; 應用未歸檔的redo文件(不考慮redo文件丟失)

F. alter database open resetlogs; resetlogs的方式打開數據庫

 

2.4.3通過手工重建控制文件進行恢復(resetlogs)演示

這裏不作非常具體的演示了,前面的章節已經演示過了,就說明一下需要注意的幾點:

  1. 因爲是手動構建,所以在構建的過程中一定要仔細檢查數據庫清除數據庫有多少文件,構建腳本如下:

CREATE CONTROLFILE REUSE DATABASE"RACDG" RESETLOGS  ARCHIVELOG
   MAXLOGFILES 16
   MAXLOGMEMBERS 3
   MAXDATAFILES 100
   MAXINSTANCES 8
   MAXLOGHISTORY 292
LOGFILE
 GROUP 1 '/u/app/oracle/oradata/racdg/redo01.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 2 '/u/app/oracle/oradata/racdg/redo02.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 3 '/u/app/oracle/oradata/racdg/redo03.log'  SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
 '/u/app/oracle/oradata/racdg/system01.dbf',
 '/u/app/oracle/oradata/racdg/sysaux01.dbf',
 '/u/app/oracle/oradata/racdg/undotbs01.dbf',
 '/u/app/oracle/oradata/racdg/users01.dbf',
 '/u/app/oracle/oradata/racdg/t_del_arch01.dbf'
CHARACTER SET WE8MSWIN1252;

一定要都存放文件的路徑下去ls –ltr列一下有哪些文件,千萬不要把某個文件漏了。

B. 手動構建控制文件是存在一定的數據丟失風險的,一定得細心,細心,再細心。

 

2.4.4通過SNAPSHOTCONTROLFILE文件進行恢復思路

A.shutdown abort關閉數據庫後,startupnomount啓動數據庫到nomount狀態

B.直接拷貝snapshot controlfilecontrol file或通過rman恢復:restore controlfile from '$ORACLE_HOME/dbs/[email protected]';

C. alter database mount;啓動數據庫到mount狀態

D. recover database using backupcontrolfile until cancel; 應用歸檔文件(不考慮歸檔文件丟失)

E. 再執行recover databaseusing backup controlfile; 應用未歸檔的redo文件(不考慮redo文件丟失)

F. alter database open resetlogs; resetlogs的方式打開數據庫

 

2.4.5通過SNAPSHOTCONTROLFILE文件進行恢復演示

 
RMAN> show snapshot controlfile name;  --查看快照控制文件配置
 
using target database control file insteadof recovery catalog
RMAN configuration parameters for databasewith db_unique_name RACDG are:
CONFIGURE SNAPSHOT CONTROLFILE NAME TO'/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f'; # default
--如果是RAC,一般建議將該配置文件配置在ASM或ACFS等共享存儲上。
 
SQL> !rm control01.ctl control02.ctl  --模擬控制文件丟失
 
SQL> shutdown abort;  --強制關閉數據庫
ORACLE instance shut down.
 
SQL> startup nomount; --啓動數據庫到mount狀態
ORACLE instance started.
 
SQL> !cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f control01.ctl --直接拷貝快照控制文件
 
SQL> !cp/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f control02.ctl
 
SQL> !ls -ltr control*.ctl
-rw-r----- 1 oracle oinstall 9748480Nov  1 18:48 control01.ctl
-rw-r----- 1 oracle oinstall 9748480Nov  1 18:48 control02.ctl
 
--或者使用RMAN進行恢復:restorecontrolfile from ‘/u/app/oracle/product/11.2.0/db_1/dbs/snapcf_racdg.f’;
 
SQL> alter database mount;  --啓動數據庫到mount狀態
 
Database altered.
 
SQL> recover database using backupcontrolfile until cancel;  --應該歸檔文件
ORA-00279: change 948557 generated at10/31/2017 22:00:44 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_2_958851405.dbf
ORA-00280: change 948557 for thread 1 is insequence #2
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
auto
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
 
ORA-00308: cannot open archived log'/u/app/oracle/oradata/arch/1_4_958851405.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file ordirectory
Additional information: 3
 
ORA-01547: warning: RECOVER succeeded butOPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to beconsistent
ORA-01110: data file 1:'/u/app/oracle/oradata/racdg/system01.dbf'
 
SQL> selecta.group#,a.sequence#,a.archived,a.status,b.member from v$log a,v$logfile bwhere a.group#=b.group#;
 
   GROUP#  SEQUENCE# ARCHIV STATUS                     MEMBER
---------- ---------- -------------------------- ------------------------------------------------
          1         1 YES   INACTIVE                    /u/app/oracle/oradata/racdg/redo01.log
          3         0 YES   UNUSED             /u/app/oracle/oradata/racdg/redo03.log
          2         2 NO    CURRENT                  /u/app/oracle/oradata/racdg/redo02.log
 
SQL> recover database using backupcontrolfile until cancel;  --應用redo文件
ORA-00279: change 948625 generated at11/01/2017 18:41:13 needed for thread 1
ORA-00289: suggestion :/u/app/oracle/oradata/arch/1_4_958851405.dbf
ORA-00280: change 948625 for thread 1 is insequence #4
 
Specify log: {<RET>=suggested |filename | AUTO | CANCEL}
/u/app/oracle/oradata/racdg/redo01.log
Log applied.
Media recovery complete.
SQL> alter database open resetlogs; --以resetlogs的方式開啓數據庫
 
Database altered.


 

總結:

1、從上可以說是涉及到各個場景控制文件的損壞恢復,相對是比較全面的,但生產環境下的恢復情況要比我們預想的複雜的多,應根據各種情況,儘量將損失降低到最小。

2、還有個在linux環境未關庫情況下,造成控制文件誤刪,可通過/proc進程號恢復,這邊就不做介紹了。

3、最後得強調一下,有效的備份重於一切,對生產環境存敬畏之心,千萬不要存僥倖心理,墨菲定律就在我們身邊。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章