<< 記一下Windows Platform Considerations要注意的地方 | 回blog首頁 |
沒有備份但遺失了非system的datafile補救方法(noarchive mode) >>
2006年08月16日
在noarchive的狀態下損壞datafile後能還原的程度
損壞:只有datafile損壞
os:win2000
oracle:10.0.2
os:win2000
oracle:10.0.2
1、查看現在的情況,在noarchive中
| SQL> archive log list; 資料庫日誌模式 無儲存模式 可自動儲存 關閉 儲存目的地 D:\oracle\product\10.2.0\db_1\RDBMS 最早的線上日誌順序 18 目前日誌順序 20 |
2、建立測試資料
| SQL> create table test10 (id char(10)); 已建立表格. SQL> insert into test10 values (1); 已建立 1 個資料列. SQL> insert into test10 values (2); 已建立 1 個資料列. SQL> commit; 確認完成. SQL> select * from test10; ID -------------------- 1 2 |
3、查看現在redo log的seq值為何
| SQL> select sequence# from v$log where status =
'CURRENT'; SEQUENCE# ---------- 20 |
4、開到mount情況下進行備份
| SQL> shutdown immediate; 資料庫關閉. 資料庫已卸載. 已關閉 ORACLE 執行處理. SQL> startup mount; ORACLE 執行處理已啟動. Total System Global Area 167772160 bytes Fixed Size 1247900 bytes Variable Size 75498852 bytes Database Buffers 88080384 bytes Redo Buffers 2945024 bytes 資料庫已掛載. |
5、進rman進行備份
| RMAN>
run { 2> allocate channel t1 type disk; 3> backup full format 'd:/vm/%U' database include current controlfile; 4> release channel t1; 5> } 使用目標資料庫控制檔替代復原目錄 配置的通道: t1 通道 t1: sid=155 devtype=DISK 開始 backup, 於 2006-08-16 14:13:43 通道 t1: 啟動完整資料檔備份集 通道 t1: 正在指定備份集中的資料檔 輸入資料檔 fno=00001 名稱=D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSTEM01.DBF 輸入資料檔 fno=00003 名稱=D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSAUX01.DBF 輸入資料檔 fno=00002 名稱=D:\ORACLE\PRODUCT\10.2.0\BINHU\UNDOTBS01.DBF 輸入資料檔 fno=00004 名稱=D:\ORACLE\PRODUCT\10.2.0\BINHU\USERS01.DBF 輸入資料檔 fno=00005 名稱=D:\ORACLE\PRODUCT\10.2.0\BINHU\TESTRENAME.DBF 通道 t1: 啟動部份 1, 在 2006-08-16 14:13:46 通道 t1: 已完成部份 1, 在 2006-08-16 14:15:11 片段處理=D:\VM\01HQSO0P_1_1 標記=TAG20060816T141344 註解=NONE 通道 t1: 備份集完成, 經歷時間: 00:01:26 通道 t1: 啟動完整資料檔備份集 通道 t1: 正在指定備份集中的資料檔 包括備份集中目前的控制檔 在備份集中包括目前的 SPFILE 通道 t1: 啟動部份 1, 在 2006-08-16 14:15:14 通道 t1: 已完成部份 1, 在 2006-08-16 14:15:15 片段處理=D:\VM\02HQSO3F_1_1 標記=TAG20060816T141344 註解=NONE 通道 t1: 備份集完成, 經歷時間: 00:00:04 完成 backup, 於 2006-08-16 14:15:15 釋出的通道: t1 |
6、進行備備完後新增資料,以測試等一下datafile損壞時是否會遺失資料
| SQL> insert into test10 values (3); 已建立 1 個資料列. SQL> commit; 確認完成. SQL> select * from test10; ID -------------------- 1 2 3 SQL> alter system switch logfile; 已更改系統. SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV ---------- ---------- ---------- ---------- ---------- ------ STATUS FIRST_CHANGE# FIRST_TIME -------------------------------- ------------- ------------------- 1 1 20 52428800 1 NO ACTIVE 1089651 2006-08-16 06:00:07 2 1 21 52428800 1 NO CURRENT 1103289 2006-08-16 14:18:56 3 1 19 52428800 1 YES INACTIVE 1058241 2006-08-15 16:54:41 SQL>shutdown abort (進行不正常關機) |
7、刪除datafile,後進開機開(發現有些datafile不見了)
| SQL>
startup ORACLE 執行處理已啟動. Total System Global Area 167772160 bytes Fixed Size 1247900 bytes Variable Size 75498852 bytes Database Buffers 88080384 bytes Redo Buffers 2945024 bytes 資料庫已掛載. ORA-01157: 無法識別/鎖定資料檔 2 - 請參閱 DBWR 追蹤檔 ORA-01110: 資料檔 2: 'D:\ORACLE\PRODUCT\10.2.0\BINHU\UNDOTBS01.DBF' SQL> select status from v$instance; STATUS ------------------------ MOUNTED SQL> exit |
8、查看log(裡面說的很明白就是有檔案不見了)
| Wed Aug 16 14:20:54 2006 Errors in file d:\oracle\product\10.2.0\admin\binhu\bdump\binhu_dbw0_3076.trc: ORA-01157: ????/????? 2 - ??? DBWR ??? ORA-01110: ??? 2: 'D:\ORACLE\PRODUCT\10.2.0\BINHU\UNDOTBS01.DBF' ORA-27041: ?????? OSD-04002: 無法開啟檔案 O/S-Error: (OS 2) 系統找不到指定的檔案。 Wed Aug 16 14:20:54 2006 Errors in file d:\oracle\product\10.2.0\admin\binhu\bdump\binhu_dbw0_3076.trc: ORA-01157: ????/????? 4 - ??? DBWR ??? ORA-01110: ??? 4: 'D:\ORACLE\PRODUCT\10.2.0\BINHU\USERS01.DBF' ORA-27041: ?????? OSD-04002: 無法開啟檔案 O/S-Error: (OS 2) 系統找不到指定的檔案。 |
9、使用rman進行還原
| RMAN> restore database; 開始 restore, 於 2006-08-16 14:23:22 使用目標資料庫控制檔替代復原目錄 配置的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=156 devtype=DISK 通道 ORA_DISK_1: 正在啟動資料檔備份集回覆 通道 ORA_DISK_1: 正在設定要從備份集回覆的資料檔 正在將資料檔 00001 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSTEM01.DBF 正在將資料檔 00002 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\UNDOTBS01.DBF 正在將資料檔 00003 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSAUX01.DBF 正在將資料檔 00004 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\USERS01.DBF 正在將資料檔 00005 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\TESTRENAME.DBF 通道 ORA_DISK_1: 從備份 D:\VM\01HQSO0P_1_1 讀取 通道 ORA_DISK_1: 已回覆備份 1 片斷處理=D:\VM\01HQSO0P_1_1 標記=TAG20060816T141344 通道 ORA_DISK_1: 回復完成, 經歷時間: 00:01:17 完成 restore, 於 2006-08-16 14:24:43 RMAN> recovery database; RMAN>exit; |
10、開起database (發現並沒有遺失資料)
| SQL>
alter database open; 已更改資料庫. SQL> select * from test10; ID -------------------- 1 2 3 |
11、再來接著測試如redo log已被使用過一圈了會如何呢?
| SQL> select * from v$log; GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCHIV ---------- ---------- ---------- ---------- ---------- ------ STATUS FIRST_CHANGE# FIRST_TIME -------------------------------- ------------- ------------------- 1 1 20 52428800 1 NO INACTIVE 1089651 2006-08-16 06:00:07 2 1 21 52428800 1 NO INACTIVE 1103289 2006-08-16 14:18:56 3 1 22 52428800 1 NO CURRENT 1123297 2006-08-16 14:26:11 |
12、再insert 一筆資料進去
| SQL> insert into test10 values (4); 已建立 1 個資料列. SQL> commit; |
13、開始讓redo log交換一圈
| SQL> select group#,sequence#,status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- -------------------------------- 1 20 INACTIVE 2 21 INACTIVE 3 22 CURRENT SQL> alter system switch logfile; 已更改系統. SQL> select group#,sequence#,status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- -------------------------------- 1 23 CURRENT 2 21 INACTIVE 3 22 ACTIVE SQL> alter system switch logfile; 已更改系統. SQL> select group#,sequence#,status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- -------------------------------- 1 23 ACTIVE 2 24 CURRENT 3 22 ACTIVE SQL> alter system switch logfile; 已更改系統. SQL> select group#,sequence#,status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- -------------------------------- 1 23 ACTIVE 2 24 ACTIVE 3 25 CURRENT SQL> alter system switch logfile; 已更改系統. SQL> select group#,sequence#,status from v$log ; GROUP# SEQUENCE# STATUS ---------- ---------- -------------------------------- 1 26 CURRENT 2 24 INACTIVE 3 25 INACTIVE SQL>shutdown abort |
14、跟之前相同,刪除datafile後再進行rman的還原,這時的備份檔只有最初的那次,中間的過程中沒有再進行任何的備份
| C:\Documents and Settings\binhu>rman target / 復原管理員: Release 10.2.0.1.0 - Production on 星期三 8月 16 14:31:49 2006 Copyright (c) 1982, 2005, Oracle. All rights reserved. 已連線到目標資料庫 (未啟動) RMAN> startup mount; 已啟動 Oracle 執行處理 已掛載資料庫 系統整體區域總共是 167772160 個位元組 Fixed Size 1247900 個位元組 Variable Size 75498852 個位元組 Database Buffers 88080384 個位元組 Redo Buffers 2945024 個位元組 RMAN> restore database; 開始 restore, 於 2006-08-16 14:32:20 使用目標資料庫控制檔替代復原目錄 配置的通道: ORA_DISK_1 通道 ORA_DISK_1: sid=157 devtype=DISK 通道 ORA_DISK_1: 正在啟動資料檔備份集回覆 通道 ORA_DISK_1: 正在設定要從備份集回覆的資料檔 正在將資料檔 00001 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSTEM01.DBF 正在將資料檔 00002 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\UNDOTBS01.DBF 正在將資料檔 00003 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\SYSAUX01.DBF 正在將資料檔 00004 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\USERS01.DBF 正在將資料檔 00005 回覆為 D:\ORACLE\PRODUCT\10.2.0\BINHU\TESTRENAME.DBF 通道 ORA_DISK_1: 從備份 D:\VM\01HQSO0P_1_1 讀取 通道 ORA_DISK_1: 已回覆備份 1 片斷處理=D:\VM\01HQSO0P_1_1 標記=TAG20060816T141344 通道 ORA_DISK_1: 回復完成, 經歷時間: 00:01:15 完成 restore, 於 2006-08-16 14:33:38 RMAN> recover database; 開始 recover, 於 2006-08-16 14:33:46 使用通道 ORA_DISK_1 啟動媒體恢復 找不到存檔日誌 存檔日誌繫線=1 順序=20 |
結論:
在noarchive的環境下,只要你的redo log檔還沒有被複寫過,是可以不遺失資料的;如被複寫過的話,你裝遺失上次的備份到發生損壞時間點之間資料。而如果是controlfile損壞是什情 況呢,這個就等我較有空時再來做實驗分享給大家了,如有錯誤的地方也請大家指教,謝謝了
引用URL
http://cgi.blog.roodo.com/trackback/2026681