1、個數和位置的管理(因為控制文件時在參數文件定義的,所以可以直接修改參數文件)
SPfile修改的步驟:
a) 修改SPFILE參數control_files
b) 一致性關閉數據庫
c) 增加或減少控制文件
d) 啟動數據庫使用SPFILE
e) 驗證結果
實驗:
減少控制文件:
a)SQL> show parameter control_f;
b)Sql>alter system set control_files='/oracle/oradata/oracleto/control01.ctl' scope=spfile;
c)Shutdown immediate
d)Startup? 完成
增加控制文件:
a)sql>show parameter control_f;? 確認控制文件的路徑等相關信息。
b)Sql>alter system set? control_files='/oracle/oradata/oracleto/control01.ctl' ,'/oracle/oradata/oracleto/control02.ctl','/oracle/oradata/oracleto/control03.ctl' scope=spfile;
c)Shutdown immediate;
d)Startup 此時會報版本號錯誤,那么需要從高版本的拷貝至低版本。
ORA-00214: control file '/oracle/oradata/oracleto/control01.ctl' version 771 inconsistent with file '/oracle/oradata/oracleto/control02.ctl' version 762
e)sql>show parameter control_f;? 確認控制文件的路徑等相關信息。
f)SQL> ho cp /oracle/oradata/oracleto/control01.ctl /oracle/oradata/oracleto/control02.ctl
g)SQL> ho cp /oracle/oradata/oracleto/control01.ctl /oracle/oradata/oracleto/control03.ctl
h)Alter database mount;? 檢查是否解決問題。
i)Startup?? 完成。
Pfile修改的步驟:
a) 一致性關閉數據庫
b) 修改Pfile參數
c) 增加或減少控制文件
d) 啟動數據庫使用PFILE
e) 驗證結果
2、狀態管理
目的是看數據庫使用的控制文件與參數定義控制文件是否吻合。
文件。每到數據庫啟動到mount都讀控制文件并把數據庫的結構對應到實際的文件上去才能啟動。
存在狀態:
a) 找位置和個數?? show parameter control_f 查處的結果在通過操作系統來對比
Ho ll -h /路徑?
b) 需要查看磁盤空間使用情況? sql>ho df -H
c) 查看文件的大小? sql>ho ls -lh /oracle/oradata/ora.ctl?
控制文件盡量控制在100M以內,如果超過了,那么需要盡快采取措施,一般情況下需要重建控制文件。
3、控制文件備份。
a) Sql>alter database backup controlfile to '/oracle/bakcup/control20120522.bak';??? 歸檔模式下這樣備份才有作用 ,當控制文件出現問題是,可以直接在操作系統下拷貝過去就行。
b) Sql>alter database backup controlfile to trace as '/oracle/....txt'? 這樣就得到一個重建控制文件的腳本。
c) 通過rman備份? 也需要歸檔模式才能使用rman
Rman>backup current controlfile;? 自動就在閃回目錄下。
或者rman>backup database include current controlfile; 備份數據庫的同時也備份控制文件
4、重建控制文件原則
恢復管理:
如果控制文件丟失和不一致了,需要DBA處理,首先確認控制文件交易號碼那個比較新那個比較舊。復制新的給舊的或者直接更改參數文件control_file使用新的
5、幾種丟失情況的解決:
確認數據庫是否處于歸檔模式,不是歸檔,則先全備,然后建立新的控制文件即可。
解決辦法:
a)、確認數據文件,默認的數據文件保存在$ORACLE_BASE/oradata//xxxx.dbf 文件。
b)查看告警日志? vi $ORACLE_BASE/admin/$ORACLE_SID/bdump/alter_orcl.log
c)建立控制文件(有些相關的文件可以通過ALTER日志查詢到相關的數據,數據文件,日志文件個數、路徑、大小很重要,一定要搞清楚)
CREATE CONTROLFILE REUSE DATABASE "ORACLETO" NORESETLOGS? NOARCHIVELOG
??? MAXLOGFILES 16
??? MAXLOGMEMBERS 3
??? MAXDATAFILES 100
??? MAXINSTANCES 8
??? MAXLOGHISTORY 292
LOGFILE
? GROUP 1 '/oracle/oradata/oracleto/redo01.log'? SIZE 50M,
? GROUP 2 '/oracle/oradata/oracleto/redo02.log'? SIZE 50M,
? GROUP 3 '/oracle/oradata/oracleto/redo03.log'? SIZE 50M
-- STANDBY LOGFILE
DATAFILE
? '/oracle/oradata/oracleto/system01.dbf',
? '/oracle/oradata/oracleto/undotbs01.dbf',
? '/oracle/oradata/oracleto/sysaux01.dbf',
? '/oracle/oradata/oracleto/users01.dbf',
? '/oracle/oradata/oracleto/example01.dbf'
CHARACTER SET WE8ISO8859P1
d)執行這個sql語句? 控制文件就會建立
e)Sql>alter database open;
這里會提示數據庫中有一個文件需要恢復
f)Sql>recover database;? 一定要執行這條語句 ,如果需要恢復的內容能在日志文件能找到,那么就可以恢復,如果不能恢復,那么就需要你加隱藏參數讓數據庫不進行一致性認證。(下面的情況就用到了)
g)Sql>alter databas open;這樣就可以打開數據了。
歸檔和日志都在;先全備,然后再使用備份的控制文件恢復即可
a) 在所有操作之前要做全備,很重要
b) 同樣查看警告日志 vi $ORACLE_BASE/admin/$ORACLE_SID/bdump/alter_orcl.log,確認問題所在
c) 確認控制文件時候在,show parameter control_f 查路徑,ls -l 查看
d) 確定不在之后,那么就可以從備份文件恢復
e)
SQL> show parameter control_
NAME???????????????????????????????? TYPE?????????????????? VALUE
------------------------------------ ---------------------- ------------------------------
control_file_record_keep_time??????? integer??????????????? 7
control_files??????????????????????? string???????????????? /oracle/oradata/oracleto/contr
??????????????????????????????????????????????????????????? ol01.ctl, /oracle/oradata/orac
???????????????????????????????????????????????????? leto/control02.ctl, /oracle/or
????????????????????????????????????????????????????????? adata/oracleto/control03.ctl
SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control01.ctl
SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control02.ctl
SQL> ho cp /oracle/controlbak.ctl /oracle/oradata/oracleto/control03.ctl
SQL> ho ls /oracle/oradata/oracleto/
SQL> alter database mount;
Database altered.
SQL> alter database open;????????????????? ------------恢復失敗
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open?
SQL> alter database recover database using backup controlfile;? 用備份的控制文件恢復
alter database recover database using backup controlfile
*
ERROR at line 1:
ORA-00279: change 792378 generated at 05/24/2012 07:32:41 needed for thread 1
ORA-00289: suggestion : /oracle/flash_recovery_area/ORACLETONY/archivelog/2012_05_26/o1_mf_1_13_%u_.arc
ORA-00280: change 792378 for thread 1 is in sequence #13
SQL> shutdwon immediate??
SQL> startup
ORACLE?instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size???????????? 130025716 bytes
Database Buffers?????????? 33554432 bytes
Redo Buffers??????????????? 2973696 bytes
Database mounted.?? -----------仍然不能恢復
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> shutdonwn immediate
在重做上面一步:
SQL> alter database recover database using backup controlfile; 不行
SQL> alter database recover database using backup controlfile until change 792378;??????????????????????????? ---------------也不行
alter database recover database using backup controlfile until change 792378
*
ERROR at line 1:
ORA-00275: media recovery has already been started
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01156: recovery in progress may need access to files
SQL> shutdown immediate;
SQL> startup
SQL> alter database recover database using backup controlfile until change 792378;
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile; 使用隱藏參數,不讓數據庫進行一致性驗證。
SQL> startup force
SQL> alter database open resetlogs;? 可以啟動了
Sql>startup
最后要干掉隱藏參數,不然以后系統會出現ORA-600的內部錯誤。
Sql>show parameter _allow
Sql>alter database reset "_allow_resetlogs_corruption" scope=spfile sid='*';
歸檔模式下使用正常的方式來恢復。上面那種方法錯誤的未執行alter database open resetlogs, 而先執行 alter database recover database using backup controlfile,最后還使用了不該用的隱藏參數。
所以建議使用下面的辦法:
第一種方法
SQL> startup
ORACLE instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size???????????? 125831412 bytes
Database Buffers?????????? 37748736 bytes
Redo Buffers??????????????? 2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info???? 查看告警日志。Vi $ORACLE_BASE/admin/alter.....log
SQL> shwo parameter control_f
SQL> ho ls /oracle/oradata/oracleto
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control01.ctl??????????
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control02.ctl
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control03.ctl
SQL> shutdown immediate
SQL> startup
ORACLE instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size???????????? 125831412 bytes
Database Buffers?????????? 37748736 bytes
Redo Buffers??????????????? 2973696 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced? 連接中斷
SQL> startup?? 可以正常啟動了
ORACLE instance started.
?第一種方法出現第二種情況
SQL>alter database open resetlogs;
如果這里提示數據庫一致性驗證錯誤,那么需要做以下幾步操作
Sql>recover database;
提示需要用老的控制文件。
Sql>alter database recover? database using backup controlfile;
還是不行。提示錯誤
Sql>shutdown immediate
Sql>startup
Sql>alter database open resetlogs;
Sql>recover database 同樣提示需要老的控制文件
Sql>alter database recover? database using backup controlfile;
執行之后會提示歸檔日志找不到,需要從日志文件中找,所以指定日志文件,那么你可以挨個將日志文件的路徑輸入進去,
$ORACLE_BASE/oradata/.....(需要絕對路徑)
Sql> alter database resetlogs;? 這樣就可以恢復了。
?第二種方法是用隱藏參數 (一般不用)
SQL> startup
ORACLE instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size???????????? 125831412 bytes
Database Buffers?????????? 37748736 bytes
Redo Buffers??????????????? 2973696 bytes
ORA-00205: error in identifying control file, check alert log for more info???? 查看告警日志。Vi $ORACLE_BASE/admin/alter.....log
SQL> shwo parameter control_f
SQL> ho ls /oracle/oradata/oracleto
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control01.ctl??????????
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control02.ctl
SQL> ho cp /oracle/control2012.ctl /oracle/oradata/oracleto/control03.ctl
SQL> shutdown immediate
SQL> startup
ORACLE instance started.
Total System Global Area? 167772160 bytes
Fixed Size????????????????? 1218316 bytes
Variable Size???????????? 125831412 bytes
Database Buffers?????????? 37748736 bytes
Redo Buffers??????????????? 2973696 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
Sql>recover database;
提示不能恢復,需要是用老的控制文件恢復
Sql>alter database recover? database using backup controlfile; 還是不行
SQL> alter system set "_allow_resetlogs_corruption"=true scope=spfile; 使用隱藏參數,不讓數據庫進行一致性驗證。
Sql>start force
Sql>alter database open resetlog;? 實例終端
Sql>重新連接,startup
最后去掉隱藏參數
Sql>show parameter _allow
Sql>alter database reset "_allow_resetlogs_corruption" scope=spfile sid='*';
完成。
歸檔但日志不全;先全備,然后建立新的控制文件。
參考重建控制文件部分。
新建控制文件語句:
可以在在數據庫運行在OPEN和mount的時候,可以執行alter database backup controlfile to trace as '<dir路徑>'得到建立語句;,但要注意[no]archivelog [no]resetlogs 2個參數的區別。
D、開啟歸檔模式 (SQL> archive log list 數據庫OPEN階段可以查詢)
首先數據庫要處于mount階段才能開啟, SQL> alter database archivelog;
然后把數據打開 SQL> archive log list 查詢確認。