首先,歸檔模式和非歸檔模式下的數據恢復是物理恢復。
歸檔模式下試驗流程:
1. 創建一個表空間test1 使用test01.dbf;
2. 給test01.dbf創建一個副本(備份);
3. 做一些操作使test01.dbf文件中的數據發生變化;
4. 切換聯機日誌文件,讓它歸檔;
5. 關閉數據庫,刪除test01.dbf,啓動數據庫找不到文件;
6. 把最初的副本複製過去,或者讓alter database renamed file;
7. 然後開啓提示要恢復。最後恢復成功,步驟3的操作也都在
非歸檔模式下的流程:
與歸檔模式基本一致,區別:
1. 步驟4對於非歸檔模式意義不大;
2. test1 之類都都變成了2;
3. 步驟7恢復很快捷,不過恢復方法是有區別的。
總結:
非歸檔模式和歸檔模式都能進行數據文件的恢復,共同點是都必須有依靠一個備份文件才能恢復備份之後的操作。區別在於:
1. 歸檔模式依靠歸檔日誌文件,使用arc放入data buffer cache再寫入以此恢復
2. 非歸檔模式依靠聯機日誌文件,放入data buffer cache再寫入以此恢復
我們知道,聯機日誌文件本身不大,是通過arc把它裏面日誌放到大得多的歸檔日誌文件進行歸檔,以此保存更長久的日誌。
步驟1: 創建一個表空間test1 使用test01.dbf;
SQL> archive log list
數據庫日誌模式非存檔模式
自動存檔禁用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 86
當前日誌序列 88
SQL> alter database close;//到mount階段
數據庫已更改。
SQL> alter database archivelog;
數據庫已更改。
SQL> archive log list
數據庫日誌模式存檔模式
自動存檔啓用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯機日誌序列 86
下一個存檔日誌序列 88
當前日誌序列 88
SQL> shutdown immediate
ORA-01109: 數據庫未打開
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啓動。
Total System Global Area 1653518336 bytes
Fixed Size 2176288 bytes
Variable Size 1073744608 bytes
Database Buffers 570425344 bytes
Redo Buffers 7172096 bytes
數據庫裝載完畢。
數據庫已經打開。
SQL> create tablespace test datafile 'D:/test01.dbf' size 5M;
表空間已創建。
步驟2:給test01.dbf創建一個副本(備份);
SQL> host copy D:\test01.dbf E:\test01.dbf
已複製 1 個文件。
這裏數據庫打開也可以複製
步驟3:做一些操作使test01.dbf文件中的數據發生變化;
SQL> conn scott/tiger
已連接。
SQL> create table test tablespace test as select * from emp;//修改了數據
表已創建。
步驟4: 切換聯機日誌文件,讓它歸檔;
SQL> conn sys/xuhan1992 as sysdba
已連接。
SQL> select group#,sequence#,bytes,members,archived,status from v$log;
GROUP# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
1 88 52428800 1 NO CURRENT
2 86 52428800 1 YES INACTIVE
3 87 52428800 1 YES INACTIVE
經過多次 alter system switch logfile······
SQL> select group#,sequence#,bytes,members,archived,status from v$log;
GROUP# SEQUENCE# BYTES MEMBERS ARC STATUS
---------- ---------- ---------- ---------- --- ----------------
1 94 52428800 1 YES INACTIVE
2 95 52428800 1 NO CURRENT
3 93 52428800 1 YES INACTIVE
這裏要說明:
CURRENT表示LGWR正在使用
ACTIVE表示LGWR沒有使用,但是實例恢復還需要它,歸檔模式的話它就現在等待歸檔
INACTIVE表示LGWR沒有使用,實例恢復也不需要它,歸檔模式的話它就已經被arc進程拿去歸檔。
現在它是INACTIVE了,歸檔就是在ACTIVE到INACTIVE的切換中完成的(我們剛剛是手動切換的)
步驟5:關閉數據庫,刪除test01.dbf,啓動數據庫找不到文件;
SQL> shutdown immediate
數據庫已經關閉。
已經卸載數據庫。
ORACLE 例程已經關閉。
SQL> host del d:\test01.dbf
SQL> startup
ORACLE 例程已經啓動。
Total System Global Area 1653518336 bytes
Fixed Size 2176288 bytes
Variable Size 1073744608 bytes
Database Buffers 570425344 bytes
Redo Buffers 7172096 bytes
數據庫裝載完畢。//證明數據庫已經到mount狀態,是打開數據文件,發現找不到而出錯的
ORA-01157: 無法標識/鎖定數據文件 5 - 請參閱 DBWR 跟蹤文件
ORA-01110: 數據文件 5: 'D:\TEST01.DBF'
6. 把最初的副本複製過去,或者讓alter database renamed file;
關閉數據庫
SQL> host copy e:\test01.dbf d:\test01.dbf
已複製 1 個文件。
7. 然後開啓提示要恢復。最後恢復成功,步驟3的操作也都在
SQL> startup
ORACLE 例程已經啓動。
Total System Global Area 1653518336 bytes
Fixed Size 2176288 bytes
Variable Size 1073744608 bytes
Database Buffers 570425344 bytes
Redo Buffers 7172096 bytes
數據庫裝載完畢。
ORA-01113: 文件 5 需要介質恢復
ORA-01110: 數據文件 5: 'D:\TEST01.DBF'
SQL> recover datafile 5;
ORA-00279: 更改 2684172 (在 11/16/2013 11:59:29 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_8
8_98FW0GTV_.ARC
ORA-00280: 更改 2684172 (用於線程 1) 在序列 #88 中
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 2684951 (在 11/16/2013 12:09:50 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_8
9_98FW0PTH_.ARC
ORA-00280: 更改 2684951 (用於線程 1) 在序列 #89 中
ORA-00279: 更改 2684956 (在 11/16/2013 12:09:58 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_9
0_98FW0WMT_.ARC
ORA-00280: 更改 2684956 (用於線程 1) 在序列 #90 中
ORA-00279: 更改 2684959 (在 11/16/2013 12:10:03 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_9
1_98FW0Z24_.ARC
ORA-00280: 更改 2684959 (用於線程 1) 在序列 #91 中
ORA-00279: 更改 2684963 (在 11/16/2013 12:10:06 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_9
2_98FW1NFR_.ARC
ORA-00280: 更改 2684963 (用於線程 1) 在序列 #92 中
ORA-00279: 更改 2684977 (在 11/16/2013 12:10:27 生成) 對於線程 1 是必需的
ORA-00289: 建議:
G:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\GUJUNPU\ARCHIVELOG\2013_11_16\O1_MF_1_9
3_98FW1Q9P_.ARC
ORA-00280: 更改 2684977 (用於線程 1) 在序列 #93 中
已應用的日誌。
完成介質恢復。
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter database open; ;
數據庫已更改。
最後也查到內容了,太長就不貼出來了
接着做了一個測試:
那如果一開始就是非歸檔模式,在恢復的時候會略有不同:
SQL> startup
ORA-01081: 無法啓動已在運行的 ORACLE - 請首先關閉它
SQL> alter database open;
alter database open
*
第 1 行出現錯誤:
ORA-01113: 文件 6 需要介質恢復
ORA-01110: 數據文件 6: 'E:\TEST02.DBF'
SQL> recover datafile 6;
完成介質恢復。 //這裏沒有像剛纔一樣啓用很多的線程,而這裏就這一行字,而且一下就結束了,速度也快得多。
最後是也是正常恢復。
和歸檔模式使用歸檔日誌文件恢復不同,非歸檔模式下恢復數據文件使用的是聯機日誌文件(但跟實例恢復有區別,實例恢復是自動執行的),而且更快。
但是這裏數據量小,而且受到聯機日誌文件大小的限制,不能長久的依賴它來進行數據恢復。