表空間不完全恢復(全備--備份控制檔案--刪除表空間andy--日誌檔案)

張衝andy發表於2017-01-12


為什麼會使用備份的控制檔案? 實際工作中主要有兩種情況:


第一種:當前控制檔案全部損壞,而資料檔案備份,控制檔案備份及當前日誌處於不同SCN版本,它們之間又增加過表空間(資料檔案)。
第二種:當前控制檔案沒有損壞,但想要恢復被刪除的表空間。


實驗3 :全備<老>--備份控制檔案<次新>--刪除表空間andy--日誌檔案<新>


情形:使用者使用正常操作命令刪除了表空間及其資料檔案,但之後又希望恢復刪除的表空間。全備裡有這個表空間的資料檔案。


分析:當使用者使用drop tablesapce xxx including contents and datafiles 這條DDL語句後,資料庫的結構發生了變更,涉及了三個地方。
a)控制檔案
b)該表空間下的資料檔案
c)系統表空間(資料字典)


特別提醒的是:當前的控制檔案裡已經沒有該表空間的資訊了,所以不能使用當前的控制檔案做恢復。恢復這個表空間要滿足三個條件:
a)要有該表空間的資料檔案備份
b)使用不完全恢復(基於時間點或scn)
c)使用備份的控制檔案,而這個控制檔案是刪除該表空間前的控制檔案,不是當前的控制檔案。這個非常重要,該控制檔案中的內容記錄了你需要恢復資料庫結構,重要的這個控制檔案必須包括有你要恢復的那個表空間的資訊。


1)準備環境




--生成要備份的資料檔案的命令
SQL>  select 'ho cp ' || name || ' /home/oracle/coldbak' from v$datafile;




'HOCP'||NAME||'/HOME/ORACLE/COLDBAK'
-------------------------------------------------------------------------
ho cp /home/oracle/app/oradata/orcl/system01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/sysaux01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/undotbs01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/users01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/tbtb01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/ogg01.dbf /home/oracle/coldbak




6 rows selected.




SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.






SQL> ho cp /home/oracle/app/oradata/orcl/system01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/sysaux01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/undotbs01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/users01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/tbtb01.dbf /home/oracle/coldbak
ho cp /home/oracle/app/oradata/orcl/ogg01.dbf /home/oracle/coldbak




SQL> startup;
ORACLE instance started.




Total System Global Area 1068937216 bytes
Fixed Size    2220200 bytes
Variable Size  729812824 bytes
Database Buffers  331350016 bytes
Redo Buffers    5554176 bytes
Database mounted.
Database opened.


SQL> alter database backup controlfile to '/home/oracle/coldbak/ctl01.bak';


Database altered.


SQL> select name from v$tablespace;


NAME
------------------------------
SYSTEM
SYSAUX
UNDOTBS1
USERS
TEMP
LZY
GOLDGATE




SQL>  create tablespace andy datafile '/home/oracle/app/oradata/orcl/andy01.dbf' size 1m;


Tablespace created.


SQL>  create table andy.andy(id int) tablespace andy;


Table created.


SQL>  insert into andy.andy values (101);


1 row created.


SQL> commit;


Commit complete.


SQL> select * from andy.andy;


        ID
----------
       101
SQL> select current_scn from v$database;


CURRENT_SCN
-----------
    2042681




2)模擬正常刪除表空間


SQL> drop tablespace andy including contents and datafiles;




3) 關閉資料庫


SQL> shutdown immediate;


4)還原所有資料檔案,以老控制檔案替換當前控制檔案


[oracle@11g orcl]$ rm -rf *.dbf
[oracle@11g orcl]$ rm -rf /home/oracle/app/oradata/orcl/control01.ctl
[oracle@11g orcl]$ rm -rf /home/oracle/app/flash_recovery_area/orcl/control02.ctl
[oracle@11g coldbak]$ cp ctl01.bak /home/oracle/app/oradata/orcl/control01.ctl
[oracle@11g coldbak]$ cp ctl01.bak /home/oracle/app/flash_recovery_area/orcl/control02.ctl
[oracle@11g coldbak]$ cp *.dbf /home/oracle/app/oradata/orcl/


5)啟動資料庫後,要做基於時間點(或SCN)的不完全恢復


SQL> startup;
ORACLE instance started.


Total System Global Area 1068937216 bytes
Fixed Size    2220200 bytes
Variable Size  729812824 bytes
Database Buffers  331350016 bytes
Redo Buffers    5554176 bytes
Database mounted.
ORA-01589: 要開啟資料庫則必須使用 RESETLOGS 或 NORESETLOGS 選


SQL> recover database until change 2042681 using backup controlfile;




6)resetlogs開啟資料庫


SQL> alter database open resetlogs;


Database altered.


7)驗證


SQL> select * from andy.andy;


        ID
----------
       101


OK,結束。 轉載請標明出處。

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

相關文章