RMAN備份與恢復測試

stephenjwq發表於2018-04-03
#########################################################
#[1] 控制檔案損壞(rman和常規恢復)                       #
#########################################################
準備工作
~~~~~~~~
備份
~~~~
RMAN> configure controlfile autobackup on;
新的 RMAN 配置引數:
CONFIGURE CONTROLFILE AUTOBACKUP ON;
已成功儲存新的 RMAN 配置引數
RMAN> configure controlfile autobackup format for device type disk to 'c:\temp\%
F';
新的 RMAN 配置引數:
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO 'c:\temp\%F';
已成功儲存新的 RMAN 配置引數
RMAN>
RMAN> backup database;
啟動 backup 於 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=12 devtype=DISK
分配的通道: ORA_DISK_2
通道 ORA_DISK_2: sid=13 devtype=DISK
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00002 name=C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF
輸入資料檔案 fno=00003 name=C:\ORACLE\ORADATA\PDF\INDX01.DBF
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\PDF\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 25-2月 -05
通道 ORA_DISK_2: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_2: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00001 name=C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF
輸入資料檔案 fno=00004 name=C:\ORACLE\ORADATA\PDF\TOOLS01.DBF
通道 ORA_DISK_2: 正在啟動段 1 於 25-2月 -05
通道 ORA_DISK_1: 已完成段 1 於 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\07GDKT8C_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:56
通道 ORA_DISK_2: 已完成段 1 於 25-2月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\08GDKT8C_1_1 comment=NONE
通道 ORA_DISK_2: 備份集已完成, 經過時間:00:00:57
完成 backup 於 25-2月 -05
啟動 Control File and SPFILE Autobackup 於 25-2月 -05
段 handle=C:\TEMP\C-3171861129-20050225-00 comment=NONE
完成 Control File and SPFILE Autobackup 於 25-2月 -05
RMAN>
       
~~~~~~~~~~~       
常規備份
~~~~~~~~~~~
備份資料檔案cp   C:\ORACLE\ORADATA\PDF\* C:\ORACLE\ORADATA\bak
備份控制檔案                                                             
###################################################
# [1.1] 有老的備份資料備份和控制檔案trace
###################################################
SQL> alter session set tracefile_identifier=fanglf
  2  ;
會話已更改。
SQL> alter database backup controlfile to trace;
資料庫已更改。
SQL>  alter database backup controlfile to 'c:\temp\controlfile.bak';
資料庫已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們也可以使用RMAN來複製備份控制檔案
RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';
啟動 copy 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 已複製當前的控制檔案
輸出檔名=C:\CF.CPY
完成 copy 於 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

SQL> col name format a50
SQL> select * from v$controlfile;
STATUS  NAME
------- --------------------------------------------------
        C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL03.CTL     <<-此時仍然可以使用
~~~~~~~~~~~~~~~~
模擬控制檔案損壞
~~~~~~~~~~~~~~~~       
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       
使用ULTRAEDIT編輯CONTROL01.CTL部分資料
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select * from v$controlfile;
STATUS  NAME
------- ------------------------------------------------
        C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
        C:\ORACLE\ORADATA\PDF\CONTROL03.CTL
SQL>
SQL> create table test (a int,v varchar(200));
使用ULTRAEDIT編輯清空CONTROL01.CTL大部分資料
SQL> select * from v$controlfile;  <<-出現異常
select * from v$controlfile
*
ERROR 位於第 1 行:
ORA-12571: TNS: 包寫入程式失敗
  
