ORACLE控制檔案管理

tonyzhou_cn發表於2012-06-19

控制檔案的管理
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 '

'得到建立語句;,但要注意[no]archivelog [no]resetlogs 2個引數的區別。

D、開啟歸檔模式 (SQL> archive log list 資料庫OPEN階段可以查詢)
首先資料庫要處於mount階段才能開啟, SQL> alter database archivelog;
然後把資料開啟 SQL> archive log list 查詢確認。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27038344/viewspace-733289/,如需轉載,請註明出處,否則將追究法律責任。

相關文章