一.配置控制文件多路復用?
?1.查詢Oracle的控制文件所在位置
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control01.ctl
/u01/app/oracle/fast_recovery_area/orcl/control02.ctl
?spfile多路復用控制文件
2.修改control_files參數:
SQL> alter system set
control_files='/u01/app/oracle/oradata/orcl/control02.ctl',
'/u01/app/oracle/oradata/orcl/control03.ctl',
'/u01/app/oracle/oradata/orcl/control05.ctl'
scope=spfile;
3.關閉數據庫?
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down
?4. 進行文件拷貝(必須在數據庫關閉下復制文件)
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control02.ctl
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control03.ctl
[oracle@cz ~]$ cp /u01/app/oracle/oradata/orcl/control01.ctl /u01/app/oracle/oradata/orcl/control05.ctl
5. 連接數據庫?
[oracle@cz ~]$ sqlplus / as sysdba
6. 啟動數據庫
SQL> startup;
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
Database mounted.
Database opened.
?7.查詢控制文件信息
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control02.ctl
/u01/app/oracle/oradata/orcl/control03.ctl
/u01/app/oracle/oradata/orcl/control05.ctl
二.控制文件的損壞模擬與重建
1.關閉數據庫,并模擬損壞
關閉數據庫
SQL> shutdown immediate;
模擬單個控制文件損壞
SQL> !rm -rf /u01/app/oracle/oradata/orcl/control05.ctl
?2.嘗試啟動數據庫,顯然報錯
SQL> startup;
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
ORA-00205: error in identifying control file, check alert log for more info
3.拷貝其他路徑在的控制文件給損壞的那個路徑的控制文件
SQL> !cp /u01/app/oracle/oradata/orcl/control02.ctl /u01/app/oracle/oradata/orcl/control05.ctl
4.嘗試啟動數據庫,顯然成功了
SQL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
Database mounted.
Database opened.
5. 查看控制文件和實例狀態
SQL> select name from v$controlfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/control02.ctl
/u01/app/oracle/oradata/orcl/control03.ctl
/u01/app/oracle/oradata/orcl/control05.ctl
?實例狀態
SQL> select status from v$instance;STATUS
------------
OPEN
三.通過 TRACE 備份 ?
嚴格意義上來說,不是針對控制文件的備份,而是根據現在系統情況生成了一份 trace
文件,這個 trace 文件中記錄了創建控制文件的基本信息。
SQL> alter database backup controlfile to trace as '/u01/app/oracle/oradata/orcl/controfiles.bak';Database altered.
四.所有控制文件損壞、丟失?
1.TRACE 備份 ?的優勢與缺點
這種情況可以利用前面生成的 trace 文件進行手工重建。但是要注意,手工重建新
的,導致原來存在的一些備份資料庫元數據丟失,如果采用 RMAN 則不會。
Trace 文件是我們事先導出的,如果在發生故障之前從來沒有生成過該如何處理?需
要從其他好的機器上 trace 一份模板,然后按照模板把該庫對應的所有數據文件、日志文
件等信息找出來,然后對應到模板上進行重建。
trace 文件中有兩段代碼:第一段 sql 是在所有 online redolog 沒有丟失,以
noresetlogs 選項打開數據庫的情況下使用的。第二段則是在丟失了 online redolog 需要
resetlogs 的情況下使用。
2.模擬所有控制文件丟失,手工重建。
SQL> !rm -rf /u01/app/oracle/oradata/orcl/control02.ctlSQL> !rm -rf /u01/app/oracle/oradata/orcl/control03.ctlSQL> !rm -rf /u01/app/oracle/oradata/orcl/control05.ctlSQL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
ORA-00205: error in identifying control file, check alert log for more info
?啟動報錯
QL> startup
ORACLE instance started.Total System Global Area 1169149952 bytes
Fixed Size 2252624 bytes
Variable Size 738197680 bytes
Database Buffers 419430400 bytes
Redo Buffers 9269248 bytes
Database mounted.
ORA-01122: database file 1 failed verification check
ORA-01110: data file 1: '/u01/app/oracle/oradata/orcl/system01.dbf'
ORA-01207: file is more recent than control file - old control file
?3.將 trace 文件第一段 sql 編輯成文件并執行。
把下面方框中的sql編輯成腳本并執行
?創建腳本文件
[oracle@cz orcl]$ vim control.sql
?把上面的sql粘貼進去作為腳本
?
?執行腳本
SQL> @control.sql
SP2-0734: unknown command beginning "TARTUP NOM..." - rest of line ignored.Control file created.
?查看實例狀態數據庫恢復正常
SQL> select status from v$instance;STATUS
------------
OPEN
這時,控制文件里面的 SCN 號就追平了數據文件頭部的 SCN 號了。
SQL> select file#,checkpoint_change# from v$datafile;
SQL> select file#,checkpoint_change# from v$datafile_header;
?
數據庫正常打開,注意:這時候還有一個臨時表空間不要忘了重新創建,實際臨時表
空間文件并沒有刪除,但是由于刪除了控制文件,數據字典中無法查到臨時表空間文件。
所以臨時表空間也需要重新建立。
4.臨時表空間是空值
SQL> select * from v$tempfile;no rows selected
數據字典查詢是空值,但是 OS 系統層面依然存在 temp01.dbf 。所以需要重新建立。
5.重新建立臨時表空間
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl/temp01.dbf' SIZE 30408704 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;Tablespace altered.
6.再次查詢$v$tempfile;
SQL> select name from v$tempfile;NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/temp01.dbf
總結:這個重建控制文件的過程主要有兩大部分內容:
第一部分是腳本中的可見信息:定義了幾個參數的最大值,在線日志的物理信息,數
據文件的物理信息,使用的字符集。
第二部分是隱含的不可見信息,比如 SCN 信息,重建最關鍵的是將當前所有數據文
件頭部的最新 SCN 信息復制到了控制文件中,以便接下來打開數據庫。
?
?
?
?