天天看點

Oracle備份與恢複

Oracle的備份與恢複有三種标準的模式,大緻分為兩大類,備份恢複(實體上的)以及導入導出(邏輯上的),而備份恢複又可以根據資料庫的工作模式分為非歸檔模式(Nonarchivelog-style)和歸檔模式(Archivelog-style),通常,我們把非歸檔模式稱為冷備份,而相應的把歸檔模式稱為熱備份,他們的關系如下所示

三種方式各有優點,我們做個比較(這個是用Fireworks畫的,有點糙):

$A: 現在先來介紹一下邏輯備份方式的方法,利用Export可将資料從資料庫中提取出來,利用Import則可将提取出來的資料送回到Oracle資料庫中去。理論基礎:Oracle提供的Export和Import具有三種不同的操作方式(就是備份的資料輸出(入)類型):

1,表方式(T) 可以将指定的表導出備份;

2,全庫方式(Full) 将資料庫中的所有對象導出;

3,使用者方式(U) 可以将指定的使用者相應的所有資料對象導出;

*在導入導出備份方式中,提供了很強大的一種方法,就是增量導出/導入,但是它必須作為System來完成增量的導入導出,而且隻能是對整個資料庫進行實施。增量導出又可以分為三種類别:

1,完全增量導出(Complete Export) 這種方式将把整個資料庫檔案導出備份;exp system/manager inctype=complete file=20041125.dmp(為了友善檢索和事後的查詢,通常我們将備份檔案以日期或者其他有明确含義的字元命名)

2,增量型增量導出(Incremental Export) 這種方式将隻會備份上一次備份後改變的結果;exp system/manager inctype=incremental file=20041125.dmp

3,累積型增量導出(Cumulate Export) 這種方式的話,是導出自上次完全增量導出後資料庫變化的資訊。exp system/manager inctype=cumulative file=20041125.dmp

通常情況下,DBA們所要做的,就是按照企業指定或者是自己習慣的标準(如果是自己指定的标準,建議寫好計劃說明),一般,我們采用普遍認可的下面的方式進行每天的增量備份:

Mon: 完全備份(A)

Tue: 增量導出(B)

Wed:增量導出(C)

Thu: 增量導出(D)

Fri: 累計導出(E)

Sat: 增量導出(F)

Sun: 增量導出(G)

這樣,我們可以保證每周資料的完整性,以及恢複時的快捷和最大限度的資料損失。恢複的時候,假設事故發生在周末,DBA可按這樣的步驟來恢複資料庫:

第一步:用指令CREATE DATABASE重新生成資料庫結構;

第二步:建立一個足夠大的附加復原。

第三步:完全增量導入A:

imp system/manager inctype=RESTORE FULL=y FILE=A

第四步:累計增量導入E:

imp system/manager inctype=RESTORE FULL=Y FILE=E

第五步:最近增量導入F:

imp system/manager inctype=RESTORE FULL=Y FILE=F

通常情況下,DBA所要做的導入導出備份就算完成,隻要科學的按照規律作出備份,就可以将資料的損失降低到最小,提供更可靠的服務。另外,DBA最好對每次的備份做一個比較詳細的說明文檔,使得資料庫的恢複更加可靠。

$B 實體備份之冷備份(條件-NonArchiveLog):

當資料庫可以暫時處于關閉狀态時,我們需要将它在這一穩定時刻的資料相關檔案轉移到安全的區域,當資料庫遭到破壞,再從安全區域将備份的資料庫相關檔案拷貝回原來的位置,這樣,就完成了一次快捷安全等資料轉移。由于是在資料庫不提供服務的關閉狀态,是以稱為冷備份。冷備份具有很多優良特性,比如上面圖中我們提到的,快速,友善,以及高效。一次完整的冷備份步驟應該是:

1,首先關閉資料庫(shutdown normal)

2,拷貝相關檔案到安全區域(利用作業系統指令拷貝資料庫的所有的資料檔案、日志檔案、控制檔案、參數檔案、密碼檔案等(包括路徑))

3,重新啟動資料庫(startup)

以上的步驟我們可以用一個腳本來完成操作:

su – oracle 檔案 備份位置(所有的日志、資料、控制及參數檔案);

startup;

exit;

這樣,我們就完成了一次冷備份,請确定你對這些相應的目錄(包括寫入的目标檔案夾)有相應的權限。

