Oracle備份與恢復【丟失資料檔案的恢復】

regonly1發表於2010-05-26

建立一個新的資料檔案:
sys@LYON> create tablespace ttbs datafile '/data/lyon/ttbs01.dbf'
  2  size 10m uniform. size 1m
  3  segment space management auto
  4  extent management local;

Tablespace created.

Elapsed: 00:00:00.77

建一個測試表:
sys@LYON> create table ttab(x int) tablespace ttbs;

Table created.

Elapsed: 00:00:00.26

加入一些測試資料
sys@LYON> insert into ttab(x)
  2  select rownum from dual
  3  connect by rownum <= 10;

10 rows created.

Elapsed: 00:00:00.01
sys@LYON> commit;

Commit complete.

Elapsed: 00:00:00.01
sys@LYON> select * from ttab;

         X
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

Elapsed: 00:00:00.04


刪除資料檔案:
sys@LYON> !rm -f ttbs01.dbf

再次查詢ttab,發現居然還能查到資料:
sys@LYON> select * from ttab;

         X
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

Elapsed: 00:00:00.03

清空了下快取,發現還是可以執行查詢:
sys@LYON> alter system flush buffer_cache;

System altered.

Elapsed: 00:00:00.24
sys@LYON> select * from ttab;

         X
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

Elapsed: 00:00:00.01

難道是undo的緣故?嘗試更換一下表空間,看是否會查不到資料:
sys@LYON> create undo tablespace undotbs02 datafile '/data/lyon/undotbs02.dbf' reuse;

Tablespace created.

Elapsed: 00:00:00.55
sys@LYON> alter system set undo_tablespace=undotbs02 scope=memory;

System altered.

Elapsed: 00:00:00.08

發現還是能查詢到:
sys@LYON> select * from ttab;

         X
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

Elapsed: 00:00:00.01

嘗試了清空閃回區也不行。

最後不知道過了多少時間可以看到執行出錯了:
sys@LYON> select * from ttab;
select * from ttab
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/data/lyon/ttbs01.dbf'


Elapsed: 00:00:00.02

看來還是重做日誌的緣故

開始恢復資料檔案:
首先將該檔案offline:
sys@LYON> alter database datafile '/data/lyon/ttbs01.dbf' offline;

Database altered.

Elapsed: 00:00:00.05

然後切換到rman 執行修復(restore)
sys@LYON> !rman target /

Recovery Manager: Release 10.2.0.1.0 - Production on Tue May 25 07:33:47 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

connected to target database: LYON (DBID=1398719310)

RMAN> restore datafile '/data/lyon/ttbs01.dbf';

Starting restore at 25-MAY-10
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=153 devtype=DISK

creating datafile fno=5 name=/data/lyon/ttbs01.dbf
restore not done; all files readonly, offline, or already restored
Finished restore at 25-MAY-10

再執行恢復(這裡將檔名的指定換成了檔案編號5,其實都是一樣的):
RMAN> recover datafile 5;

Starting recover at 25-MAY-10
using channel ORA_DISK_1

starting media recovery
media recovery complete, elapsed time: 00:00:00

Finished recover at 25-MAY-10


RMAN> exit


Recovery Manager complete.

退出恢復管理器,執行查詢:
sys@LYON> select * from ttab;
select * from ttab
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/data/lyon/ttbs01.dbf'


Elapsed: 00:00:00.01
sys@LYON> alter database datafile 5 online;

Database altered.

Elapsed: 00:00:00.04
sys@LYON> select * from ttab;

         X
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9
        10

10 rows selected.

Elapsed: 00:00:00.01

至此,歸檔模式下的資料檔案丟失已經完成了。

上面是呼叫了rman進行恢復的情況,還有一種是不用rman,直接用sqlplus進行恢復:
刪除資料檔案:
[oracle@localhost lyon]$ rm -f ttbs01.dbf

在sys使用者下建立新的資料檔案,作為丟失的資料檔案:
直接建立會報錯(檔案在使用中或需要恢復):
sys@LYON> alter database create datafile '/data/lyon/ttbs01.dbf' as '/data/lyon/ttbs01.dbf';
alter database create datafile '/data/lyon/ttbs01.dbf' as '/data/lyon/ttbs01.dbf'
*
ERROR at line 1:
ORA-01182: cannot create database file 5 - file is in use or recovery
ORA-01110: data file 5: '/data/lyon/ttbs01.dbf'


Elapsed: 00:00:00.01

所以首先將該資料檔案offline:
sys@LYON> alter database datafile 5 offline;

Database altered.

Elapsed: 00:00:00.08

然後再建立檔案:
sys@LYON>  alter database create datafile '/data/lyon/ttbs01.dbf' as '/data/lyon/ttbs01.dbf';

Database altered.

Elapsed: 00:00:00.51


假設資料檔案是一個裝著資料的盒子,那麼這個步驟實際上相當於我先按照丟失的那個資料檔案的樣子做個空盒子
然後在恢復的時候從重做日誌中將資料取出來再放到這個空盒子中
如果沒有恢復,是不能直接online的:
sys@LYON> alter database datafile 5 online;
alter database datafile 5 online
*
ERROR at line 1:
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/data/lyon/ttbs01.dbf'


Elapsed: 00:00:00.02

開始恢復(將資料取出來放到盒子中):
sys@LYON> recover datafile 5;
Media recovery complete.
sys@LYON> alter database datafile 5 online;

Database altered.

Elapsed: 00:00:00.03
於是,不用rman進行的恢復也完成了。


小結:
這次恢復的前提是要求在歸檔模式下,且對應的從開始到資料檔案丟失前的重做日誌都還存在
才能確保在此種模式下正確的恢復資料。
執行恢復的幾個主要步驟:
1、將丟失的資料檔案offline;
2、使用rman修復資料檔案(restore datafile 5)或者建立新的資料檔案(alter database create datafile xxx as xxx;)
3、恢復資料檔案(recover datafile 5)。
4、將恢復後的資料檔案online;
這樣恢復就完成了。

另外,之前提到的,資料檔案丟失後,短時間內還能對在資料檔案中的表進行查詢的問題。
不知道是不是我忽略了一個Oracle的某種機制。

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

相關文章