控制檔案實驗
控制檔案最多8個,至少1個,互為鏡像,只要丟失了控制檔案,資料庫將無法正常關閉,無法啟動。
//增加控制檔案,必須加上原有的控制檔案,注意同一路徑下的檔案名稱不能相同
alter system set control_files='/lvm/app/Oracle/oradata/updb/control01.ctl','/lvm/app/oracle/fast_recovery_area/updb/control02.ctl','/lvm/app/oracle/oradata/updb/control01a.ctl','/lvm/app/oracle/fast_recovery_area/updb/control02.ctl' scope=spfile;
alter system set control_files='/lvm/app/oracle/oradata/updb/control01.ctl','/lvm/app/oracle/fast_recovery_area/updb/control02.ctl','/lvm/app/oracle/oradata/updb/control01a.ctl','/lvm/app/oracle/fast_recovery_area/updb/control02a.ctl' scope=spfile;
//複製原有的給建立的
SQL> ho cp /lvm/app/oracle/oradata/updb/control01.ctl /lvm/app/oracle/oradata/updb/control01a.ctl
SQL> ho cp /lvm/app/oracle/fast_recovery_area/updb/control02.ctl /lvm/app/oracle/fast_recovery_area/updb/control02a.ctl
shutdown transactional
startup
//減少控制檔案
alter system set control_files='/lvm/app/oracle/oradata/updb/control01.ctl','/lvm/app/oracle/fast_recovery_area/updb/control02.ctl' scope=spfile;
shutdown
startup
//控制檔案異常處理
先按照 的前兩步建立好預存程序,再建立下面的過程
//刪除控制檔案 df=8刪除全部控制檔案,df<8刪除第幾個控制檔案
create or replace procedure foway_test_1(df number)
as
j number;
begin
j:=1;
if df>8 or df<0 then
dbms_output.put_line('number can not gt 8 or lt 0');
else
for i in(select name from v$controlfile) loop
if length(i.name)>0 then
if df=8 then
del(i.name);
else
if j=df then
del(i.name);
exit;
end if;
end if;
j:=j+1;
end if;
end loop;
j:=1;
end if;
end;
/
1、啟動時報告版本錯誤
複製高版本的給低版本的
2、控制檔案部分丟失
//先查看控制檔案的資訊
SQL> select name from v$controlfile;
select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/lvm/app/oracle/oradata/updb/control01.ctl
/lvm/app/oracle/fast_recovery_area/updb/control02.ctl
/lvm/app/oracle/oradata/updb/control01a.ctl
/lvm/app/oracle/fast_recovery_area/updb/control02a.ctl
逐個 ls檢查
SQL> exec foway_test_1(1);
exec foway_test_1(1);
PL/SQL procedure successfully completed.
再檢查
SQL> ho ls /lvm/app/oracle/oradata/updb/control01.ctl;
ho ls /lvm/app/oracle/oradata/updb/control01.ctl;
ls: cannot access /lvm/app/oracle/oradata/updb/control01.ctl: No such file or directory
報告檔案丟失
shutdown abort; //強行關閉資料庫,注意一定要關閉資料後進行操作,否則資料庫將崩潰。
複製存在的給丟失的
ho cp /lvm/app/oracle/oradata/updb/control01a.ctl /lvm/app/oracle/oradata/updb/ control01.ctl
startup
完成恢複
如果報告版本錯誤,複製高版本的給低版本的。
3、控制檔案全部丟失
exec foway_test_1(8);
a、資料庫還未關閉
//備份控制檔案
alter database backup controlfile to trace as '/tmp/c.sql';
shutdown abort;
//取出控制檔案的建立指令碼
ho sed '1,/Set #2/p' -n /tmp/c.sql >/tmp/c1.sql;
start /tmp/c1.sql;
啟動成功後馬上進入rman target /
backup database;
b、資料庫已經關閉但是rman有有效備份(備份之後沒有resetlogs,沒有重建控制檔案,沒有clear logfile,當前資料庫使用的記錄檔沒有丟失,時歸檔的)
rman target /
startup nomount;
restore controlfile from '*s*備份檔案';
alter database mount;
exit;
sqlplus / as sysdba
alter database backup controlfile to trace as '/tmp/c.sql' reuse;
shutdown abort;
//取出控制檔案的建立指令碼
ho sed '1,/Set #2/p' -n /tmp/c.sql >/tmp/c1.sql;
start /tmp/c1.sql;
啟動成功後馬上進入rman target /
backup database;