恢複的時候,相對比較簡單了,我們停掉資料庫,将檔案拷貝回相應位置,重新開機資料庫就可以了,當然也可以用腳本來完成。

$C 實體備份之熱備份:(條件-ArchiveLog)

當我們需要做一個精度比較高的備份,而且我們的資料庫不可能停掉(少許通路量)時,這個情況下,我們就需要歸檔方式下的備份,就是下面讨論的熱備份。熱備份可以非常精确的備份表空間級和使用者級的資料,由于它是根據歸檔日志的時間軸來備份恢複的,理論上可以恢複到前一個操作,甚至就是前一秒的操作。具體步驟如下:

1,通過視圖v$database,檢視資料庫是否在Archive模式下:

SQL> select log_mode from v$database;

如果不是Archive模式

則設定資料庫運作于歸檔模式下:SQL>shutdown immediate

SQL>startup mount

SQL> alter database archivelog;

SQL> alter database open;

如果Automaticarchival顯示為“Enabled”,則資料庫歸檔方式為自動歸檔。否則需要手工歸檔,或者将歸檔方式修改為自動歸檔,如:

正常shutdown資料庫,在參數檔案中init.ora中加入如下參數

SQL>shutdown immediate

修改init.ora:

LOG_ARCHIVE_START=TRUE

LOG_ARCHIVE_DEST1=ORACLE_HOME/admin/o816/arch(歸檔日值存放位置可以自己定義)

SQL>startup

然後,重新啟動資料庫,此時Oracle資料庫将以自動歸檔的方式工作在Archive模式下。其中參數LOG_ARCHIVE_DEST1是指定的歸檔日志檔案的路徑,建議與Oracle資料庫檔案存在不同的硬碟,一方面減少磁盤I/O競争,另外一方面也可以避免資料庫檔案所在硬碟毀壞之後的檔案丢失。歸檔路徑也可以直接指定為錄音帶等其它實體儲存設備,但可能要考慮讀寫速度、可寫條件和性能等因素。

注意:當資料庫處在ARCHIVE模式下時,一定要保證指定的歸檔路徑可寫,否則資料庫就會挂起,直到能夠歸檔所有歸檔資訊後才可以使用。另外,為建立一個有效的備份,當資料庫在建立時,必須履行一個全資料庫的冷備份,就是說資料庫需要運作在歸檔方式,然後正常關閉資料庫,備份所有的資料庫組成檔案。這一備份是整個備份的基礎,因為該備份提供了一個所有資料庫檔案的拷貝。(展現了冷備份與熱備份的合作關系,以及強大的能力)

2,備份表空間檔案:

a,首先,修改表空間檔案為備份模式 ALTER TABLESPACE tablespace_name BEGIN BACKUP;

b,然後,拷貝表空間檔案到安全區域 !CP tablespace_name D_PATH;

c,最後,将表空間的備份模式關閉 ALTER TABLESPACE tablespace_name END BACKUP;

3,對歸檔日志檔案的備份:

停止歸檔程序-->備份歸檔日志檔案-->啟動歸檔程序

如果日志文檔比較多,我們将它們寫入一個檔案成為一個恢複的參考:$ files `ls 歸檔檔案路徑>/arch*.dbf`;export files

4,備份控制檔案:

SQL> alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;

當然,我們也可以将上面的東東寫為一個腳本,在需要的時候執行就可以了:

腳本範例:

su – oracle

!CP tablespace_name D_PATH

ALTER TABLESPACE tablespace_name END BACKUP

alter database backup controlfile to 'controlfile_back_name(一般用2004-11-20的方式)' reuse;

!files `ls 歸檔檔案路徑>/arch*.dbf`;export files

熱備份的恢複,對于歸檔方式資料庫的恢複要求不但有有效的日志備份還要求有一個在歸檔方式下作的有效的全庫備份。歸檔備份在理論上可以無資料丢失,但是對于硬體以及操作人員的要求都比較高。在我們使用歸檔方式備份的時候,全庫實體備份也是非常重要的。歸檔方式下資料庫的恢複要求從全備份到失敗點所有的日志都要完好無缺。

恢複步驟:LOG_ARCHIVE_DEST_1

shutdown資料庫。

将全備份的資料檔案放到原來系統的目錄中。

将全備份到失敗點的所有歸檔日志放到參數LOG_ARCHIVE_DEST_1所指定的位置。

利用sqlplus登陸到空執行個體。(connect / as sysdba)

然後 startup mount

set autorecovery on

recover database;

alter database open;