您好,登錄后才能下訂單哦!
小編給大家分享一下RMAN如何實現備份與恢復,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
#########################################################
#[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
看完了這篇文章,相信你對“RMAN如何實現備份與恢復”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。