前言
今天給大家帶來有關Oracle控制檔案的技術分享。不積跬步無以至千裡,不積小流無以成江海。Oracle技術博大精深,以我一個人的力量,那無異於蜉蝣於天地,滄海之一粟。在此,筆者拋磚引玉,希望讀者能夠與我形成良好的互動,之間共同進步。閑言少敘,書歸正傳,馬上開始今天的討論話題。
Oracle 備份恢複概念
一、控制檔案概要描述
既然今天的主題是控制檔案,那麼首先我先帶大家來簡要回顧一下控制檔案的相關知識點。控制檔案在預設情況下,一般和資料檔案以及記錄檔等位於同一個目錄(當然,不放在這裡也是沒有問題的……看個人喜好),具體查看的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
從這裡就已經清晰的看到我控制檔案的路徑以及名稱了,還有,細心的讀者應該發現了,我是一個很小心謹慎的人,所以呢,我的控制檔案是兩份。這樣做的好處是,萬一我其中的一個控制檔案被誤刪了或者損壞了,我還有另外一個控制檔案保證我資料庫的正常運行以及啟動(不小心把多工技術給提前引入了……稍後會有更詳細的配置以及解析)。
控制檔案的作用我想就毋庸贅言了吧?上至九十老嫗,下到五歲孩童,對於控制檔案的重要性都能如數家珍般的娓娓道來。控制檔案中有資料庫以及線上重做日誌的位置以及眾多重要的資訊,丟失或者損壞控制檔案,資料庫將無法正常啟動和運行。既然控制檔案這麼重要,那麼我們該怎麼對它進行備份和恢複呢?
二、控制檔案的備份與恢複
(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.
數���庫已經正常啟動了。
上述情況屬於非常樂觀且極易恢複的類比實驗現場,但是在實際情況中,環境卻險要惡劣的多。往往控制檔案丟失後,使用者還會進行大量的操作,比如建立資料表空間等等,這些使得控制檔案的恢複要困難許多。路漫漫其修遠兮,吾將上下而求索,我對待技術的渴望永無止境。下面我就給大家介紹一下如何在備份的控制檔案過久的情況下恢複控制檔案。
首先,我們先備份一下我們的控制檔案。由於我採用了多工,所以看起來是不是應該把兩個控制檔案都備份一下呢?按照國際慣例,一般作者向讀者發出類似這種疑問句的時候,答案往往是否定的。但是,我作為一個走位忽上忽下意識飄忽不定的技術人員,所以,答案,仍然是不需要備份兩份。由於兩份控制檔案是一模一樣的,所以備份一份即可,只需記得在恢複的時候注意檔案名稱字。
備份控制檔案。在本文中,將控制檔案備份到Oracle的家目錄下,給控制檔案一種家的溫暖。
[oracle@ENMOEDU ENMOEDU]$ cp control01.ctl ~
建立資料表空間和檔案,從而使現在的控制檔案和備份檔案產生差異。
SYS@ENMOEDU > create tablespace 我 datafile '/u01/app/oracle/oradata/ENMOEDU/我01.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