ORACLE備份&恢復案例(1)

jss001發表於2009-02-14

第一章. 理解什麼是資料庫恢復

當 我們使用一個資料庫時,總希望資料庫的內容是可靠的、正確的,但由於計算機系統的故障(硬體故障、軟體故障、網路故障、程式故障和系統故障)影響資料庫系 統的操作,影響資料庫中資料的正確性,甚至破壞資料庫,使資料庫中全部或部分資料丟失。因此當發生上述故障後,希望能重構這個完整的資料庫,該處理稱為數 據庫恢復。恢復過程大致可以分為復原(Restore)與恢復(Recover)過程。

資料庫恢復可以分為以下兩類:

1.1例項故障的一致性恢復

當例項意外地(如掉電、後臺程式故障等)或預料地(發出SHUTDOUM ABORT語句)中止時出現例項故障,此時需要例項恢復。例項恢復將資料庫恢復到故障之前的事務一致狀態。如果在線上後備發現例項故障,則需介質恢復。在其它情況ORACLE在下次資料庫起動時(對新例項裝配和開啟),自動地執行例項恢復。如果需要,從裝配狀態變為開啟狀態,自動地激發例項恢復,由下列處理:

  (1 為了解恢復資料檔案中沒有記錄的資料,進行向前滾。該資料記錄在線上日誌,包括對回滾段的內容恢復。

  (2 回滾未提交的事務,按步1重新生成回滾段所指定的操作。

  (3 釋放在故障時正在處理事務所持有的資源。

  (4 解決在故障時正經歷一階段提交的任何懸而未決的分佈事務。

1.2介質故障或檔案錯誤的不一致恢復

介質故障是當一個檔案、一個檔案的部分或磁碟不能讀或不能寫時出現的故障。

檔案錯誤一般指意外的錯誤導致檔案被刪除或意外事故導致檔案的不一致。

這種狀態下的資料庫都是不一致的,需要DBA手工來進行資料庫的恢復,這種恢復有兩種形式,決定於資料庫執行的歸檔方式和備份方式。

1 完全介質恢復可恢復全部丟失的修改。一般情況下需要有資料庫的備份且資料庫執行在歸檔狀態下並且有可用歸檔日誌時才可能。對於不同型別的錯誤,有不同型別的完全恢復可使用,其決定於毀壞檔案和資料庫的可用性。

2 不完全介質恢復是在完全介質恢復不可能或不要求時進行的介質恢復。重構受損的資料庫,使其恢復介質故障前或使用者出錯之前的一個事務一致性狀態。不完全介質恢復有不同型別的使用,決定於需要不完全介質恢復的情況,有下列型別:基於撤消、基於時間和基於修改的不完全恢復。

  基於撤消(CANCEL)恢復:在某種情況,不完全介質恢復必須被控制,DBA可撤消在指定點的操作。基於撤消的恢復地在一個或多個日誌組(線上的或歸檔的)已被介質故障所破壞,不能用於恢復過程時使用,所以介質恢復必須控制,以致在使用最近的、未損的日誌組於資料檔案後中止恢復操作。

  基於時間(TIME)和基於修改(SCN)的恢復:如果DBA希望恢復到過去的某個指定點,是一種理想的不完全介質恢復,一般發生在恢復到某個特定操作之前,恢復到如意外刪除某個資料表之前。

第二章. 資料庫恢復案例測試環境

2.1 資料庫環境

以下的所有案例都是透過測試經過,環境為:

OSWindows 2000 Server

DBOracle 816

DBNAMETEST

資料檔案:

SQL> select file#,status,enabled,name from v$datafile;

FILE# STATUS ENABLED NAME

---------- ------- ---------- --------------------------------------------------------------------------------

1 SYSTEM READ WRITE D:ORACLEORADATATESTSYSTEM01.DBF

2 ONLINE READ WRITE D:ORACLEORADATATESTRBS01.DBF

3 ONLINE READ WRITE D:ORACLEORADATATESTUSERS01.DBF

4 ONLINE READ WRITE D:ORACLEORADATATESTTEMP01.DBF

5 ONLINE READ WRITE D:ORACLEORADATATESTTOOLS01.DBF

6 ONLINE READ WRITE D:ORACLEORADATATESTINDX01.DBF

控制檔案:

SQL> select * from v$controlfile;

STATUS NAME

------- --------------------------------------------------------------------------------

D:ORACLEORADATATESTCONTROL01.CTL

D:ORACLEORADATATESTCONTROL02.CTL

D:ORACLEORADATATESTCONTROL03.CTL

聯機日誌:

SQL> select * from v$logfile;

GROUP# STATUS MEMBER

---------- ------- --------------------------------------------------------------------------------

1 STALE D:ORACLEORADATATESTREDO01.LOG

2 D:ORACLEORADATATESTREDO02.LOG

3 STALE D:ORACLEORADATATESTREDO03.LOG

2.2 資料庫備份指令碼

冷備份指令碼

rem script:coldbak.sql

rem creater:chenjiping

rem date:5.8.2003

rem desc:offline full backup database

--connect database

connect internal/password;

--shutdown database

shutdown immediate;

--Copy Data file

!xcopy d:oracleoradatatest*.dbf d:database/H/R;

--Copy Control file

!xcopy d:oracleoradatatest*.ctl d:database/H/R;

--Copy Log file

!xcopy d:oracleoradatatest*.log d:database/H/R;

--startup database

startup;

說明:

1、以上指令碼在資料庫關閉狀態下備份資料庫所有的資料檔案,聯機日誌,控制檔案(在一個目錄下),如果成功備份,所有檔案是一致的。

2、沒有備份引數檔案,引數檔案可以另外備份,沒有必要每次都備份,只需要在改變設定後備份一次。

3、如果以上命令沒有成功依次執行,那麼備份將是無效的,如連線資料庫不成功,那麼肯定關閉資料庫也不成功,那麼備份則無效

4、冷備份建議下人工干預下執行。

資料庫OS熱全備份指令碼

rem script:hotbak.sql

rem creater:chenjiping

rem date:5.8.2003

rem desc:backup all database datafile in archive

--connect database

connect internal/password;

--archive

alter system archive log current;

--start

alter tablespace system begin backup;

!xcopy d:oracleoradatatestsystem01.dbf d:databak/H/R;

alter tablespace system end backup;

alter tablespace rbs begin backup;

!xcopy d:oracleoradatatestrbs01.dbf d:databak/H/R;

alter tablespace rbs end backup;

alter tablespace users begin backup;

!xcopy d:oracleoradatatestusers01.dbf d:databak/H/R;

alter tablespace users end backup;

alter tablespace tools begin backup;

!xcopy d:oracleoradatatesttools01.dbf d:databak/H/R;

alter tablespace tools end backup;

alter tablespace indx begin backup;

!xcopy d:oracleoradatatestindx01.dbf d:databak/H/R;

alter tablespace indx end backup;

--end

--bak control file

--binary

alter database backup controlfile to 'd:databakcontrolbinbak.000';

--ascii

alter database backup controlfile to trace;

alter system archive log current;

說明:

1、熱備份必須在資料庫歸檔方式下才可以執行

2、以上指令碼可以在資料庫執行狀態下備份資料庫所有的資料檔案(除了臨時資料檔案),沒有必要備份聯機日誌。

3、歸檔日誌至少需要一次完整備份之後的所有日誌。

4、如果以上命令沒有成功依次執行,那麼備份也是無效的,如連線資料庫不成功,那麼備份則無效

RMAN備份只講敘有恢復目錄的情況,如果沒有恢復目錄,情形大致相似。以下是RMAN的熱備份全備份的指令碼:

# script:bakup.rcv

# creater:chenjiping

# date:5.8.2003

# desc:backup all database datafile in archive with rman

# connect database

connect rcvcat rman/rman@back;

connect target internal/virpure;

# start backup database

run{

allocate channel c1 type disk;

backup full tag 'dbfull' format 'd:backupfull%u_%s_%p' database

include current controlfile;

sql 'alter system archive log current';

release channel c1;

}

# end

說明:

1、 資料庫必須執行在歸檔模式下

2、 RMAN將自動備份資料檔案,執行可靠

3、 歸檔日誌另外備份處理,但至少需要儲存一次備份來的日誌

4、 沒有必要用RMAN做冷備份,效果不好

以上舉例說明了資料庫的恢復案例的測試環境與部分備份測試指令碼,其它的備份指令碼可以根據以上指令碼演變而來或在案例中加以說明。

資料庫的自動例項將不加以說明,這裡只舉例說明媒體錯誤或人為錯誤造成的恢復可能。

以上包括以下案例都是在WINDOWS+ORACLE816上測試驗證的,在不同的作業系統與不同的資料庫版本中略有差別。

[@more@]

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

相關文章