眾所周知,非歸檔模式下,聯機日誌並不歸檔。可能大多數的網友一直以來都會有這樣的模糊認識。資料庫作recover時,只能利用歸檔日誌和current redo log聯機日誌。實際上所有的聯機日誌都是可以用的。此文介紹在非檔模式下,恢復利用offline drop命令誤刪除的資料檔案。offline drop命令相當於把一個資料檔案至於離線狀態,並且需要恢復或再也不使用此資料檔案了。所在,在OS級別並不是刪除資料檔案的意思。但是要在非檔模式下恢復此資料檔案的前提是,聯機日誌中自資料檔案建立以來的所有聯機日誌都沒有被覆蓋。下面是整個實驗過程,並且注意,在整個恢復的過程中注意從檢視中獲得的資料檔案狀態的變化:
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination c:\arc
Oldest online log sequence 7
Current log sequence 9
SQL> set linesize 200
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 8 52428800 1 YES INACTIVE 730667 2008:01:15 08:57:55
2 1 9 52428800 1 NO CURRENT 755863 2008:01:15 11:49:53
3 1 7 52428800 1 YES INACTIVE 696036 2008:01:14 12:30:46
SQL>
SQL> alter tablespace users add datafile 'C:\ORADATA\TEST\TEST\users03.dbf' size 5M;
Tablespace altered.
SQL> alter system switch logfile;
System altered.
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ----------
1 1 8 52428800 1 YES INACTIVE 730667 2008:01:15 08:57:55
2 1 9 52428800 1 NO ACTIVE 755863 2008:01:15 11:49:53
3 1 10 52428800 1 NO CURRENT 768362 2008:01:18 15:19:46
在作業系統層刪除6號資料檔案後,對6號資料檔案作offline drop操作
SQL> alter database datafile 'C:\ORADATA\TEST\TEST\users03.dbf' offline drop;
Database altered.
SQL>
檢視資料檔案狀態,當對資料檔案執行offline drop 命令後,資料檔案狀態變為recover
SQL> select file#,status,name from v$datafile order by 3;
FILE# STATUS NAME
---------- ------- ------------------------------------------------------------------------
3 ONLINE C:\ORADATA\TEST\TEST\SYSAUX01.DBF
1 SYSTEM C:\ORADATA\TEST\TEST\SYSTEM01.DBF
5 ONLINE C:\ORADATA\TEST\TEST\TBS_UNDO_01.DBF
4 ONLINE C:\ORADATA\TEST\TEST\USERS01.DBF
2 ONLINE C:\ORADATA\TEST\TEST\USERS02.DBF
6 RECOVER C:\ORADATA\TEST\TEST\USERS03.DBF
SQL>
根據控制檔案中的資訊,重新建立6號資料檔案
SQL> alter database create datafile 6;
Database altered.
在執行完建立命令後,資料檔案狀態仍然為recover,此時資料檔案中只有非常簡單的資訊
SQL> select file#,status,name from v$datafile order by 3;
FILE# STATUS NAME
---------- ------- ------------------------------------------------------------------------
3 ONLINE C:\ORADATA\TEST\TEST\SYSAUX01.DBF
1 SYSTEM C:\ORADATA\TEST\TEST\SYSTEM01.DBF
5 ONLINE C:\ORADATA\TEST\TEST\TBS_UNDO_01.DBF
4 ONLINE C:\ORADATA\TEST\TEST\USERS01.DBF
2 ONLINE C:\ORADATA\TEST\TEST\USERS02.DBF
6 RECOVER C:\ORADATA\TEST\TEST\USERS03.DBF
因為聯機日誌還未被覆蓋,儘管處於非歸檔模式,仍然可以對6號資料檔案作恢復
SQL> recover datafile 6;
Media recovery complete.
SQL>
資料檔案狀態變為offline
SQL> select file#,status,name from v$datafile order by 3;
FILE# STATUS NAME
---------- ------- -------------------------------------------------------
3 ONLINE C:\ORADATA\TEST\TEST\SYSAUX01.DBF
1 SYSTEM C:\ORADATA\TEST\TEST\SYSTEM01.DBF
5 ONLINE C:\ORADATA\TEST\TEST\TBS_UNDO_01.DBF
4 ONLINE C:\ORADATA\TEST\TEST\USERS01.DBF
2 ONLINE C:\ORADATA\TEST\TEST\USERS02.DBF
6 OFFLINE C:\ORADATA\TEST\TEST\USERS03.DBF
在對資料檔案作online操作後,資料檔案恢復正常
SQL> alter database datafile 6 online;
Database altered.
SQL> select file#,status,name from v$datafile order by 3;
FILE# STATUS NAME
---------- ------- ----------------------------------------------
3 ONLINE C:\ORADATA\TEST\TEST\SYSAUX01.DBF
1 SYSTEM C:\ORADATA\TEST\TEST\SYSTEM01.DBF
5 ONLINE C:\ORADATA\TEST\TEST\TBS_UNDO_01.DBF
4 ONLINE C:\ORADATA\TEST\TEST\USERS01.DBF
2 ONLINE C:\ORADATA\TEST\TEST\USERS02.DBF
6 ONLINE C:\ORADATA\TEST\TEST\USERS03.DBF