【技術分享】Oracle控制檔案的備份、恢復以及多路複用
Oracle控制檔案的備份、恢復以及多路複用
前言
今天Frank給大家帶來有關Oracle控制檔案的技術分享。不積跬步無以至千里,不積小流無以成江海。Oracle技術博大精深,以Frank一個人的力量,那無異於蜉蝣於天地,滄海之一粟。在此,筆者拋磚引玉,希望讀者能夠與Frank形成良好的互動,之間共同進步。閒言少敘,書歸正傳,馬上開始今天的討論話題。
一、控制檔案概要描述
既然今天的主題是控制檔案,那麼首先Frank先帶大家來簡要回顧一下控制檔案的相關知識點。控制檔案在預設情況下,一般和資料檔案以及日誌檔案等位於同一個目錄(當然,不放在這裡也是沒有問題的……看個人喜好),具體檢視的sql語句是:
SYS@ENMOEDU > select name from v$controlfile;
NAME
------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
從這裡就已經清晰的看到我控制檔案的路徑以及名稱了,還有,細心的讀者應該發現了,Frank是一個很小心謹慎的人,所以呢,我的控制檔案是兩份。這樣做的好處是,萬一我其中的一個控制檔案被誤刪了或者損壞了,我還有另外一個控制檔案保證我資料庫的正常執行以及啟動(不小心把多路複用技術給提前引入了……稍後會有更詳細的配置以及解析)。
控制檔案的作用我想就毋庸贅言了吧?上至九十老嫗,下到五歲孩童,對於控制檔案的重要性都能如數家珍般的娓娓道來。控制檔案中有資料庫以及線上重做日誌的位置以及眾多重要的資訊,丟失或者損壞控制檔案,資料庫將無法正常啟動和執行。既然控制檔案這麼重要,那麼我們該怎麼對它進行備份和恢復呢?
二、控制檔案的備份與恢復
(1)基於使用者管理的備份和恢復
首先進入Oracle的trace目錄
[oracle@ENMOEDU trace]$ cd /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace
用tail命令來開啟alert_ENMOEDU.log文件
[oracle@ENMOEDU trace]$ tail -100f alert_ENMOEDU.log
此時開啟另一視窗,執行如下命令
SYS@ENMOEDU > alter database backup controlfile to trace;
Database altered.
我們可以在alert.ENMOEDU.log看到如下資訊
Mon Mar 10 15:22:20 2014
alter database backup controlfile to trace
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
Completed: alter database backup controlfile to trace
根據上述資訊,我們去檢視提示的檔案
[oracle@ENMOEDU ~]$ cat /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
在浩如煙海的資訊中,我們可以找到建立控制檔案的命令
CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
CHARACTER SET AL32UTF8;
稍後我們就可以用這些命令來建立控制檔案了。下面來模擬控制檔案丟失和損壞的實驗環境:
[root@ENMOEDU ~]# rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.ctl
[root@ENMOEDU ~]# rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
筆者將兩個控制檔案都刪除了,很徹底~然後嘗試啟動資料庫。
[oracle@ENMOEDU ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 15:47:54 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
ORA-00205: error in identifying control file, check alert log for more info
可以看出,資料庫已經無法正常啟動了。那麼我們就將資料庫啟動到nomount狀態下進行恢復。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
SYS@ENMOEDU > CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log' SIZE 50M BLOCKSIZE 512,
9 GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log' SIZE 50M BLOCKSIZE 512,
10 GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log' SIZE 50M BLOCKSIZE 512
11 -- STANDBY LOGFILE
12 DATAFILE
13 '/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
14 '/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
15 '/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
16 '/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
17 '/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
18 '/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
19 '/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
20 CHARACTER SET AL32UTF8;
Control file created.
嘗試開啟資料庫
SYS@ENMOEDU > alter database open
2 ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
提示錯誤。按照提示來開啟資料庫:
SYS@ENMOEDU > alter database open resetlogs;
Database altered.
資料庫已經正常啟動了。
上述情況屬於非常樂觀且極易恢復的模擬實驗現場,但是在實際情況中,環境卻險要惡劣的多。往往控制檔案丟失後,使用者還會進行大量的操作,比如建立表空間等等,這些使得控制檔案的恢復要困難許多。路漫漫其修遠兮,吾將上下而求索,Frank對待技術的渴望永無止境。下面我就給大家介紹一下如何在備份的控制檔案過久的情況下恢復控制檔案。
首先,我們先備份一下我們的控制檔案。由於Frank採用了多路複用,所以看起來是不是應該把兩個控制檔案都備份一下呢?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是否定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是不需要備份兩份。由於兩份控制檔案是一模一樣的,所以備份一份即可,只需記得在恢復的時候注意檔名字。
備份控制檔案。在本文中,將控制檔案備份到Oracle的家目錄下,給控制檔案一種家的溫暖。
[oracle@ENMOEDU ENMOEDU]$ cp control01.ctl ~
建立表空間和檔案,從而使現在的控制檔案和備份檔案產生差異。
SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01.dbf' size 100m;
Tablespace created.
檢視一下當前線上日誌的status,並切換日誌,產生歸檔。
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 ACTIVE
3 CURRENT
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 ACTIVE
3 ACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 ACTIVE
3 CURRENT
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 ACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 ACTIVE
3 CURRENT
檢視現在日誌和資料檔案的狀態:
SYS@ENMOEDU > select GROUP#,SEQUENCE#,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
GROUP# SEQUENCE# ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- --- ------------- ------------
1 112 YES 1382686 1382699
2 113 YES 1382699 1382705
3 114 NO 1382705 2.8147E+14
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1382686
2 1382686
3 1382686
4 1382686
5 1382686
6 1382686
7 1382686
8 1382686
8 rows selected.
刪除控制檔案:
rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;
關機,重啟,報錯,就以nomount的形式開啟資料庫:
SYS@ENMOEDU > shutdown abort;
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
ORA-00205: error in identifying control file, check alert log for more info
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
恢復控制檔案:
[oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/oradata/ENMOEDU/control01.ctl
[oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
將資料庫啟動到mount狀態:
SYS@ENMOEDU > alter database mount;
Database altered.
檢視一下當前檔案的狀態:
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1371719
2 1371719
3 1371719
4 1371719
5 1371719
6 1371719
7 1371719
8 1382338
8 rows selected.
SYS@ENMOEDU > select status from v$datafile;
STATUS
-------
SYSTEM
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
RECOVER
8 rows selected.
明顯看出來datafile 8的scn號跟其他的不一樣,因為它是在備份控制檔案之後建立的。
利用archivelog來恢復控制檔案:
SYS@ENMOEDU > recover database using backup controlfile;
ORA-00279: change 1382338 generated at 03/11/2014 20:23:02 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
ORA-00280: change 1382338 for thread 1 is in sequence #106
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
ORA-00279: change 1382640 generated at 03/11/2014 20:23:55 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
ORA-00280: change 1382640 for thread 1 is in sequence #107
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc' no longer needed for this recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
ORA-00279: change 1382655 generated at 03/11/2014 20:24:08 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
ORA-00280: change 1382655 for thread 1 is in sequence #108
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
ORA-00279: change 1382666 generated at 03/11/2014 20:24:28 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
ORA-00280: change 1382666 for thread 1 is in sequence #109
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
ORA-00279: change 1382673 generated at 03/11/2014 20:24:37 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
ORA-00280: change 1382673 for thread 1 is in sequence #110
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
ORA-00279: change 1382680 generated at 03/11/2014 20:24:51 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
ORA-00280: change 1382680 for thread 1 is in sequence #111
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
ORA-00279: change 1382686 generated at 03/11/2014 20:25:01 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
ORA-00280: change 1382686 for thread 1 is in sequence #112
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
ORA-00279: change 1382699 generated at 03/11/2014 20:25:10 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc
ORA-00280: change 1382699 for thread 1 is in sequence #113
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc
ORA-00279: change 1382705 generated at 03/11/2014 20:25:18 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
ORA-00280: change 1382705 for thread 1 is in sequence #114
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
ORA-00308: cannot open archived log
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
至此,歸檔檔案已利用完畢。在開始階段頻繁切日誌所釀下的一個不大不小的問題浮出水面,從而使我的恢復工作增加了一定量的複雜度。現在應該要使用到redo log日誌了。因為提示說要用到的序列號為114,而在關機前所檢視的日誌狀態中,redo03.log的序列號為114,所以指定redo03.log來繼續恢復。
指定日誌恢復:
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/ENMOEDU/redo03.log
Log applied.
Media recovery complete.
恢復成功,開啟資料庫:
SYS@ENMOEDU > alter database open resetlogs;
Database altered.
檢視當前資料庫資料檔案狀態:
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1382865
2 1382865
3 1382865
4 1382865
5 1382865
6 1382865
7 1382865
8 1382865
8 rows selected.
至此,資料庫控制檔案恢復成功。
從上面可以看書,採用使用者管理備份與恢復的方式來恢復我們的控制檔案還是有一定的時間複雜度和空間複雜度的。那麼到底有沒有一個簡單點得方法來解決這個問題嗎?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是肯定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是肯定的。那就是RMAN。
(2)基於RMAN的備份和恢復
終於到了RMAN這一部分了。其實用RMAN恢復控制檔案相對而言要簡單的多。有如此利器而放置不用,實乃暴殄天物。下面就為大家帶來用RMAN恢復控制檔案的過程。
首先,用RMAN做一次全備份。
SYS@ENMOEDU > alter database begin backup;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> backup database plus archivelog;
備份的過程就不逐一顯示在這裡了。
SYS@ENMOEDU > alter database end backup;
至此,備份過程完成。
建立表空間和表檔案,刪除控制檔案。
SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01' size 100m;
Tablespace created.
SYS@ENMOEDU > create table frank (x int,y int);
Table created.
SYS@ENMOEDU > insert into frank values(1,2);
1 row created.
SYS@ENMOEDU > insert into frank values(2,3);
1 row created.
SYS@ENMOEDU > select * from frank;
X Y
---------- ----------
1 2
2 3
SYS@ENMOEDU > commit;
[oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
[oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;
檢視一下DBID,一會RMAN恢復將要使用這個引數。
SYS@ENMOEDU > select dbid from v$database;
DBID
----------
87396644
關閉資料庫,以nomount的方式啟動資料庫。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
恢復控制檔案。
RMAN> set dbid=87396644;
executing command: SET DBID
RMAN> restore controlfile from autobackup;
restore自動提示的過程略去,為了節省空間和版面。
RMAN> sql 'alter database mount';
sql statement: alter database mount
released channel: ORA_DISK_1
RMAN> restore database;
RMAN> recover database;
RMAN> sql 'alter database open resetlogs';
sql statement: alter database open resetlogs
至此,恢復過程結束。
檢驗一下恢復的效果如何。
SYS@ENMOEDU > select * from frank;
X Y
----------------
1 2
2 3
SYS@ENMOEDU > select name from v$datafile;
NAME
--------------------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/system01.dbf
/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf
/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf
/u01/app/oracle/oradata/ENMOEDU/users01.dbf
/u01/app/oracle/oradata/ENMOEDU/example01.dbf
/u01/app/oracle/oradata/ENMOEDU/test01.dbf
/u01/app/oracle/oradata/ENMOEDU/test02.dbf
/u01/app/oracle/oradata/ENMOEDU/frank01
由上我們可以看出恢復成功。
縱然用RMAN恢復控制檔案比較簡單粗暴,但是最好的防守就是進攻,與其坐以待斃等待控制檔案出錯被動恢復,倒不如採取主動出擊多路複用控制檔案。狡兔尚且知掘三窟,那麼引入多路複用技術也就自然而然了。下面介紹多路複用技術。
三、控制檔案的多路複用技術
(1)多路複用技術的配置
關於多路複用有兩種配置方式,一種是在資料庫nomount的方式下修改引數,另一種是直接修改引數檔案。
將資料庫啟動到nomount,修改引數。
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
SYS@ENMOEDU > alter system set control_files=
'/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl' scope=spfile;
System altered.
將控制檔案複製到另一個需要放置控制檔案的路徑。
[oracle@ENMOEDU dbs]$ cp /u01/app/oracle/oradata/ENMOEDU/control01.ctl /u01/app/oracle/oradata/control01.ctl
重啟資料庫,檢視控制檔案狀態。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/oradata/control01.ctl
控制檔案的多路複用成功。
第二種方法是直接修改init.ora檔案。
首先建立pfile。
SYS@ENMOEDU > create pfile from spfile;
File created.
修改pfile。
[oracle@ENMOEDU dbs]$ vi initENMOEDU.ora
將控制檔案那一項修改。
*.control_files='/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl'
建立spfile。
SYS@ENMOEDU > create pfile from spfile;
File created.
啟動資料庫,檢視控制檔案狀態。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/oradata/control01.ctl
控制檔案的多路複用成功。
至此,控制檔案的多路複用已經實現了。下面我們將做一個實驗,來看看多路複用技術是怎麼保障控制檔案的正常使用的。
正常啟動資料庫。刪除其中一份控制檔案。
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
[oracle@ENMOEDU oradata]$ rm -rf /u01/app/oracle/oradata/control01.ctl
正常關閉資料庫,發現不能關閉,用shutdown abort 的方式關閉。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
以nomount的方式開啟資料庫。
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
修改引數,將已刪除的控制檔案從引數中刪除。
SYS@ENMOEDU > alter system set control_files= '/u01/app/oracle/oradata/ENMOEDU/control01.ctl' scope=spfile;
System altered.
關閉資料庫,重啟。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
至此,資料庫已經成功啟動。
綜上所述,本文總結了控制檔案的使用者管理備份和恢復、RMAN備份和恢復、多路複用的相關知識點。Frank才疏學淺,知識匱乏,只能盡綿薄之力總結自身所學,狂生之言,僅為笑談。
Frank
2014.3.12
一、控制檔案概要描述
既然今天的主題是控制檔案,那麼首先Frank先帶大家來簡要回顧一下控制檔案的相關知識點。控制檔案在預設情況下,一般和資料檔案以及日誌檔案等位於同一個目錄(當然,不放在這裡也是沒有問題的……看個人喜好),具體檢視的sql語句是:
SYS@ENMOEDU > select name from v$controlfile;
NAME
------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
從這裡就已經清晰的看到我控制檔案的路徑以及名稱了,還有,細心的讀者應該發現了,Frank是一個很小心謹慎的人,所以呢,我的控制檔案是兩份。這樣做的好處是,萬一我其中的一個控制檔案被誤刪了或者損壞了,我還有另外一個控制檔案保證我資料庫的正常執行以及啟動(不小心把多路複用技術給提前引入了……稍後會有更詳細的配置以及解析)。
控制檔案的作用我想就毋庸贅言了吧?上至九十老嫗,下到五歲孩童,對於控制檔案的重要性都能如數家珍般的娓娓道來。控制檔案中有資料庫以及線上重做日誌的位置以及眾多重要的資訊,丟失或者損壞控制檔案,資料庫將無法正常啟動和執行。既然控制檔案這麼重要,那麼我們該怎麼對它進行備份和恢復呢?
二、控制檔案的備份與恢復
(1)基於使用者管理的備份和恢復
首先進入Oracle的trace目錄
[oracle@ENMOEDU trace]$ cd /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace
用tail命令來開啟alert_ENMOEDU.log文件
[oracle@ENMOEDU trace]$ tail -100f alert_ENMOEDU.log
此時開啟另一視窗,執行如下命令
SYS@ENMOEDU > alter database backup controlfile to trace;
Database altered.
我們可以在alert.ENMOEDU.log看到如下資訊
Mon Mar 10 15:22:20 2014
alter database backup controlfile to trace
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
Completed: alter database backup controlfile to trace
根據上述資訊,我們去檢視提示的檔案
[oracle@ENMOEDU ~]$ cat /u01/app/oracle/diag/rdbms/enmoedu/ENMOEDU/trace/ENMOEDU_ora_18205.trc
在浩如煙海的資訊中,我們可以找到建立控制檔案的命令
CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
'/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
CHARACTER SET AL32UTF8;
稍後我們就可以用這些命令來建立控制檔案了。下面來模擬控制檔案丟失和損壞的實驗環境:
[root@ENMOEDU ~]# rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.ctl
[root@ENMOEDU ~]# rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
筆者將兩個控制檔案都刪除了,很徹底~然後嘗試啟動資料庫。
[oracle@ENMOEDU ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 10 15:47:54 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to an idle instance.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
ORA-00205: error in identifying control file, check alert log for more info
可以看出,資料庫已經無法正常啟動了。那麼我們就將資料庫啟動到nomount狀態下進行恢復。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
SYS@ENMOEDU > CREATE CONTROLFILE REUSE DATABASE "ENMOEDU" RESETLOGS ARCHIVELOG
2 MAXLOGFILES 16
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 100
5 MAXINSTANCES 8
6 MAXLOGHISTORY 292
7 LOGFILE
8 GROUP 1 '/u01/app/oracle/oradata/ENMOEDU/redo01.log' SIZE 50M BLOCKSIZE 512,
9 GROUP 2 '/u01/app/oracle/oradata/ENMOEDU/redo02.log' SIZE 50M BLOCKSIZE 512,
10 GROUP 3 '/u01/app/oracle/oradata/ENMOEDU/redo03.log' SIZE 50M BLOCKSIZE 512
11 -- STANDBY LOGFILE
12 DATAFILE
13 '/u01/app/oracle/oradata/ENMOEDU/system01.dbf',
14 '/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf',
15 '/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf',
16 '/u01/app/oracle/oradata/ENMOEDU/users01.dbf',
17 '/u01/app/oracle/oradata/ENMOEDU/example01.dbf',
18 '/u01/app/oracle/oradata/ENMOEDU/test01.dbf',
19 '/u01/app/oracle/oradata/ENMOEDU/test02.dbf'
20 CHARACTER SET AL32UTF8;
Control file created.
嘗試開啟資料庫
SYS@ENMOEDU > alter database open
2 ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
提示錯誤。按照提示來開啟資料庫:
SYS@ENMOEDU > alter database open resetlogs;
Database altered.
上述情況屬於非常樂觀且極易恢復的模擬實驗現場,但是在實際情況中,環境卻險要惡劣的多。往往控制檔案丟失後,使用者還會進行大量的操作,比如建立表空間等等,這些使得控制檔案的恢復要困難許多。路漫漫其修遠兮,吾將上下而求索,Frank對待技術的渴望永無止境。下面我就給大家介紹一下如何在備份的控制檔案過久的情況下恢復控制檔案。
首先,我們先備份一下我們的控制檔案。由於Frank採用了多路複用,所以看起來是不是應該把兩個控制檔案都備份一下呢?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是否定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是不需要備份兩份。由於兩份控制檔案是一模一樣的,所以備份一份即可,只需記得在恢復的時候注意檔名字。
備份控制檔案。在本文中,將控制檔案備份到Oracle的家目錄下,給控制檔案一種家的溫暖。
[oracle@ENMOEDU ENMOEDU]$ cp control01.ctl ~
建立表空間和檔案,從而使現在的控制檔案和備份檔案產生差異。
SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01.dbf' size 100m;
Tablespace created.
檢視一下當前線上日誌的status,並切換日誌,產生歸檔。
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 ACTIVE
3 CURRENT
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 ACTIVE
3 ACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 ACTIVE
3 CURRENT
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 CURRENT
2 INACTIVE
3 ACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 CURRENT
3 INACTIVE
SYS@ENMOEDU > alter system archive log current;
System altered.
SYS@ENMOEDU > select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 ACTIVE
2 ACTIVE
3 CURRENT
切日誌的次數由於一不留神沒有控制住,所以產生的歸檔日誌的數量也很可觀,導致一會恢復控制檔案的時候造成了不小的困難。
檢視現在日誌和資料檔案的狀態:
SYS@ENMOEDU > select GROUP#,SEQUENCE#,ARCHIVED,FIRST_CHANGE#,NEXT_CHANGE# from v$log;
GROUP# SEQUENCE# ARC FIRST_CHANGE# NEXT_CHANGE#
---------- ---------- --- ------------- ------------
1 112 YES 1382686 1382699
2 113 YES 1382699 1382705
3 114 NO 1382705 2.8147E+14
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1382686
2 1382686
3 1382686
4 1382686
5 1382686
6 1382686
7 1382686
8 1382686
8 rows selected.
刪除控制檔案:
rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;
關機,重啟,報錯,就以nomount的形式開啟資料庫:
SYS@ENMOEDU > shutdown abort;
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
ORA-00205: error in identifying control file, check alert log for more info
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 422670336 bytes
Fixed Size 1345380 bytes
Variable Size 352323740 bytes
Database Buffers 62914560 bytes
Redo Buffers 6086656 bytes
恢復控制檔案:
[oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/oradata/ENMOEDU/control01.ctl
[oracle@ENMOEDU ~]$ cp control01.ctl /u01/app/oracle/fast_recovery_area/ENMOEDU/control02.ctl
將資料庫啟動到mount狀態:
SYS@ENMOEDU > alter database mount;
Database altered.
檢視一下當前檔案的狀態:
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1371719
2 1371719
3 1371719
4 1371719
5 1371719
6 1371719
7 1371719
8 1382338
8 rows selected.
SYS@ENMOEDU > select status from v$datafile;
STATUS
-------
SYSTEM
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
ONLINE
RECOVER
8 rows selected.
明顯看出來datafile 8的scn號跟其他的不一樣,因為它是在備份控制檔案之後建立的。
利用archivelog來恢復控制檔案:
SYS@ENMOEDU > recover database using backup controlfile;
ORA-00279: change 1382338 generated at 03/11/2014 20:23:02 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
ORA-00280: change 1382338 for thread 1 is in sequence #106
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc
ORA-00279: change 1382640 generated at 03/11/2014 20:23:55 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
ORA-00280: change 1382640 for thread 1 is in sequence #107
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_106_9ky02vgf_.arc' no longer needed for this recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc
ORA-00279: change 1382655 generated at 03/11/2014 20:24:08 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
ORA-00280: change 1382655 for thread 1 is in sequence #108
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_107_9ky03860_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc
ORA-00279: change 1382666 generated at 03/11/2014 20:24:28 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
ORA-00280: change 1382666 for thread 1 is in sequence #109
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_108_9ky03wyl_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc
ORA-00279: change 1382673 generated at 03/11/2014 20:24:37 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
ORA-00280: change 1382673 for thread 1 is in sequence #110
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_109_9ky045yl_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc
ORA-00279: change 1382680 generated at 03/11/2014 20:24:51 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
ORA-00280: change 1382680 for thread 1 is in sequence #111
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_110_9ky04mo6_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc
ORA-00279: change 1382686 generated at 03/11/2014 20:25:01 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
ORA-00280: change 1382686 for thread 1 is in sequence #112
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_111_9ky04xrr_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc
ORA-00279: change 1382699 generated at 03/11/2014 20:25:10 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc
ORA-00280: change 1382699 for thread 1 is in sequence #113
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_112_9ky056n5_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc
ORA-00279: change 1382705 generated at 03/11/2014 20:25:18 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
ORA-00280: change 1382705 for thread 1 is in sequence #114
ORA-00278: log file
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_113_9ky05g7p_.arc' no longer needed for this
recovery
Specify log: {
/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc
ORA-00308: cannot open archived log
'/u01/app/oracle/fast_recovery_area/ENMOEDU/archivelog/2014_03_11/o1_mf_1_114_%u_.arc'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
至此,歸檔檔案已利用完畢。在開始階段頻繁切日誌所釀下的一個不大不小的問題浮出水面,從而使我的恢復工作增加了一定量的複雜度。現在應該要使用到redo log日誌了。因為提示說要用到的序列號為114,而在關機前所檢視的日誌狀態中,redo03.log的序列號為114,所以指定redo03.log來繼續恢復。
指定日誌恢復:
Specify log: {
/u01/app/oracle/oradata/ENMOEDU/redo03.log
Log applied.
Media recovery complete.
恢復成功,開啟資料庫:
SYS@ENMOEDU > alter database open resetlogs;
Database altered.
檢視當前資料庫資料檔案狀態:
SYS@ENMOEDU > select file#,checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1382865
2 1382865
3 1382865
4 1382865
5 1382865
6 1382865
7 1382865
8 1382865
8 rows selected.
至此,資料庫控制檔案恢復成功。
從上面可以看書,採用使用者管理備份與恢復的方式來恢復我們的控制檔案還是有一定的時間複雜度和空間複雜度的。那麼到底有沒有一個簡單點得方法來解決這個問題嗎?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是肯定的。但是,Frank作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是肯定的。那就是RMAN。
(2)基於RMAN的備份和恢復
終於到了RMAN這一部分了。其實用RMAN恢復控制檔案相對而言要簡單的多。有如此利器而放置不用,實乃暴殄天物。下面就為大家帶來用RMAN恢復控制檔案的過程。
首先,用RMAN做一次全備份。
SYS@ENMOEDU > alter database begin backup;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> backup database plus archivelog;
備份的過程就不逐一顯示在這裡了。
SYS@ENMOEDU > alter database end backup;
至此,備份過程完成。
建立表空間和表檔案,刪除控制檔案。
SYS@ENMOEDU > create tablespace frank datafile '/u01/app/oracle/oradata/ENMOEDU/frank01' size 100m;
Tablespace created.
SYS@ENMOEDU > create table frank (x int,y int);
Table created.
SYS@ENMOEDU > insert into frank values(1,2);
1 row created.
SYS@ENMOEDU > insert into frank values(2,3);
1 row created.
SYS@ENMOEDU > select * from frank;
X Y
---------- ----------
1 2
2 3
SYS@ENMOEDU > commit;
[oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/oradata/ENMOEDU/control01.dbf;
[oracle@ENMOEDU ENMOEDU]$ rm -rf /u01/app/oracle/fast_recovery_area/ENMOEDU/ontrol02.dbf;
檢視一下DBID,一會RMAN恢復將要使用這個引數。
SYS@ENMOEDU > select dbid from v$database;
DBID
----------
87396644
關閉資料庫,以nomount的方式啟動資料庫。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
SYS@ENMOEDU > startup nomount
ORACLE instance started.
恢復控制檔案。
RMAN> set dbid=87396644;
executing command: SET DBID
RMAN> restore controlfile from autobackup;
restore自動提示的過程略去,為了節省空間和版面。
RMAN> sql 'alter database mount';
sql statement: alter database mount
released channel: ORA_DISK_1
RMAN> restore database;
RMAN> recover database;
RMAN> sql 'alter database open resetlogs';
sql statement: alter database open resetlogs
至此,恢復過程結束。
檢驗一下恢復的效果如何。
SYS@ENMOEDU > select * from frank;
X Y
----------------
1 2
2 3
SYS@ENMOEDU > select name from v$datafile;
NAME
--------------------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/system01.dbf
/u01/app/oracle/oradata/ENMOEDU/sysaux01.dbf
/u01/app/oracle/oradata/ENMOEDU/undotbs01.dbf
/u01/app/oracle/oradata/ENMOEDU/users01.dbf
/u01/app/oracle/oradata/ENMOEDU/example01.dbf
/u01/app/oracle/oradata/ENMOEDU/test01.dbf
/u01/app/oracle/oradata/ENMOEDU/test02.dbf
/u01/app/oracle/oradata/ENMOEDU/frank01
由上我們可以看出恢復成功。
縱然用RMAN恢復控制檔案比較簡單粗暴,但是最好的防守就是進攻,與其坐以待斃等待控制檔案出錯被動恢復,倒不如採取主動出擊多路複用控制檔案。狡兔尚且知掘三窟,那麼引入多路複用技術也就自然而然了。下面介紹多路複用技術。
三、控制檔案的多路複用技術
(1)多路複用技術的配置
關於多路複用有兩種配置方式,一種是在資料庫nomount的方式下修改引數,另一種是直接修改引數檔案。
將資料庫啟動到nomount,修改引數。
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
SYS@ENMOEDU > alter system set control_files=
'/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl' scope=spfile;
System altered.
將控制檔案複製到另一個需要放置控制檔案的路徑。
[oracle@ENMOEDU dbs]$ cp /u01/app/oracle/oradata/ENMOEDU/control01.ctl /u01/app/oracle/oradata/control01.ctl
重啟資料庫,檢視控制檔案狀態。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/oradata/control01.ctl
控制檔案的多路複用成功。
第二種方法是直接修改init.ora檔案。
首先建立pfile。
SYS@ENMOEDU > create pfile from spfile;
File created.
修改pfile。
[oracle@ENMOEDU dbs]$ vi initENMOEDU.ora
將控制檔案那一項修改。
*.control_files='/u01/app/oracle/oradata/ENMOEDU/control01.ctl','/u01/app/oracle/oradata/control01.ctl'
建立spfile。
SYS@ENMOEDU > create pfile from spfile;
File created.
啟動資料庫,檢視控制檔案狀態。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
/u01/app/oracle/oradata/control01.ctl
控制檔案的多路複用成功。
至此,控制檔案的多路複用已經實現了。下面我們將做一個實驗,來看看多路複用技術是怎麼保障控制檔案的正常使用的。
正常啟動資料庫。刪除其中一份控制檔案。
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
[oracle@ENMOEDU oradata]$ rm -rf /u01/app/oracle/oradata/control01.ctl
正常關閉資料庫,發現不能關閉,用shutdown abort 的方式關閉。
SYS@ENMOEDU > shutdown abort
ORACLE instance shut down.
以nomount的方式開啟資料庫。
SYS@ENMOEDU > startup nomount
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
修改引數,將已刪除的控制檔案從引數中刪除。
SYS@ENMOEDU > alter system set control_files= '/u01/app/oracle/oradata/ENMOEDU/control01.ctl' scope=spfile;
System altered.
關閉資料庫,重啟。
SYS@ENMOEDU > shutdown immediate
ORACLE instance shut down.
SYS@ENMOEDU > startup
ORACLE instance started.
Total System Global Area 292933632 bytes
Fixed Size 1344512 bytes
Variable Size 222301184 bytes
Database Buffers 62914560 bytes
Redo Buffers 6373376 bytes
Database mounted.
Database opened.
SYS@ENMOEDU > select name from v$controlfile;
NAME
--------------------------------------------------
/u01/app/oracle/oradata/ENMOEDU/control01.ctl
至此,資料庫已經成功啟動。
綜上所述,本文總結了控制檔案的使用者管理備份和恢復、RMAN備份和恢復、多路複用的相關知識點。Frank才疏學淺,知識匱乏,只能盡綿薄之力總結自身所學,狂生之言,僅為笑談。
Frank
2014.3.12
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29762980/viewspace-1392912/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle-無備份情況下,如何手動恢復控制檔案Oracle
- Oracle使用備份檔案集恢復歸檔日誌Oracle
- Oracle為什麼使用備份的控制檔案恢復後一定要resetlogsOracle
- [重慶思莊每日技術分享]-控制檔案自動備份
- 【RMAN】Oracle中如何備份控制檔案?備份控制檔案的方式有哪幾種?Oracle
- XFS檔案系統的備份、恢復、修復
- ORACLE備份&恢復案例(轉)Oracle
- Oracle 備份 與 恢復 概述Oracle
- Oracle 備份恢復之 FlashbackOracle
- 資料庫備份與恢復技術資料庫
- 12 使用RMAN備份和恢復檔案
- 檔案的基本管理和XFS檔案系統備份恢復
- Linux中XFS檔案系統的備份,恢復,修復Linux
- ORACLE本地磁碟備份恢復Oracle
- 備份與恢復oracle_homeOracle
- oracle 增量備份恢復驗證Oracle
- Oracle 備份和恢復介紹Oracle
- ORACLE備份&恢復案例三(轉)Oracle
- ORACLE備份&恢復案例二(轉)Oracle
- IO多路複用技術總結
- I/O多路複用技術(multiplexing)
- 實戰:xfs檔案系統的備份和恢復
- ORACLE DG從庫 Rman備份恢復Oracle
- Oracle 12c 備份與恢復Oracle
- Oracle 備份恢復篇之RMAN catalogOracle
- oracle 控制檔案及引數檔案何時自動備份Oracle
- 如何從Active Backup for Business備份中恢復檔案
- 如何備份及恢復Linux檔案許可權Linux
- RAC備份恢復之Voting備份與恢復
- 與控制檔案有關的恢復
- 【ASK_ORACLE】Oracle 12c之CDB與PDB的備份與恢復(二)備份恢復之前你需要知道的Oracle
- 【Mongo】mongo分片加複製集的備份恢復Go
- oracle控制檔案的損壞或完全丟失的恢復辦法Oracle
- 備份與恢復:polardb資料庫備份與恢復資料庫
- MySQL備份與恢復——基於Xtrabackup物理備份恢復MySql
- 【RMAN】如果控制檔案損壞那麼如何恢復?恢復控制檔案的方式有哪幾種?
- RMAN備份恢復典型案例——資料檔案存在壞快
- oracle冷備恢復Oracle
- 【備份】RMAN中對控制檔案的幾種備份方法