oracle備份與恢復測試(五)

wangkxxe發表於2009-03-20
####################################################
# [測試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'???  --&gt>這個檔案不在了
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/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?*NDO/S-Error: (OS 5) >\>x7CNJ!#

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 ???

指定日誌: {=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'

指定日誌: {=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'

指定日誌: {=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/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 ???

指定日誌: {=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 ???

指定日誌: {=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'

指定日誌: {=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'

指定日誌: {=suggested | filename | AUTO | CANCEL}
ORA-00308: ???????? 'C:\ORACLE\ORADATA\TESTDB\ARCHIVE\1_5.DBF'
ORA-27041: ??????
OSD-04002: N^7(4r?*NDO/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 ???

指定日誌: {=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;  --&gt>注意只讀表空間必須先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] 使用備份的控制檔案進行恢復
#                    
##################################
前面有很多例子
 
 
################################################                                                    
# [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 進行的
 
 
指定日誌: {=suggested | filename | AUTO | CANCEL}
auto --&gt>使用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; --&gt>這個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 進行的

指定日誌: {=suggested | filename | AUTO | CANCEL} 
cancel  --輸入cancel恢復成功 --&gt>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

完全恢復了

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

oracle備份與恢復測試(五)
請登入後發表評論 登入
全部評論

相關文章