2006年08月16日

在noarchive的狀態下損壞datafile後能還原的程度

損壞:只有datafile損壞
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
因為找不過編號20的redo log檔,所以recover失敗,因為被複寫了

結論:
在noarchive的環境下,只要你的redo log檔還沒有被複寫過,是可以不遺失資料的;如被複寫過的話,你裝遺失上次的備份到發生損壞時間點之間資料。而如果是controlfile損壞是什情 況呢,這個就等我較有空時再來做實驗分享給大家了,如有錯誤的地方也請大家指教,謝謝了



Posted by my_work at 樂多Roodo! │15:02 │回應(0)引用(0)DB
樂多分類:網路/3C 共同主題:Oracle 工具:編輯本文
Ads by Roodo! 

引用URL

http://cgi.blog.roodo.com/trackback/2026681