~~~~~~~~~~~~~~~~       
在alert中顯示 
~~~~~~~~~~~~~~~~
Fri Feb 25 11:51:56 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_ckpt_2556.trc:
ORA-00227: corrupt block detected in controlfile: (block 1, # blocks 1)
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'
CKPT: terminating instance due to error 227
Fri Feb 25 11:51:58 2005
Errors in file c:\oracle\admin\pdf\bdump\pdf_pmon_3084.trc:
ORA-00227: corrupt block detected in controlfile: (block , # blocks )
Instance terminated by CKPT, pid = 2556       
~~~~~~~~~~~~~~~~
在trace檔案中顯示
~~~~~~~~~~~~~~~~
Corrupt block relative dba: 0x00000001 (file 0, block 1)
Completely zero block found during control file header read
*** 2005-02-25 11:51:55.000
ksedmp: internal or fatal error
ORA-00202: controlfile: 'C:\ORACLE\ORADATA\PDF\CONTROL01.CTL'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這裡我模擬把3個控制檔案都破壞
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
啟動資料庫時提示
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-00205: ?????????????????????
恢復例項
###################################################
# [測試1] --使用trace恢復 shutdown abort
###################################################
SQL> shutdown abort 
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "DF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-01113: 檔案 1 需要介質恢復
ORA-01110: 資料檔案 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database ;  --因為是shutdown abort關閉,所以需要恢復
完成介質恢復。
SQL> alter database open;
資料庫已更改。
###################################################
# [測試2] --使用trace恢復 正常shutdown
###################################################
SQL> insert into test select rownum,'aaaaaaaaaaaaaaaaaaaaaa' from dba_objects;
已建立6165行。
SQL> /
已建立6165行。
SQL> insert into test select * from test;
已建立12330行。
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "DF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open;
                        
資料庫已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們看到如果是正常資料庫down機的,
那麼使用noresetlog建立控制檔案後
直接可以開啟資料庫
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> select count(*) from test;
  COUNT(*)
----------
     24660
    
用trace完成了資料庫的完全恢復  
SQL> select * from v$tempfile;
未選定行
SQL> select name from v$tablespace;
NAME
------------------------------
SYSTEM
UNDOTBS1
INDX
TOOLS
USERS
TEMP
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
注意我們可以看到由於重建了控制檔案,
臨時表空間的臨時檔案沒有了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################### 
# [測試3] --使用控制檔案備份來恢復
###################################################
~~~~~~~~~~~~~~~~
還原備份控制檔案
~~~~~~~~~~~~~~~~
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL01.CTL
已複製         1 個檔案。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL02.CTL
已複製         1 個檔案。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile.bak
C:\oracle\oradata\pdf\CONTROL03.CTL
已複製         1 個檔案。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
備份控制檔案不會存有關於聯機日誌檔案
和資料檔案結束SCN,因此不會在恢復時使
用聯機日誌檔案,並因此將資料檔案假定了
一個無窮大的結束SCN,所以要休整他,必須
resetlogs,但是我們可以在例子[測試5.1]中可以看到
我們可以強制應用線上日誌實現完全恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
當資料庫用normal或immediate關閉時,發
出檢查點處理,這將為每個資料檔案在控制
檔案中設定相應的結束SCN,使其等於資料
檔案頭中對應的開始SCN
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDpdf.ORA'
SQL> recover database;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
資料檔案頭中原有檢查點計數器決不會大於
當前控制檔案中的檢查點計數器,所以必須在
恢復時指定USING  BACKUP CONTROLFILE,
這樣就會基於備份控制檔案的資訊
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
         
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01152: ?? 1 ????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這時,沒有進行恢復,檢查到當前資料檔案頭
的開始SCN和控制檔案的結束SCN不一致需要
進行恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

這裡無法恢復資料庫
而採用第1鍾方法執行成功
###################################################
# [測試4] 我們現在模擬備份控制檔案,同時備份部分資料檔案先於備份
#         控制檔案的資料檔案
###################################################
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
copy SYSTEM01.DBF 復件 SYSTEM01.DBF
alter database backup controlfile to 'c:\temp\controlfile1.bak';
SQL> shutdown immediate
資料庫已經關閉。
已經解除安裝資料庫。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL01.CTL
已複製         1 個檔案。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL02.CTL
已複製         1 個檔案。
C:\Documents and Settings\lifeng.fang>copy c:\temp\controlfile1.bak C:\oracle\or
adata\pdf\CONTROL03.CTL
已複製         1 個檔案。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database using backup controlfile;
ORA-00279: 更改 1069041 (在 02/25/2005 15:36:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00012.001
ORA-00280: 更改 1069041 對於執行緒 1 是按序列 # 12 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00012.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00012.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01113: 檔案 1 需要介質恢復
ORA-01110: 資料檔案 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069041 (在 02/25/2005 15:36:00 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00012.001
ORA-00280: 更改 1069041 對於執行緒 1 是按序列 # 12 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 將出現如下錯誤
ORA-01152: 檔案 2 沒有從完備的舊備份中恢復
ORA-01110: 資料檔案 2: 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF'

ORA-01112: 未啟動介質恢復

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01152: 檔案 2 沒有從完備的舊備份中恢復
ORA-01110: 資料檔案 2: 'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
雖然在備份控制檔案前備份了SYSTEM檔案,但是
其他檔案沒有備份,而有超過控制檔案檢查點SCN
的資訊,不能恢復成功
如果有隻讀表空間,使用備份控制檔案恢復,
要先offline 參見備份與恢復手冊
對於使用備份控制檔案進行恢復由於預設是所有
資料檔案聯機的,而且resetlogs時需要寫資料
檔案的,那麼只讀檔案恢復時,由於只讀檔案不
需要恢復,就要強制將他offline;
所以在選取控制檔案時也要注意,如果選取了當
時正好是隻讀狀態的控制檔案時,必須將資料文
件offline ,而使得在切換前為讀寫狀態時的數
據無法恢復,反之同理
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#######################################################
# [測試5]我們現在模擬控制檔案損壞,將備份控制檔案前,先備份所有資料檔案
#######################################################
copy SYSTEM01.DBF 復件 SYSTEM01.DBF
copy UNDOTBS01.DBF 復件 UNDOTBS01.DBF
copy TOOLS01.DBF   復件 TOOLS01.DBF
copy USERS01.DBF   復件 USERS01.DBF
copy INDX01.DBF    復件 INDX01.DBF
SQL>  alter database backup controlfile to 'c:\temp\controlfile2.bak';
                                                                     
資料庫已更改。     
替換老的控制檔案
SQL> insert into test select * from test;
已建立24660行。
SQL> commit;
提交完成。
SQL> select count(*) from test;
  COUNT(*)
----------
     49320
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL01.CTL
copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL02.CTL
copy c:\temp\controlfile2.bak C:\oracle\oradata\pdf\CONTROL03.CTL                                                      
rename SYSTEM01.DBF  復件 SYSTEM01.DBF  SYSTEM01.DBF  -->>臨時檔案可以不要
rename UNDOTBS01.DBF 復件 UNDOTBS01.DBF UNDOTBS01.DBF
rename TOOLS01.DBF   復件 TOOLS01.DBF   TOOLS01.DBF  
rename USERS01.DBF   復件 USERS01.DBF   USERS01.DBF  
rename INDX01.DBF    復件 INDX01.DBF    INDX01.DBF
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。  
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 對於執行緒 1 是按序列 # 13 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto -->>使用auto恢復也是成功
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> recover database using backup controlfile until cancel; -->>這個cancel是表示每次應用一個日誌時都提示一下,直到輸入cancel後結束
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 對於執行緒 1 是按序列 # 13 進行的
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cancel通常好於change和time的恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL} 
cancel  --輸入cancel恢復成功 -->>cancel選項允許每次前滾一個日誌檔案,當需要停止恢復時,輸入cancel
                                 ,在這種方式下不會自動運用聯機日誌檔案.
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select CHECKPOINT_CHANGE# from v$database;
CHECKPOINT_CHANGE#
------------------
           1069388
          
SQL> select count(*) from test;
  COUNT(*)
----------
     24660  --丟失了資料
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
那我們使用備份控制檔案恢復,是不是一定恢復不了線上日誌中的資料嗎?
答案是錯誤的,其實也能完全恢復(當然我們用trace更好)  
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
#######################################################
# [測試5.1]我們現在模擬控制檔案損壞,有控制檔案備份,先於控制檔案備份的所有資料檔案備份
#        使用線上日誌進行完全恢復
#######################################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE 
         3          4 YES ACTIVE
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69410
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
還原備份控制檔案,還原所有備份資料檔案
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-00314: 日誌 1 (執行緒 1),預計序號  與  不匹配
ORA-00312: 聯機日誌 1 執行緒 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69257
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69362 (在 03/04/2005 11:21:25 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69362 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 對於執行緒 1 是按序列 # 5 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408
             
~~~~~~~~~~~~~~             
到此是不完全恢復
那我們是不是可以
應用線上日誌呢,那
我們先應用SEQUENCE=3和4
的日誌C:\oracle\oradata\testdb\REDO02.LOG
C:\oracle\oradata\testdb\REDO03.LOG
我們可以看到恢復時這個檔案不需要
~~~~~~~~~~~~~~~             
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO02.LOG
ORA-00310: 存檔日誌包含序列 3;要求序列 5
ORA-00334: 歸檔日誌: 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO03.LOG
ORA-00310: 存檔日誌包含序列 4;要求序列 5
ORA-00334: 歸檔日誌: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69408
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們看到非活動線上日誌沒有被應用
我們應用SEQUENCE=5
的日誌C:\oracle\oradata\testdb\REDO01.LOG
我們可以看到恢復時這個檔案是需要的
~~~~~~~~~~~~~~~   
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69408 (在 03/04/2005 11:21:26 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69408 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
C:\oracle\oradata\testdb\REDO01.LOG --這步是關鍵
已應用的日誌。
完成介質恢復。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69418 --在SEQUENCE=5中的SCN被應用了
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              69418               69516
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok
-->>完全恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~
這裡主要是由於應用了活動線上日誌
C:\oracle\oradata\testdb\REDO01.LOG的恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~
#######################################################
# [測試6]那我們看看,有老的資料檔案備份,備份控制檔案後插
#  入的資料在shutdown abort後能不能恢復
#######################################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611
SQL>
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611
SQL> commit;
提交完成。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69611
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> exit
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 14:25:25 2005
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
已連線到空閒例程。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69360
SQL> recover database using backup controlfile;
ORA-00279: 更改 69456 (在 03/02/2005 10:26:30 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69456 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69564 (在 03/02/2005 14:23:19 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69564 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 對於執行緒 1 是按序列 # 5 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610
SQL> recover database using backup controlfile until change 69620;  --我們看到CONTROLFILE_CHANGE#為69610,那我隨便加大這個值69620試試看能不能恢復到69610以後
ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610
             
SQL> recover database using backup controlfile until change 69620;
ORA-00279: 更改 69610 (在 03/02/2005 14:23:21 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69610 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69610
~~~~~~~~~~~~~~
這裡如果線上日誌沒有
損壞,那麼可以應用線上
日誌完全恢復
~~~~~~~~~~~~~~
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok  -->>不能恢復status = no ,這部分資料在線上日誌中的,但是until cancel+ backup controlfile不前滾線上日誌檔案
~~~~~~~~~~~~~~~~~~~
經過測試也可以用5.1的方法
應用線上日誌進行完全恢復
~~~~~~~~~~~~~~~~~~~
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#  -->>奇怪這裡值變成我要until change的值了
------------------- -------------------
              69610               69720
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok

[ Last edited by fly115 on 2005-3-21 at 19:37 ]
  
UID393 帖子3566 精華23 積分3803 流通積分3803 點 金錢0 O元 閱讀許可權225 線上時間173 小時 註冊時間2003-1-21 最後登入2008-8-27 檢視詳細資料
 TOP
 
fly115
超級版主

個人空間 發短訊息 加為好友 當前離線  3樓 大 中 小 發表於 2005-3-19 17:58  只看該作者

#######################################################
# [測試7]那我們看看,有老的資料檔案備份,備份控制檔案後插
#  入的資料在正常shutdown 後能不能恢復
#######################################################                 
測試結果同上.
透過create controlfile方法才能完全恢復
也可以參考[測試5.1]
                 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們注意到,在這裡仍然可以用resetlogs
前的trace來進行控制檔案恢復,因為結構
沒有變動.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#######################################################
# [測試8]那我們看看,有老的資料檔案備份,插
#  入的資料在正常shutdown 後用create controlfile noresetlogs
#  方法來恢復控制檔案,能不能恢復
#######################################################      
SQL> STARTUP
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69607
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
~~~~~~~~~~~~~~~~~~~~~~~~
刪除控制檔案
刪除USERS01.DBF
~~~~~~~~~~~~~~~~~~~~~~~~
SQL> STARTUP NOMOUNT
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位於第 1 行:
ORA-01113: ?? 5 ??????
ORA-01110: ???? 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

SQL> RECOVER DATABASE;
完成介質恢復。
SQL> ALTER DATABASE  OPEN;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok
完全恢復了



  
######################################################### 
# [1.2] 有RMAN的autobackup,catalog異常                      
#########################################################      
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> exit
C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"
恢復管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
連線到目標資料庫: pdf(未安裝)
正在使用目標資料庫控制檔案替代恢復目錄
RMAN> restore controlfile from autobackup;
啟動 restore 於 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 02/25/2005 17:21:52
RMAN-06495: must explicitly specify DBID with SET DBID command
RMAN> exit
所以要使用RMAN,那麼必須預先知道DBID
如果我們知道(DBID=3171861129)
RMAN> set dbid=3171861129  -->>注意如果startup nomount在RMAN上執行就不需要指定DBID
正在執行命令: SET DBID
RMAN> restore controlfile from autobackup;
啟動 restore 於 25-2月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=13 devtype=DISK
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050225
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050224
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050223
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050222
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050221
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050220
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050219
通道 ORA_DISK_1: 沒有找到 7 天之內的自動備份
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 02/25/2005 17:26:46
RMAN-06172: no autobackup found or specified handle is not a valid copy or piece
由於catalog壞了,所以備份資訊沒有了,但是自動控制檔案備份提供了特殊的格式,可以不讀取catalog或者控制檔案資訊
來恢復控制檔案
我們看到,現在RMAN不能自動找到自動備份的路徑.
RMAN> SET CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/temp/%F';  -->>透過指定的路徑就可以恢復了
正在執行命令: SET CONTROLFILE AUTOBACKUP FORMAT
RMAN> restore controlfile from autobackup ;
啟動 restore 於 25-2月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 尋找以下日期的自動備份: 20050225
通道 ORA_DISK_1: 已找到的自動備份: /temp/c-3171861129-20050225-00
通道 ORA_DISK_1: 從自動備份復原控制檔案已完成
正在複製控制檔案
輸出檔名=C:\ORACLE\ORADATA\PDF\CONTROL01.CTL
輸出檔名=C:\ORACLE\ORADATA\PDF\CONTROL02.CTL
輸出檔名=C:\ORACLE\ORADATA\PDF\CONTROL03.CTL
完成 restore 於 25-2月 -05

==>>用冷備來恢復資料庫
用冷備的控制檔案和資料檔案
SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> select count(*) from tab;
select count(*) from tab
                     *
ERROR 位於第 1 行:
ORA-01219: ??????: ???????????

SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-00314: ?? 1 (?? 1)?????  ?  ???
ORA-00312: ???? 1 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  -->>這裡REDO是無用的,但是因為沒有對REDO進行備份,存在他就打不開

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01139: RESETLOGS ???????????????

SQL> alter database open noresetlogs;
alter database open noresetlogs
*
ERROR 位於第 1 行:
ORA-01139: RESETLOGS ???????????????

SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-00314: ?? 1 (?? 1)?????  ?  ???
ORA-00312: ???? 1 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'

SQL>  alter database clear logfile group 1;
資料庫已更改。
SQL>  alter database clear logfile group 2;
資料庫已更改。
SQL>  alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR 位於第 1 行:
ORA-00350: ?? 3 (?? 1) ?????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'

SQL>  alter database clear UNARCHIVED logfile group 3;
alter database clear UNARCHIVED logfile group 3
*
ERROR 位於第 1 行:
ORA-00338: ?? 3 (?? 1) ???????
ORA-00312: ???? 3 ?? 1: 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'
方法1
SQL> recover database using backup controlfile;
ORA-00279: ?? 48540 (? 02/28/2005 10:06:38 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 48540 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile using cancel;
ORA-01906: ?? BACKUP ???

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 68658 (? 02/28/2005 10:22:51 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 68658 ???? 1 ???? # 4 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL>
SQL> alter database open resetlogs;
資料庫已更改。
####################################################
# [方法2] --使用帶resetlogs的建立控制檔案trace
####################################################
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG  --這裡我們用了resetlogs
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open resetlogs;
資料庫已更改。
~~~~~~~~~~~~~~~
這將丟失部分資料
~~~~~~~~~~~~~~~
#############################################
# [方法3] 使用noresetlog的trace來恢復
#############################################
SQL> shutdown abort 
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>

SQL> CREATE CONTROLFILE REUSE DATABASE "DF" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\PDF\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\PDF\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\PDF\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\PDF\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\PDF\INDX01.DBF',
17    'C:\ORACLE\ORADATA\PDF\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\PDF\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-01113: 檔案 1 需要介質恢復
ORA-01110: 資料檔案 1: 'C:\ORACLE\ORADATA\PDF\SYSTEM01.DBF'

SQL> recover database ;  --因為是shutdown abort關閉,所以需要恢復
完成介質恢復。
SQL> alter database open;
資料庫已更改。
#############################################
# [方法4] 那我們對資料庫的資料檔案控制檔案和
#         線上日誌檔案都做備份會需要恢復嗎?
#############################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
將控制檔案,資料檔案,線上日誌檔案都進行備份
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select count(*) from test;
  COUNT(*)
----------
     12330
SQL> create table arch (status varchar(2));
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
將控制檔案,資料檔案,線上日誌檔案都進行還原
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select count(*) from test;
  COUNT(*)
----------
     12330
SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位於第 1 行:
ORA-00942: 表或檢視不存在
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     1
下一個存檔日誌序列   3
當前日誌序列           3
~~~~~~~~~~~~~~~~~~~~~~~~~~~
資料庫冷備份如果包括所有資料
檔案控制檔案和線上日誌,那麼
資料庫可以直接開啟,如果沒有在
線日誌,那麼需要create controlfile
... resetlogs;
或者recover database until cancel;
alter database open resetlogs;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#####################################################
#  但是由於線上日誌也被覆蓋了,前面的歸檔3和在序列4已
#  經沒有應用,那麼我們序列4雖然被強制覆蓋了,那麼3其實
#  是被歸檔了,那麼我們建的arch表是不是可以恢復出來呢?
#  這裡我們看看能不能備份(做完冷備份後的控制檔案)控制
#  檔案來進行恢復
#  [測試5] 我們模擬線上日誌損壞,使用備份控制檔案,有資料檔案的備份的恢復
####################################################
SQL>  create table arch (status varchar(2));
表已建立。
SQL>  alter system switch logfile;
系統已更改。
SQL>  insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。

alter database backup controlfile to 'C:\oracle\oradata\testdb\bak2\controlfile.ctl';
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
複製原來的冷備份中的資料檔案和線上日誌(其實線上日誌沒有用啦),不複製原來冷備份的控制檔案
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database using backup controlfile;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69776 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF

ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01113: 檔案 1 需要介質恢復
ORA-01110: 資料檔案 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69776 (在 02/28/2005 11:23:24 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69776 對於執行緒 1 是按序列 # 4 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*) from arch;
  COUNT(*)
----------
         0
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~成功了,結果是有表arch,但沒有資料,也就是沒有應用線上日誌,其實這裡如果不還原線上日誌(反而來攪亂),
我們是可以recover database 進行完全恢復的,因為控制檔案其實也是當前的,如果使用後面備份的控制檔案,
因為該控制檔案已經在建arch表之後,也能進行恢復
上面的方法也是在線上日誌被破壞後,有原來的冷備份(或熱備份時),使用當前的控制檔案(其實已經不是當前的了,
我們在後面可以看到使用了using  backup controlfile)可以還原到最後的歸檔日誌,只是丟失線上日誌的資料.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



################################
[1.3] 有RMAN的備份,catalog正常
################################                                                                 
    --需要建立一個catalog庫    
   
   
   
   
################################   
[1.4] 控制檔案損壞,有trace,非活動在
    線日誌損壞 
################################
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     0
下一個存檔日誌序列   1
當前日誌序列           1
SQL> select count(*) from test;
  COUNT(*)
----------
     12330
SQL> create table arch (status varchar(2));
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     1
下一個存檔日誌序列   2
當前日誌序列           2
SQL>
    SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  CURRENT         
         2          0 YES UNUSED
         3          1 YES INACTIVE          --非線上日誌
GROUP#          MEMBER
----------      ----------------------------------------
3                C:\ORACLE\ORADATA\TESTDB\REDO03.LOG        
用ultraedit破壞日誌3        
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。                                     -->>非線上日誌破壞了,資料庫仍然能執行
SQL> alter system switch logfile;
系統已更改。
        
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  CURRENT
         3          1 YES INACTIVE
SQL> alter system switch logfile;  -->>當切換到日誌組3時報錯
alter system switch logfile
*
ERROR 位於第 1 行:
ORA-03113: 通訊通道的檔案結束
       
###########################
# [方法1] 使用clear group
###########################
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  INVALIDATED
         3          0 YES UNUSED
SQL> alter database clear logfile group 3;
alter database clear logfile group 3
*
ERROR 位於第 1 行:
ORA-00344: 無法重新建立聯機日誌 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 32) 程式無法訪問檔案,因為另一個程式正在使用此檔案。

SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  INVALIDATED
         3          0 YES CLEARING   --上面的語句已經執行了clear功能
        
SQL> alter database open;
資料庫已更改。             
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          4 NO  CURRENT
         2          3 YES INACTIVE
         3          0 YES CLEARING        --直接跳過損壞的日誌組
        
        
SQL> select count(*) from arch;
  COUNT(*)
----------
      6166        -->>資料沒有丟失
     
###########################
# [方法2] 使用trace resetlogs
###########################
SQL> create table arch (status varchar(2));
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL>  commit;
提交完成。
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     1
下一個存檔日誌序列   2
當前日誌序列           2
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES INACTIVE
         3          3 NO  CURRENT
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     1
下一個存檔日誌序列   3
當前日誌序列           3
SQL>
SQL>shutdown
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這時因為是正常shutdown,arch表狀態等於
no的資料已經寫到資料檔案中了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模擬日誌2錯誤
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  AR
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 10
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 10
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 10
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no            -->>我們發現這裡線上日誌中的資料沒有丟失
     12332 ok                                                   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
在這裡用resetlogs和noresetlogs建立控制檔案都不會丟失資料了,
因為正常shutdown資料已經寫到資料檔案中了
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
那麼我們假想使用了老的資料備份,那麼在前滾的時候會用到這部分資料嗎?
我們在模擬日誌2出錯後,複製資料檔案備份.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [測試3] 資料檔案損壞,控制檔案損壞,有trace ,
#         使用resetlogs,非線上日誌損壞
###############################################
SQL> create table arch (status varchar(2));  --歸檔1
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects; --在歸檔2
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES INACTIVE
         3          3 NO  CURRENT
SQL>
SQL>
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
這裡模擬日誌檔案組2錯誤,控制檔案損壞,資料檔案損壞
SQL>
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
還原資料檔案
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL>  CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2   --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3       MAXLOGFILES 5
  4       MAXLOGMEMBERS 3
  5       MAXDATAFILES 100
  6       MAXINSTANCES 1
  7       MAXLOGHISTORY 226
  8   LOGFILE
  9     GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10     GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11     GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12   -- STANDBY LOGFILE
13   DATAFILE
14     'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15     'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16     'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17     'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18     'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19   CHARACTER SET ZHS16GBK
20   ;
控制檔案已建立
SQL> alter database mount
  2  ;
alter database mount
*
ERROR 位於第 1 行:
ORA-01100: ??????

SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database using backup controlfile using cancel;
ORA-01906: 需要 BACKUP 關鍵字

SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL>  select count(*),status from arch group by status;
select count(*),status from arch group by status
                             *
ERROR 位於第 1 行:
ORA-00942: 表或檢視不存在

SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位於第 1 行:
ORA-00942: 表或檢視不存在

SQL> select count(*) from test;
  COUNT(*)
----------
     12330           
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    
用resetlogs就不會完全恢復了,因為資料檔案也還原了,
所以要讀線上日誌進行前滾,可現在是resetlogs
那我們用noresetlogs來建立控制檔案會怎麼樣呢?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [測試4] 資料檔案損壞,控制檔案損壞,有trace ,
#         使用noresetlogs,非線上日誌損壞 ,shutdown abort
###############################################    
    
SQL> shutdown
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69641
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 YES INACTIVE
         2          6 NO  CURRENT
         3          4 YES INACTIVE
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> exit
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 16:29:44 2005
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
已連線到空閒例程。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M  --這個非線上日誌丟了
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\testdb\REDO03.LOG'???
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M --刪除日誌3
11  -- STANDBY LOGFILE
12  DATAFILE
13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
18  CHARACTER SET ZHS16GBK
19  ;
控制檔案已建立
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 69594 (? 03/02/2005 16:27:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69594 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

已應用的日誌。
完成介質恢復。
SQL> alter database open;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 af
      6166 no
     98656 ok
這種情況配合noresetlogs可以完全恢復.   
      
                  


[ Last edited by fly115 on 2005-3-21 at 19:56 ]
  
UID393 帖子3566 精華23 積分3803 流通積分3803 點 金錢0 O元 閱讀許可權225 線上時間173 小時 註冊時間2003-1-21 最後登入2008-8-27 檢視詳細資料
 TOP
 
fly115
超級版主

個人空間 發短訊息 加為好友 當前離線  4樓 大 中 小 發表於 2005-3-19 18:00  只看該作者

################################                                                                     
# [1.5] 有trace,活動線上日誌損壞   
################################
################################                                                             
# [1.5.1] 有trace,活動線上日誌損壞,正常shutdown或是當前的資料檔案  
################################
SQL> create table arch (status varchar(2));
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          1 YES ACTIVE
         3          3 NO  CURRENT
    
SQL> shutdown  --正常關閉資料庫
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。

此時模擬刪除當前線上日誌組3
SQL>
SQL>
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open resetlogs;
資料庫已更改。
   
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     12332 ok
-->>沒有丟失任何資料,因為你的資料都已經寫到資料檔案裡了    
#########################################                                                  
# [1.5.2] 有trace,活動線上日誌損壞,shutdown abort 或是非當前的資料檔案
          ,當前線上日誌檔案損壞         
#########################################
####################################################
[測試1] shutdown abort,備份控制檔案或者resetlog的trace,
沒有資料檔案備份,採用強制開啟資料庫的方法
####################################################
SQL> create table arch (status varchar(2));           
                                                          
表已建立。                                                    
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL>  select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 YES ACTIVE
         2          3 NO  CURRENT
         3          1 YES INACTIVE
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-00313: 無法開啟日誌組 1 (執行緒 1) 的成員
ORA-00312: 聯機日誌 1 執行緒 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'
ORA-27047: 無法讀取檔案的標題塊
OSD-04006: ReadFile() 失敗, 無法讀取檔案
O/S-Error: (OS 38) 到達檔案結尾。

SQL> alter database clear logfile group 1;
alter database clear logfile group 1
*
ERROR 位於第 1 行:
ORA-01624: 執行緒1的緊急恢復需要日誌1
ORA-00312: 聯機日誌 1 執行緒 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 70123 (? 02/28/2005 15:22:05 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 70123 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

ORA-01112: ???????
我們看到如果是abort DOWN機的話,開啟資料庫都需要應用線上活動日誌
這時必須加隱含引數強制開啟資料庫,並進行匯出,重建資料庫,匯入業務資料
SQL> show parameter spfile                                                                               
                                                                                                         
NAME                                 TYPE        VALUE                                                   
------------------------------------ ----------- -----------------------------                           
spfile                               string      %ORACLE_HOME%\DATABASE\SPFILE                           
                                                 ORACLE_SID%.ORA                                         
                                                                                                         
                                                                                                         
SQL> create pfile='pfiletest.ora' from spfile;                                                           
                                                                                                         
檔案已建立。                                                                                             
                                                                                                         
SQL> create pfile='c:\pfiletest.ora' from spfile;                                                        
                                                                                                         
檔案已建立。                                                                                             
編輯c:\pfiletest.ora                                                                                     
增加三個引數                                                                                             
                                                                                                         
_allow_resetlogs_corruption=true                                                                         
_corrupted_rollback_segments=true                                                                        
_offline_rollback_segments=true                                                                          
                                                                                                         
SQL> shutdown immediate                                                                                  
ORA-01109: 資料庫未開啟                                                                                  
                                                                                                         
                                                                                                         
已經解除安裝資料庫。                                                                                         
ORACLE 例程已經關閉。                                                                                    
SQL>                                                                                                     
SQL>                                                                                                     
SQL>                                                                                                     
SQL> startup pfile='c:\pfiletest.ora'                                                                    
ORACLE 例程已經啟動。                                                                                    
                                                                                                         
Total System Global Area  135338868 bytes                                                                
Fixed Size                   453492 bytes                                                                
Variable Size             109051904 bytes                                                                
Database Buffers           25165824 bytes                                                                
Redo Buffers                 667648 bytes                                                                
資料庫裝載完畢。                                                                                         
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項                                          
                                                                                                         
                                                                                                         
SQL> alter database open resetlogs;                                                                      
alter database open resetlogs                                                                            
*                                                                                                        
ERROR 位於第 1 行:                                                                                       
ORA-01092: ORACLE 例程終止。強行斷開連線                                                                 
                                                                                                         
                                                                                                         
SQL>                                                                                                     
SQL>                                                                                                     
SQL> exit                                                                                                
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production                                             
With the Partitioning, OLAP and Oracle Data Mining options                                               
JServer Release 9.2.0.1.0 - Production中斷開                                                             
                                                                                                         
C:\>sqlplus "/as sysdba"                                                                                 
                                                                                                         
SQL*Plus: Release 9.2.0.1.0 - Production on 星期五 12月 31 14:03:09 2004                                 
                                                                                                         
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.                                      
                                                                                                         
已連線到空閒例程。                                                                                       
                                                                                                         
SQL> startup pfile='c:\pfiletest.ora'                                                                    
ORACLE 例程已經啟動。                                                                                    
                                                                                                         
Total System Global Area  135338868 bytes                                                                
Fixed Size                   453492 bytes                                                                
Variable Size             109051904 bytes                                                                
Database Buffers           25165824 bytes                                                                
Redo Buffers                 667648 bytes                                                                
資料庫裝載完畢。                                                                                         
資料庫已經開啟。                                                                                         
SQL>                                                                                                     

####################################################
# [測試2] shutdown abort,resetlog的trace,
#         有資料檔案備份,當前線上日誌損壞,控制檔案損壞,有trace
####################################################
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
11  -- STANDBY LOGFILE
12  DATAFILE
13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
18  CHARACTER SET ZHS16GBK
19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01192: ??????????
~~~~~~~~~~~~~~~~~~~~~~
如果是NORESETLOGS,那麼他要檢查當前的線上日誌,而現在沒有了
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\testdb\REDO01.LOG'???  -->>這個檔案不在了
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
11  -- STANDBY LOGFILE
12  DATAFILE
13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
18  CHARACTER SET ZHS16GBK
19  ;
CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-00200: ????????
ORA-00202: ????: 'C:\oracle\oradata\testdb\control01.ctl'  --這個檔案不能被覆蓋,刪除三個控制檔案
ORA-27086: skgfglk: ?????? - ?????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 5) >\>7CNJ!#

SQL> shutdown
ORA-01507: ??????

ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" RESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
10    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
11  -- STANDBY LOGFILE
12  DATAFILE
13    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
14    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
15    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
16    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
17    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
18  CHARACTER SET ZHS16GBK
19  ;
控制檔案已建立
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01152: ?? 1 ????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69616 (? 03/02/2005 16:53:52 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69616 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69661 (? 03/02/2005 16:53:54 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69661 ???? 1 ???? # 5 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok  --還原了部分資料,但不能還原線上日誌中的資料

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果資料庫是abort或者老的資料檔案備份,那麼就涉及到控制檔案和資料檔案不一致,需要恢復,就涉及到當前被破壞的線上日誌,
,啟動時仍然需要用線上活動日誌進行恢復.如果是正常的shutdown,而且沒有用老的資料備份,那麼控制檔案和資料檔案是一致的,
不需要當前線上日誌.而在abort或者老的資料檔案備份在這種情況下,只能用備份的datafile和備份的controlfile來做不完
全恢復,都將造成資料丟失。因此多重controlfile 和 online redo log file 很重要。通常情況下是在正常執行資料庫時,
當前線上日誌被破壞的,此時馬上會資料庫不正常DOWN機,也就出現1.5.2的情景
我們知道如果是abort關閉的,那麼有些事務是不完整的或者有些事務沒有被寫到資料檔案,在資料檔案中有這樣的標識,這樣,用
create controlfile ... noresetlogs或者resetlogs建立時讀取資料檔案頭資訊,該檔案在控制檔案資訊,比如結束SCN設定為無窮大)
開啟時就需要當前線上日誌恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
####################################################
# [測試3] shutdown abort,控制檔案損壞,備份控制檔案,
#         當前線上日誌損壞,有資料檔案備份
####################################################
還原原來備份的資料檔案,控制檔案
SQL> shutdown
ORA-01109: 資料庫未開啟
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69572 (? 03/02/2005 17:07:43 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69572 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617
SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69617 (? 03/02/2005 17:07:44 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69617 ???? 1 ???? # 5 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE#-1 CONTROLFILE_CHANGE#
------------------- -------------------
              68658               69617
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     98656 ok

######################################################                                               
# [1.5.3]  控制檔案損壞,如果trace不是最新的資料庫結構,如少了個資料檔案
######################################################   
SQL> create table arch (status varchar(2));
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  ACTIVE
         2          1 YES ACTIVE
         3          3 NO  CURRENT   
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m;
表空間已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
模擬控制檔案丟失
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database open;
資料庫已更改。
SQL> select name,status from v$datafile;
NAME                                         STATUS
--------------------------------------       -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF             ONLINE
C:\ORACLE\ORA92\DATABASE\MISSING00006        RECOVER --這個檔案現在是recover狀態
已選擇6行。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們發現C:\ORACLE\ORA92\DATABASE\MISSING00006並不存在,只不過是個標記而已
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';  --MISSING00006不要加路徑

資料庫已更改。
SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf';
完成介質恢復。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf' online;
資料庫已更改。
~~~~~~~~~~~~~~~~~~~~~~~~~
如果用備份控制檔案,且備份
控制檔案少了新增加的兩個檔案
,恢復時會提示錯誤,我們可以
用rename來解決
~~~~~~~~~~~~~~~~~~~~~~~~~
使用備份控制檔案
recover AUTOMATIC   database using backup controlfile until cancel
...      
ORA-00283: recovery session canceled due to errors                  
ORA-01244: unnamed datafile(s) added to controlfile by media recovery
ORA-01110: data file 3: '/oracle/dbs/db2.f'                         
ORA-01110: data file 2: '/oracle/dbs/db3.f'                         
~~~~~~~~~~~~~~~~~~~~
這是因為前滾時發現file#中
有兩個檔案,但控制檔案沒有
我們可以在v$datafile中看到
所以恢復中斷
~~~~~~~~~~~~~~~~~~~~
SELECT FILE#,NAME
FROM V$DATAFILE;
FILE#           NAME
--------------- ----------------------
1               /oracle/dbs/db1.f
2               /oracle/dbs/UNNAMED00002
3               /oracle/dbs/UNNAMED00003
這時對檔案進行改名就可以了
ALTER DATABASE RENAME FILE '/db/UNNAMED00002' TO '/oracle/dbs/db3.f';
ALTER DATABASE RENAME FILE '/db/UNNAMED00003' TO '/oracle/dbs/db2.f';
RECOVER AUTOMATIC DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL


######################################################                               
# [1.5.4] 控制檔案損壞,如果trace不是最新的資料庫結構,如少了個只讀資料檔案
###################################################### 

SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.dbf'
size 10m ;
表空間已更改。                 
SQL> alter tablespace tools read only;
表空間已更改。
   
    SQL> select name,ENABLED
  2   from v$datafile;
NAME                                            ENABLED
---------------------------------------         ----------   
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                READ ONLY
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                READ WRITE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF                READ ONLY
已選擇6行。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> select name from v$datafile;
NAME
---------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
SQL> alter database open;
資料庫已更改。
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORA92\DATABASE\MISSING00006  --OPEN時增加了不認識的檔名
已選擇6行。
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOL
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORA92\DATABASE\TOOLS02.D
BF'
*
ERROR 位於第 1 行:
ORA-01511: 重新命名日誌/資料檔案時出錯
ORA-01141: 重新命名資料檔案 6 時出錯 - 未找到新檔案
'C:\ORACLE\ORA92\DATABASE\TOOLS02.DBF'
ORA-01111: 資料檔案 6 名稱未知 - 請重新命名以更正檔案
ORA-01110: 資料檔案 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。
*
ERROR 位於第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF' offline;
資料庫已更改。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline;
alter database datafile 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF' offline
*
ERROR 位於第 1 行:
ORA-01516: ????????, ????????? 'C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF'

SQL> alter database open ;
資料庫已更改。
SQL> alter database datafile 'MISSING00006' offline;  -->>注意只讀表空間必須先offline,而且注意MISSING00006不能寫全路徑
資料庫已更改。

SQL> alter database rename file  'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\TOO
LS02.DBF';
資料庫已更改。
SQL> alter tablespace tools online;
表空間已更改。
方法2
SQL> SHUTDOWN
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> STARTUP NOMOUNT
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\testdb\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\testdb\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\testdb\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\testdb\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\testdb\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\testdb\INDX01.DBF',
17    'C:\ORACLE\ORADATA\testdb\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\testdb\TOOLS02.DBF',  --建立語句中加入該資料檔案
19    'C:\ORACLE\ORADATA\testdb\USERS01.DBF'
20  CHARACTER SET ZHS16GBK
21  ;
控制檔案已建立
SQL> SELECT NAME FROM V$DATAFILE;
NAME
---------------------------------------------------------------------------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF
已選擇6行。
SQL> ALTER DATABASE OPEN;
ALTER DATABASE OPEN
*
ERROR 位於第 1 行:
ORA-01113: ?? 4 ??????
ORA-01110: ???? 4: 'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF'

SQL> RECOVER TABLESPACE TOOLS;
完成介質恢復。
SQL> ALTER DATABASE OPEN;
資料庫已更改。

##################################             
# [1.6] 使用備份的控制檔案進行恢復
#                    
##################################
前面有很多例子


 
  
UID393 帖子3566 精華23 積分3803 流通積分3803 點 金錢0 O元 閱讀許可權225 線上時間173 小時 註冊時間2003-1-21 最後登入2008-8-27 檢視詳細資料
 TOP
 
fly115
超級版主

個人空間 發短訊息 加為好友 當前離線  5樓 大 中 小 發表於 2005-3-19 18:03  只看該作者

################################################                                                    
# [1.7] 資料檔案損壞,且沒有備份,沒有備份控制檔案,
#       且其他資料檔案備份中都是在該資料檔案建立後
#       的備份
################################################                                                            
################################################                                                    
# [測試1](resetlogs前建立的資料檔案),資料檔案丟失,沒有備份,控制檔案損壞,有備份控制檔案,但備份控制檔案後於該檔案重建日期
#         使用resetlogs開啟資料庫,所以沒有資料檔案自建立以來所有的日誌,
#         因為前面的日誌被擷取了,(所以resetlog後必須要有備份,
#         除非是resetlogs後建立的資料檔案,可以透過create datafile來恢復)
#         當然如果有resetlogs後的控制檔案及相關的資料,也可以完全恢復,參見1.12
#################################################
還原原來的資料檔案和控制檔案
然後SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。  
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 對於執行緒 1 是按序列 # 13 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto -->>使用auto恢復也是成功
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORA92\RDBMS\ARC00013.001'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> recover database using backup controlfile until cancel; -->>這個cancel是表示每次應用一個日誌時都提示一下,直到輸入cancel後結束
ORA-00279: 更改 1069386 (在 02/25/2005 15:47:59 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORA92\RDBMS\ARC00013.001
ORA-00280: 更改 1069386 對於執行緒 1 是按序列 # 13 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL} 
cancel  --輸入cancel恢復成功 -->>cancel選項允許每次前滾一個日誌檔案,當需要停止恢復時,輸入cancel
                                 ,在這種方式下不會自動運用聯機日誌檔案.
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。

SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS02.DBF                         ONLINE
已選擇6行。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
在資料庫開啟的狀況下用ULTRAEDIT破壞檔案USERS01.DBF
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' offline;
資料庫已更改。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF' ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
*
ERROR 位於第 1 行:
ORA-01181: ??5????? RESETLOGS ???????????
ORA-01110: ???? 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因為使用resetlogs開啟資料庫,所以沒有資料檔案自建立以來所有的日誌,因為前面的日誌被擷取了
(所以resetlog後必須要有備份,除非是resetlogs後建立的資料檔案,可以透過create datafile來恢復)
換句話說,因為資料檔案在建立的時候的建立時間點和相關資訊儲存在控制檔案中!控制檔案丟失的話
資料檔案的建立時候的資訊丟失,則資料庫無從知道要 從建立檔案建立時候開始recover datafile
需要從哪個歸檔日誌開始。也就無法知道該資料檔案是否可以從現有歸檔日誌恢復
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
################################################                                                    
# (resetlog是在資料檔案建立前或者控制檔案包含了建立該資料檔案的起始資訊)
          那我們測試resetlogs後建立的資料檔案被丟失,沒有備份的恢復方法
          假設前面的users01沒有破壞,資料庫被開啟
################################################         
分兩種
#####################################################################################################
# [測試2] 控制檔案正常,資料檔案丟失,資料檔案丟失沒有備份,
#         也就說丟失的資料檔案建立在該控制檔案中的,該控制檔案也沒有被trace重新整理,那控制檔案就包含了該資料檔案自建立以來的所有資訊
#####################################################################################################
SQL> shutdown
ORA-01109: ??????
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL>
SQL>
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25M;
表空間已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES INACTIVE
         3          4 YES ACTIVE
SQL> select file# ,name from v$datafile;
     FILE#            NAME
----------        ---------------------------------
         1        C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2        C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3        C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4        C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5        C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6        C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
已選擇6行。
SQL> select segment_name from dba_extents where FILE_ID=6;
SEGMENT_NAME
--------------------------------------------------------------------------------
ARCH
SQL> shutdown abort
ORACLE 例程已經關閉。
用ultraedit編輯檔案USERS02.DBF
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> select name ,status from v$datafile;
NAME                                                STATUS
---------------------------------------             -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF                ONLINE
已選擇6行。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'; --online也可以create
資料庫已更改。 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
system tablespace 的第一個datafile 是不能用 alter database create datafile 命令
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
完成介質恢復。
SQL> alter database open;
資料庫已更改。
SQL> select count(*) ,status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok

完全恢復了
#####################################################################################################
# [測試3] 控制檔案沒有丟失,資料檔案丟失,資料檔案丟失沒有備份
####################################################################################################
-->>那我們看看在offline情況下,recover database 會不會丟失資料
alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' size 25M;
SQL> select file#,name from v$datafile;
     FILE# NAME
---------- --------------------------------------------------
         1 C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2 C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3 C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4 C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6 C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
         7 C:\ORACLE\ORADATA\TESTDB\USERS03.DBF
        
SQL> select segment_name from dba_extents where FILE_ID= 7;
未選定行        
        
SQL> insert into arch select * from arch;
已建立104822行。
SQL> commit;
提交完成。
SQL> select segment_name from dba_extents where FILE_ID= 7;
SEGMENT_NAME
-------------------------------------------------------------------
ARCH
用ultraedit編輯檔案USERS03.DBF迫害該檔案
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01157: ????????? 7 - ??? DBWR ????
ORA-01110: ???? 7: 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF'
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' offline;
資料庫已更改。
SQL> alter database create datafile  'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF';
資料庫已更改。
SQL> recover datafile  'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF';
完成介質恢復。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS03.DBF' online;
資料庫已更改。
SQL> alter database open;
資料庫已更改。
SQL> select count(*) ,status from arch group by status;
  COUNT(*) ST
---------- --
     12332 no
    197312 ok
   
    --資料沒有丟失
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   
那我們如果使用recover database 方式恢復offline的資料檔案呢
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' size 25M;
表空間已更改。
SQL> select file#,name from v$datafile;
     FILE# NAME
---------- --------------------------------------------------
         1 C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
         2 C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
         3 C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
         4 C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
         5 C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
         6 C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
         7 C:\ORACLE\ORADATA\TESTDB\USERS03.DBF
         8 C:\ORACLE\ORADATA\TESTDB\USERS04.DBF
已選擇8行。
SQL> insert into arch select * from arch;
已建立209644行。
SQL> select segment_name from dba_extents where FILE_ID= 8;
SEGMENT_NAME
----------------------------------------------------------------------------
ARCH
SQL> commit;
提交完成。
SQL>
SQL>
SQL> shutdown abort
ORACLE 例程已經關閉。
刪除檔案USERS04
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' offline;
資料庫已更改。
SQL> recover datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF';
ORA-00283: ??????????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'
ORA-01157: ????????? 8 - ??? DBWR ????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'

SQL> alter database create datafile  'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF';
資料庫已更改。
SQL> select name,status from v$datafile;
NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS03.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS04.DBF               RECOVER
已選擇8行。
SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' offline;
資料庫已更改。
SQL> recover database;   --我們看到offline的資料檔案恢復無效,到後來還是要在online之後再恢復一把
完成介質恢復。
SQL>  select count(*) ,status from arch group by status;
select count(*) ,status from arch group by status
                              *
ERROR 位於第 1 行:
ORA-01219: ??????: ???????????

SQL> alter database datafile 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF' online;
資料庫已更改。
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01113: ?? 8 ??????
ORA-01110: ???? 8: 'C:\ORACLE\ORADATA\TESTDB\USERS04.DBF'

SQL> recover database;
完成介質恢復。
SQL> alter database open;
資料庫已更改。
SQL> select count(*) ,status from arch group by status;
  COUNT(*) ST
---------- --
     24664 no
    394624 ok
   
#####################################################################################################
# [測試4] 控制檔案丟失,資料檔案丟失,沒有備份,有trace,那我們看看為什麼trace會造成控制檔案的頭中資料檔案建立的資訊被修改
# 無法實現create datafile功能
#################################################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25m;
表空間已更改。
SQL> alter database backup controlfile to trace;
資料庫已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup nomount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF',
19    'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
20  CHARACTER SET ZHS16GBK
21  ;
控制檔案已建立
SQL> alter database open;
資料庫已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
*
ERROR 位於第 1 行:
ORA-01178: 檔案 6 在最後一個 CREATE CONTROLFILE 之前建立,無法重新建立
ORA-01110: 資料檔案 6: 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
所以執行了create controlfile後一定要先做個全備份
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#####################################################################################################
# [測試5]控制檔案沒有建立資料檔案的起始資訊,使用不同trace的方法
#####################################################################################################
SQL> alter database open;
資料庫已更改。
SQL>
SQL>
SQL>
SQL>
SQL> col name format a50
SQL> select name ,status from v$datafile;
NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
SQL> alter tablespace users add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
size 25m;
表空間已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 YES ACTIVE
SQL> select name ,status from v$datafile;
NAME                                               STATUS
-------------------------------------------------- -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF              SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF             ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF               ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS02.DBF               ONLINE
已選擇6行。
SQL> alter database backup controlfile to 'C:\oracle\oradata\testdb\controlfile
ak.ctl';  --該控制檔案包含了USERS02的頭資訊
資料庫已更改。
SQL> alter database backup controlfile to trace;
資料庫已更改。
此時用ultraedit破壞檔案USERS02
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> exit
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開
刪除3個控制檔案

SQL> startup nomount;
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF',
19    'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
20  CHARACTER SET ZHS16GBK
21  ;
CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
*
ERROR 位於第 1 行:
ORA-01503: CREATE CONTROLFILE ??
ORA-01565: ????'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'???
ORA-27047: ??????????
OSD-04006: ReadFile() J'0\, N^7(6AH!ND<~
O/S-Error: (OS 38) 5=4oND<~=aN2!#

SQL> CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  2  --  SET STANDBY TO MAXIMIZE PERFORMANCE
  3      MAXLOGFILES 5
  4      MAXLOGMEMBERS 3
  5      MAXDATAFILES 100
  6      MAXINSTANCES 1
  7      MAXLOGHISTORY 226
  8  LOGFILE
  9    GROUP 1 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  SIZE 100M,
10    GROUP 2 'C:\ORACLE\ORADATA\TESTDB\REDO02.LOG'  SIZE 100M,
11    GROUP 3 'C:\ORACLE\ORADATA\TESTDB\REDO03.LOG'  SIZE 100M
12  -- STANDBY LOGFILE
13  DATAFILE
14    'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF',
15    'C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF',
16    'C:\ORACLE\ORADATA\TESTDB\INDX01.DBF',
17    'C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF',
18    'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
19  CHARACTER SET ZHS16GBK
20  ;
控制檔案已建立
SQL> alter database mount
  2  ;
alter database mount
*
ERROR 位於第 1 行:
ORA-01100: ??????

SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> col name format a60
SQL> select name ,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       RECOVER
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          RECOVER
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         RECOVER
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         RECOVER
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
*
ERROR 位於第 1 行:
ORA-01516: 不存在的日誌檔案, 資料檔案或臨時檔案
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'

SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' as 'C
:\ORACLE\ORADATA\TESTDB\USERS02.DBF' reuse ;
alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF' as 'C:\ORA
CLE\ORADATA\TESTDB\USERS02.DBF' reuse
*
ERROR 位於第 1 行:
ORA-01516: 不存在的日誌檔案, 資料檔案或臨時檔案
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'

SQL> recover database;
完成介質恢復。
SQL> alter database open;
資料庫已更改。
SQL> select name,status from v$datafile;
NAME                                                         STATUS
------------------------------------------------------------ -------
C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF                        SYSTEM
C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF                       ONLINE
C:\ORACLE\ORADATA\TESTDB\INDX01.DBF                          ONLINE
C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF                         ONLINE
C:\ORACLE\ORADATA\TESTDB\USERS01.DBF                         ONLINE
C:\ORACLE\ORA92\DATABASE\MISSING00006                        RECOVER
已選擇6行。
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USER
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USERS02.D
BF'
*
ERROR 位於第 1 行:
ORA-01511: 重新命名日誌/資料檔案時出錯
ORA-01141: 重新命名資料檔案 6 時出錯 - 未找到新檔案
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ORA-01111: 資料檔案 6 名稱未知 - 請重新命名以更正檔案
ORA-01110: 資料檔案 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27047: 無法讀取檔案的標題塊
OSD-04006: ReadFile() 失敗, 無法讀取檔案
O/S-Error: (OS 38) 到達檔案結尾。

SQL> alter database datafile 'MISSING00006' offline;
資料庫已更改。
SQL> alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USER
S02.DBF';
alter database rename file 'MISSING00006' to 'C:\ORACLE\ORADATA\TESTDB\USERS02.D
BF'
*
ERROR 位於第 1 行:
ORA-01511: 重新命名日誌/資料檔案時出錯
ORA-01141: 重新命名資料檔案 6 時出錯 - 未找到新檔案
'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ORA-01111: 資料檔案 6 名稱未知 - 請重新命名以更正檔案
ORA-01110: 資料檔案 6: 'C:\ORACLE\ORA92\DATABASE\MISSING00006'
ORA-27047: 無法讀取檔案的標題塊
OSD-04006: ReadFile() 失敗, 無法讀取檔案
O/S-Error: (OS 38) 到達檔案結尾。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
資料庫開啟了,但資料檔案USERS02無法恢復,因為控制檔案無法記錄該檔案建立時的資訊,所以也無法實現rename file 'MISSING00006'
我們再來驗證一下控制檔案資訊與資料檔案頭資訊的關係
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###################################################################################
# [測試6]  資料檔案損壞,且沒有備份,控制檔案使用備份控制檔案,且控制檔案是在該資料檔案建立後的控制檔案
###################################################################################
那我們用剛開始的備份的控制檔案可不可以呢?
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL>
SQL> alter database open;
資料庫已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL>
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ize 10m;
表空間已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL>
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL> alter database backup controlfile to 'c:\control01.ctl';
資料庫已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> exit
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開
C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 18:17:11 2005
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
已連線到空閒例程。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
資料庫已更改。
SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69563 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69563 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69606 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69606 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69672 (? 03/02/2005 18:13:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF
ORA-00280: ?? 69672 ???? 1 ???? # 6 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     12332 af
      6166 no
     98656 ok
#############################################################################################        
[1.8] 資料檔案損壞,且沒有備份,控制檔案使用備份控制檔案,且控制檔案是在該資料檔案建立前的控制檔案 
    參見1.7的測試1
#############################################################################################   
###################################################################################
# [1.9]  資料檔案損壞,且沒有備份,控制檔案使用備份控制檔案,且控制檔案是在該資料檔案建立後的控制檔案
###################################################################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL>
SQL> alter database open;
資料庫已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL>
SQL> alter tablespace tools add datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF'
ize 10m;
表空間已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile; --一定要歸檔
系統已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL>
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> alter database open;
資料庫已更改。
SQL> alter database backup controlfile to 'c:\control01.ctl';  --該控制檔案有資料檔案頭資訊
資料庫已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> exit
從Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中斷開
C:\Documents and Settings\lifeng.fang>
C:\Documents and Settings\lifeng.fang>
模擬控制檔案破壞,刪除控制檔案,還原備份的控制檔案,還原老的所有的資料檔案,出了users02.dbf
C:\Documents and Settings\lifeng.fang>sqlplus "sys/sunsdl as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期三 3月 2 18:17:11 2005
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
已連線到空閒例程。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database create datafile 'C:\ORACLE\ORADATA\TESTDB\USERS02.DBF';
資料庫已更改。
SQL> recover database using backup controlfile ;
ORA-00279: ?? 69456 (? 03/02/2005 10:26:30 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: ?? 69456 ???? 1 ???? # 3 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69563 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69563 ???? 1 ???? # 4 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69606 (? 03/02/2005 18:12:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69606 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69672 (? 03/02/2005 18:13:24 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF
ORA-00280: ?? 69672 ???? 1 ???? # 6 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_6.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69834 (? 03/02/2005 18:15:40 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_7.DBF
ORA-00280: ?? 69834 ???? 1 ???? # 7 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> alter database open resetlogs;
資料庫已更改。 
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
     12332 af
      6166 no
     98656 ok
##############################################################################################    
# [1.10] 資料檔案損壞,且沒有備份,沒有備份控制檔案,且其他資料檔案備份中都是在該資料檔案建立後的備份
##############################################################################################      

##############################################################################################
# [1.11] 損壞單個控制檔案
#        將好的控制檔案覆蓋損壞的控制檔案
##############################################################################################
##############################################################################################
# [1.12] 當前控制檔案做為備份控制檔案恢復,在當前線上日誌中有業務資料時的恢復    (通常沒有太大意義,只是想做一下resetlogs)
##############################################################################################
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL>
SQL>
SQL> alter database open;
資料庫已更改。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL>
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile;
ORA-00279: ?? 69399 (? 03/01/2005 15:58:22 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: ?? 69399 ???? 1 ???? # 4 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 69444 (? 03/01/2005 15:58:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69444 ???? 1 ???? # 5 ???
ORA-00278: ??????????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01113: ?? 1 ??????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
ORA-01991: ???????'C:\oracle\ora92\DATABASE\PWDtestdb.ORA'

SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69444 (? 03/01/2005 15:58:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: ?? 69444 ???? 1 ???? # 5 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
ORA-01547: ??: RECOVER ??? OPEN RESETLOGS ???????
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

ORA-01112: ???????

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR 位於第 1 行:
ORA-01194: ??1?????????????
ORA-01110: ???? 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

SQL> shutdown
ORA-01109: ??????

已經解除安裝資料庫。
ORACLE 例程已經關閉。
這裡我們看到是shutdown abort的,所以需要線上日誌恢復,但是使用備份控制檔案恢復則是不應用線上日誌的
如果不是shutdown abort,那麼就可以開啟,因為資料檔案一直是完整的
 
  
UID393 帖子3566 精華23 積分3803 流通積分3803 點 金錢0 O元 閱讀許可權225 線上時間173 小時 註冊時間2003-1-21 最後登入2008-8-27 檢視詳細資料
 TOP
 
fly115
超級版主

個人空間 發短訊息 加為好友 當前離線  6樓 大 中 小 發表於 2005-3-19 18:04  只看該作者

##############################################################################          
# [1.13] 在resetlogs前的RMAN備份如何應用到resetlogs後的 
##############################################################################          
                                                          
   

SQL> alter database open;
資料庫已更改。
SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位於第 1 行:
ORA-00942: ???????

SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。

已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> /
系統已更改。
SQL> /
系統已更改。
SQL> /
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
-->>模擬一個resetlogs
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database until cancel;
完成介質恢復。  -->>這裡我們後面可以注意到
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> alter system switch logfile;
系統已更改。
SQL> archive log list
資料庫日誌模式            存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     1
下一個存檔日誌序列   2
當前日誌序列           2
SQL> shutdown
ORA-01097: 無法在事務處理過程中關閉 - 首先提交或返回
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
-->>此時模擬刪除了users01.dbf
我們沒有resetlogs後的備份,想把resetlogs前備份的資料檔案恢復資料庫到resetlogs後的狀態
關鍵步驟.還原resetlogs前備份的資料檔案和控制檔案,不包括線上日誌(我們後面可以看到線上日誌包括了SCN 69628 - 69459)
SQL> select resetlogs_change# - 1 from v$database;
RESETLOGS_CHANGE#-1
-------------------
              68658
SQL> recover database using backup controlfile until change 69639;
ORA-00279: 更改 69257 (在 02/28/2005 11:08:18 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF
ORA-00280: 更改 69257 對於執行緒 1 是按序列 # 3 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69582 (在 03/02/2005 10:28:34 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF
ORA-00280: 更改 69582 對於執行緒 1 是按序列 # 4 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_3.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: 更改 69628 (在 03/02/2005 10:28:35 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69628 對於執行緒 1 是按序列 # 5 進行的
ORA-00278: 此恢復不再需要日誌檔案 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_4.DBF'

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> recover database using backup controlfile until change 69639;
ORA-00279: 更改 69628 (在 03/02/2005 10:28:35 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69628 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> select CONTROLFILE_CHANGE# from v$database;
CONTROLFILE_CHANGE#
-------------------
              69628
             
我們看到沒有恢復到69639,因為我還原的時候沒有把resetlogs前的線上日誌備份給還原,所以沒法前滾69628到69639             
SQL> shutdown
ORA-01109: 資料庫未開啟
已經解除安裝資料庫。
ORACLE 例程已經關閉。

-->>這裡還原resetlogs後的控制檔案
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes

SQL> select resetlogs_change# - 1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69639               69795

SQL> recover database;
ORA-00283: 恢復會話因錯誤而取消
ORA-01190: 控制檔案或資料檔案1來自於最後一個 RESETLOGS 之前
ORA-01110: 資料檔案 1: 'C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF'

那我們只能不完全恢復
SQL> recover database until cancel;
ORA-00279: ?? 69452 (? 03/01/2005 17:45:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_9.DBF
ORA-00280: ?? 69452 ???? 1 ???? # 9 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> recover database using backup controlfile until cancel;
ORA-00279: ?? 69452 (? 03/01/2005 17:45:23 ??) ???? 1 ????
ORA-00289: ??: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_9.DBF
ORA-00280: ?? 69452 ???? 1 ???? # 9 ???

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL> select count(*),status from arch group by status;
select count(*),status from arch group by status
                            *
ERROR 位於第 1 行:
ORA-01219: ??????: ???????????

SQL> alter database open resetlogs;
資料庫已更改。
SQL> select count(*),status from arch group by status;
  COUNT(*) ST
---------- --
      6166 no
     98656 ok  --我們沒有看到af狀態的
我們看到這裡需要線上日誌恢復,無法越過resetlogs恢復
好那我們在關鍵步驟那步把線上日誌也還原的話是否可以越過69628到69639 一直到69795
   
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> select count(*) from arch;
select count(*) from arch
                     *
ERROR 位於第 1 行:
ORA-00942: 表或檢視不存在

SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL>
SQL>
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> recover database until cancel;
完成介質恢復。
SQL> shutdown immediate
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69884
SQL> alter database open;
alter database open
*
ERROR 位於第 1 行:
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項

SQL> alter database open resetlogs;
資料庫已更改。
SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE# 
----------------- -------------------
            69889               69932
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL>
SQL>
SQL> recover database using backup controlfile until change 69888;     -->>這裡我們看到until change 69888與RESETLOGS_CHANGE#接上頭了,就是以為我們有備份的線上日誌
ORA-00279: 更改 69888 (在 03/02/2005 11:11:40 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69888 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69888
SQL>
SQL> shutdown
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
-->>這裡我們將resetlogs後的控制檔案備份還原(不包括resetlogs後的線上日誌)
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69889               69932
SQL> recover database ;
ORA-00283: 恢復會話因錯誤而取消
ORA-00314: 日誌 1 (執行緒 1),預計序號 1 與 5 不匹配
ORA-00312: 聯機日誌 1 執行緒 1: 'C:\ORACLE\ORADATA\TESTDB\REDO01.LOG'  -->>我們這裡看到恢復仍然到69889截止,而沒有恢復到69932
原因就是我們resetlogs後的線上日誌也要做備份.
#################################################################
#[測試1] 那我們在看看resetlogs前的資料檔案控制檔案和線上日誌都做了備份,
#        然後resetlogs後的控制檔案線上日誌都做備份的情況下,是不是能越過resetlogs
#################################################################
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> create table arch (status varchar(2)) tablespace users;
表已建立。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立6166行。
SQL> /
已建立12332行。
SQL> /
已建立24664行。
SQL> /
已建立49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          5 NO  CURRENT
         2          3 YES ACTIVE
         3          4 NO  ACTIVE
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL>
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
-->>模擬resetlogs
SQL> recover database until cancel;
完成介質恢復。
SQL> shutdown
ORA-01109: 資料庫未開啟

已經解除安裝資料庫。
ORACLE 例程已經關閉。
-->>這裡我們對所有的資料檔案控制檔案和線上日誌進行備份
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選項

SQL> alter database open resetlogs;
資料庫已更改。
SQL> select resetlogs_change# -1,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69808               69850
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
--這時我們備份控制檔案和線上日誌,因為我們需要69808 到 69850的資料
-->>這時我們把users01.dbf刪除
-->>還原resetlogs前的所有資料檔案控制檔案和線上日誌
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL>
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            68659               69804
SQL> recover database using backup controlfile until change 69808;
ORA-00279: 更改 69808 (在 03/02/2005 11:35:33 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69808 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: 無法開啟存檔日誌 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

SQL> recover database using backup controlfile until change 69808;
ORA-00279: 更改 69808 (在 03/02/2005 11:35:33 生成) 對於執行緒 1 是必需的
ORA-00289: 建議: C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF
ORA-00280: 更改 69808 對於執行緒 1 是按序列 # 5 進行的

指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
cancel
介質恢復已取消。
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#   --已經應用到了69808
----------------- -------------------
            68659               69808
SQL>
SQL>
SQL> shutdown
ORA-01109: 資料庫未開啟
-->>好這時我們就需要應用69808 到 69850的資料
-->>這時我們要想恢復69808 到 69850的資料就必須要resetlogs後的控制檔案,
我們從前面的CONTROLFILE_CHANGE#和ESETLOGS_CHANGE#就可以看的出來,只有他才能進行完全恢復到69850
-->>還原resetlogs後的控制檔案和線上日誌檔案
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL>  select resetlogs_change#,CONTROLFILE_CHANGE# from v$database;
RESETLOGS_CHANGE# CONTROLFILE_CHANGE#
----------------- -------------------
            69809               69850
SQL> recover database;
完成介質恢復。
SQL> alter database open;
資料庫已更改。
SQL> select count(*) ,status from arch group by status;
  COUNT(*) ST
---------- --
      6166 af
      6166 no
     98656 ok
     --這一次是真的越過resetlogs正確的完全恢復了
            
-->>注意切換歸檔是不是的序列號是不是當前序列號



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
必須使用TEMPORARY(一些資料檔案對檢查點不可用)或IMMEDIATE(所有資料檔案對
檢查點不可用)選項。在表空間再現聯機之前,那些資料檔案需要被恢復(資料檔案恢復或
表空間恢復)。如果檔案修復之後,重新聯機之前發生了資料庫崩潰,而該崩潰又要求執行不
完全的介質恢復的話,其後用來恢復資料庫的RESETLOGS選項將致使該離線表空間無效。恢
復該表空間的唯一方法是將以前的備份還原到另外一臺機器上,用存檔重作日誌實施恢復,
直到資料庫失敗前為止,這樣做顯然會浪費大量的時間和資源。因此在恢復之前,應當切記
檢查v$datafile確定所有的關鍵表空間是聯機的。但是,允許只讀表空間的資料檔案或透過
NORMAL選項離線的表空間,保持不變(因為它們已經是一致的了,不希望它們隸屬於恢復
操作)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

###############################################################################################
#                                  [2]. 非歸檔模式下的恢復(rman和常規恢復)                    #
###############################################################################################
~~~~~~~~~~~~~~~~~~
準備工作
~~~~~~~~~~~~~~~~~~ 

SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL> alter database noarchivelog;
資料庫已更改。
SQL> alter database open;
資料庫已更改。
SQL>
SQL> archive log list
資料庫日誌模式             非存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     0
當前日誌序列           1
SQL>
SQL>
SQL>
SQL>
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup -->>是spfile啟動的,所以不需要修改初始化引數就已經啟動了非存檔模式
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> archive log list
資料庫日誌模式             非存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     0
當前日誌序列           1
SQL>


###############################################
# [測試1] 資料庫在非歸檔模式,資料庫開啟
###############################################
SQL> startup -->>是spfile啟動的,所以不需要修改初始化引數就已經啟動了非存檔模式
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> archive log list
資料庫日誌模式             非存檔模式
自動存檔             啟用
存檔終點            C:\oracle\oradata\testdb\archive
最早的概要日誌序列     0
當前日誌序列           1
SQL>
C:\Documents and Settings\lifeng.fang>rman nocatalog target "sys/sunsdl"
恢復管理器: 版本9.2.0.1.0 - Production
Copyright (c) 1995, 2002, Oracle Corporation.  All rights reserved.
連線到目標資料庫: TESTDB (DBID=2334768642)
正在使用目標資料庫控制檔案替代恢復目錄
RMAN> show all;
RMAN 配置引數為:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'C:\ORACLE\ORA92\DATABASE\SNCFTESTDB.ORA'
; # default
RMAN> backup database include current controlfile;
啟動 backup 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
在備份集中包含當前的 SPFILE
備份集中包括當前控制檔案
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 03/03/2005 09:46:
04
ORA-19602: 無法按 NOARCHIVELOG 模式備份或複製活動檔案
~~~~~~~~~~~~~~~~~~~~~~~~~~
我們看到如果是NOARCHIVELOG 模式,
資料庫如果開啟則不能做RMAN備份
~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我們可以用RMAN複製控制檔案
RMAN> copy CURRENT CONTROLFILE TO 'c:\cf.cpy';
啟動 copy 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 已複製當前的控制檔案
輸出檔名=C:\CF.CPY
完成 copy 於 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [測試2] 資料庫在非歸檔模式,資料庫MOUNT,備份整個資料庫
###############################################
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
SQL>
RMAN> backup database include current controlfile;
啟動 backup 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
在備份集中包含當前的 SPFILE
備份集中包括當前控制檔案
輸入資料檔案 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
輸入資料檔案 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
輸入資料檔案 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
輸入資料檔案 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
輸入資料檔案 fno=00006 name=C:\ORACLE\ORADATA\TESTDB\USERS02.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 於 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\02GECED4_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:27
完成 backup 於 03-3月 -05
RMAN> backup tablespace users;
啟動 backup 於 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 於 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\03GECEG5_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 03-3月 -05
###############################################
# [測試3] 資料庫在非歸檔模式,資料庫MOUNT,備份表空間
###############################################
RMAN> backup tablespace users;
啟動 backup 於 03-3月 -05
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 於 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\03GECEG5_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:01
完成 backup 於 03-3月 -05
~~~~~~~~~~~~~~~~~~~~~~~~
注意表空間是邏輯概念,常規備份,
必須open資料庫後才能看到表空間
但是RMAN可以在mount下備份表空間
~~~~~~~~~~~~~~~~~~~~~~~~
###############################################
# [測試4] 資料庫在非歸檔模式,資料庫MOUNT,備份的表空間是常規OFFLINE的
###############################################
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如果使用TEMPORARY選項對錶空間進行離線,則資料庫仍然會對該表空間
的所有檔案進行一個檢查點,其中如果有個檔案IO損壞,那麼他對該檔案
不會執行檢查點,但是normal方式離線的話就會強制寫檢查點,所以如果
io物理損壞了,那麼NORMAL方式可能就離線不了了.假設表空間兩個檔案
T1,T2,如果T1寫錯誤而被離線.如果使用temporary選項,則ORACLE在使T1
離線前設檢查點檢查檔案D2.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> alter  tablespace users offline immediate;
alter  tablespace users offline immediate
*
ERROR 位於第 1 行:
ORA-01145: 除非啟用了介質恢復,否則不允許緊急離線

SQL> alter  tablespace users offline TEMPORARY;
表空間已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。

RMAN> backup tablespace users;
啟動 backup 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 於 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\09GECGJ0_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:03
完成 backup 於 03-3月 -05
SQL> alter database open;
資料庫已更改。
SQL> insert into arch select 'af' from dba_objects;
insert into arch select 'af' from dba_objects
            *
ERROR 位於第 1 行:
ORA-00376: 此時無法讀取檔案 5
ORA-01110: 資料檔案 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'

SQL> alter  tablespace users online;
表空間已更改。
SQL> insert into arch select 'af' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> alter  tablespace users offline TEMPORARY;
表空間已更改。
SQL> shutdown
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
資料庫裝載完畢。
RMAN> backup tablespace users;
啟動 backup 於 03-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=14 devtype=DISK
通道 ORA_DISK_1: 正在啟動 full 資料檔案備份集
通道 ORA_DISK_1: 正在指定備份集中的資料檔案
輸入資料檔案 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
通道 ORA_DISK_1: 正在啟動段 1 於 03-3月 -05
通道 ORA_DISK_1: 已完成段 1 於 03-3月 -05
段 handle=C:\ORACLE\ORA92\DATABASE\0AGECGNM_1_1 comment=NONE
通道 ORA_DISK_1: 備份集已完成, 經過時間:00:00:03
完成 backup 於 03-3月 -05

###############################################
# [測試5] 資料庫在非歸檔模式,資料庫MOUNT,shutdown abort,備份的表空間
###############################################
SQL> alter  tablespace users online;
表空間已更改。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'ok' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> insert into arch select * from arch;
已建立123320行。
SQL> /
已建立246640行。
SQL> /
已建立493280行。
SQL> /
已建立986560行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系統已更改。
SQL> insert into arch select 'no' from dba_objects;
已建立6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
    GROUP#  SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
         1          2 NO  ACTIVE
         2          1 NO  ACTIVE
         3          3 NO  CURRENT
SQL> shutdown abort
ORACLE 例程已經關閉。
SQL>
SQL>
SQL> startup mount
ORACLE 例程已經啟動。
Total System Global Area  101784276 bytes
Fixed Size                   453332 bytes
Variable Size              75497472 bytes
Database Buffers           25165824 bytes
Redo Buffers                 667648 bytes
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9522838/viewspace-2152569/,如需轉載,請註明出處,否則將追究法律責任。

相關文章