Oracle數據庫的備份方法

1、引言
Oracle
數據庫的備份方法很多,無論使用那種備份方法,備份的目的都是爲了在出現故障後能夠以儘可能小的時間和代價恢復系統。比如使用export實用程序導出數據庫對象、使用Oracle備份數據庫、使用Oracle對稱複製、使用Oracle並行服務器、使用Oracle冷備份、使用Oracle熱備份等各種備份方法都有其優缺點、適用的場合和相應的軟硬件要求。本文主要就用export實用程序導出數據庫對象、Oracle冷備份、Oracle熱備份這三種最基本的備份方法進行詳細的探討,分析各自的優缺點和適用的場合,並給出自動執行這些備份方案的腳本文件。

2、三種備份方案的比較 備份方案 綜述 優點 缺點
冷備份 冷備份是Oracle最簡單的一種備份;執行冷備份前必須關閉數據庫;然後使用操作系統實用工具或者第三方工具備份所有相關的數據庫文件。 能簡單快速地備份。能簡單快速地恢復。執行簡單。 必須關閉數據庫。 不能進行點恢復。
熱備份 熱備份是當數據庫正在運行時進行數據備份的過程。執行熱備份的前提是:數據庫運行在可歸檔日誌模式。適用於24X7不間斷運行的關鍵應用系統。 備份時數據庫可以是打開的。熱備份可以用來進行點恢復。初始化參數文件、歸檔日誌在數據庫正常運行時是關閉的,可用操作系統命令拷貝。 執行過程複雜。由於數據庫不間斷運行,測試比較困難。不能用操作系統實用工具拷貝打開的文件。必須使用Oracle提供的ocopy工具來拷貝打開的文件。熱備份可能造成CPUI/O過載,應在數據庫不太忙時進行。

Export
導出數據庫對象 冷備份和熱備份都備份物理數據庫文件,因而被稱爲物理備份。而export備份的是數據庫對象,因此被稱爲邏輯備份。 能執行對象或者行恢復。備份和恢復速度更快。能夠跨操作系統平臺遷移數據庫。數據庫可一直運行。
export
並不是冷備份和熱備份的替代工具。冷、熱備份可保護介質失效。export備份可保護用戶或應用錯誤。

3、冷備份方案的實施
3.1
冷備份數據庫的步驟
1)關閉數據庫; 2)備份所有相關的數據庫文件:初始化參數文件、控制文件(可用select name from v$controlfile;列出所有控制文件)、數據文件(可用select name from v$datafile;列出所有數據文件)、Redo日誌(可用select member from v$logfile;列出所有redo日誌文件)、歸檔的Redo日誌(可用select sequence#,first_time from v$loghist;列出所有歸檔redo日誌文件的順序號和產生時間)。
3.2
冷備份數據庫的腳本文件
coldbak.cmd
rem Oracle
數據庫冷備份腳本文件名
coldbak.cmd
rem
用於Windows NT/2000 平臺,已經過嚴密的測試,大家可以試驗!!!

rem
該腳本執行後,在c:temp目錄中產生db_restrict.sqldb_shut.sqldb_start.sql

rem cold.sql
cold.cmd5個腳本文件,冷備份的核心命令在cold.cmd中。

rem
設置
SID
set oracle_sid=tmq
rem
設置初始化參數文件

set my_pfile=e:oracleora81databaseinittmq.ora
set my_ifile=E:OracleADMINtmqpfileinit.ora
rem
設置歸檔日誌目錄

set my_archive_dir=E:OracleORADATAtmqarchive
rem
設置internal帳戶的密碼

set my_password=oracle
rem
建立臨時目錄

mkdir c:temp
set my_temp=c:temp
rem
建立備份目錄,該目錄必須有足夠大的空間用於存放數據庫的備份文件

mkdir e:backup
set my_bakdir=e:backup
rem ==== (1) create script file db_restrict.sql=====
echo connect internal/%my_password%; > %my_temp%db_restrict.sql
echo shutdown immediate; >> %my_temp%db_restrict.sql
echo startup restrict pfile=%my_pfile%; >>%my_temp%db_restrict.sql
echo exit >> %my_temp%db_restrict.sql
rem ==== (2) create script file db_shut.sql =====
echo connect internal/%my_password%; >%my_temp%db_shut.sql
echo shutdown immediate; >>%my_temp%db_shut.sql
echo exit >>%my_temp%db_shut.sql
rem ==== (3) create script file db_start.sql =====
echo connect internal/%my_password%; >%my_temp%db_start.sql
echo startup pfile=%my_pfile%; >>%my_temp%db_start.sql
echo exit >>%my_temp%db_start.sql
svrmgrl @%my_temp%db_restrict.sql
rem ==== (4) create script file cold.sql =====
echo set heading off; >%my_temp%cold.sql
echo set feedback off; >>%my_temp%cold.sql
echo spool %my_temp%cold.cmd; >>%my_temp%cold.sql
echo
在這裏設計冷備份的命令,備份控制文件、數據文件和日誌文件

echo select 'copy ' ^|^| name ^|^| ' %my_bakdir%' from v$controlfile; >>%my_temp%cold.sql
echo select 'copy ' ^|^| member ^|^| ' %my_bakdir%' from v$logfile; >>%my_temp%cold.sql
echo select 'copy ' ^|^| file_name ^|^| ' %my_bakdir%' from dba_data_files; >>%my_temp%cold.sql
echo spool off; >>%my_temp%cold.sql
echo exit >>%my_temp%cold.sql
rem ===== (5) run cold.sql to genrate cold.cmd ========
sqlplus internal/%my_password% @%my_temp%cold.sql
echo
在這裏設計冷備份的命令,備份參數文件、歸檔日誌文件

echo. >> %my_temp%cold.cmd
echo copy %my_pfile% %my_bakdir% >> %my_temp%cold.cmd
echo copy %my_ifile% %my_bakdir% >> %my_temp%cold.cmd
echo. >> %my_temp%cold.cmd
echo copy %my_archive_dir%*.* %my_bakdir% >> %my_temp%cold.cmd
rem ===== shut down database ========
svrmgrl @%my_temp%db_shut.sql
rem ====== run cold.cmd to perform the cold backup
開始執行冷備份
======
call %my_temp%cold.cmd
rem ====== start up the database =======
svrmgrl @%my_temp%db_start.sql
echo ===== the cold backup is completed!!! ======

4、熱備份方案的實施
4.1
熱備份數據庫的前提條件:數據庫運行在歸檔模式

Oracle
數據庫的redo日誌記錄在數據庫上進行的所有活動。LGWR後臺進程以一種循環方式寫這些日誌文件,從第一個redo日誌到下一個,直到該組的最後一個,然後由從第一個日誌寫起。
在非歸檔模式下,當循環寫到最後一個日誌文件後,就重寫第一個日誌。因此,非歸檔模式下唯一的數據庫恢復辦法就是使用冷備份。 在歸檔模式下,當redo日誌滿時,一個ARCH後臺進程就讀取全部redo日誌,然後將其寫到歸檔日誌。因此,可以使用熱備份和點恢復。在歸檔日誌模式下,如果歸檔日誌目的空間已滿,數據庫活動將暫時停止,只有釋放一些空間後,數據庫才能繼續運行。通常,background_dump_destination將產生一個跟蹤文件來顯示歸檔方面的問題。
Oracle
數據庫安裝默認運行在非歸檔模式,通過以下步驟可以從非歸檔模式轉換爲歸檔模式:
1)編輯參數文件init.ora,設置以下參數
#
設置數據庫自動歸檔

log_archive_start = true
#
設置歸檔日誌文件的目錄,該目錄必須事先已建立,並有大量可利用的空間

log_archive_dest_1="location=%oracle_base% oradata%oracle_sid%archive"
#
設置歸檔日誌文件名的格式。%s表示順序號,%t表示線程號。

log_archive_format = "%oracle_sid%%T%S.ARC"
2)在svrmgrl上運行以下命令

svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database archivelog;
svrmgrl>alter database open;
svrmgrl>shutdown immediate;
3)執行數據庫冷備份
當數據庫運行在歸檔模式下,數據庫恢復過程要求使用冷備份時,歸檔日誌是必需的。 4)正常啓動數據庫,並確認數據庫運行在歸檔模式
svrmgrl > startup;
svrmgrl > select * from v$database;
log_mode會顯示數據庫是否歸檔模式

svrmgrl > archive log list;
也會顯示數據庫是否歸檔模式
如果Oracle數據庫運行在歸檔模式,當進行數據庫維護時,可能需要暫停數據庫的歸檔,在完成維護後,再重新啓動歸檔模式。通過以下步驟可以從歸檔模式轉換爲非歸檔模式:
svrmgrl>connect internal/YOUR_PASSWORD
svrmgrl>shutdown immediate;
svrmgrl>startup mount exclusive;
svrmgrl>alter database noarchivelog;
svrmgrl>alter database open;
svrmgrl > select * from v$database;
log_mode會顯示數據庫是否歸檔模式

svrmgrl > archive log list;
也會顯示數據庫是否歸檔模式

4.2
熱備份數據庫的步驟
1)拷貝init.ora文件到備份目錄(參數文件在數據庫啓動後處於關閉狀態)。 2)將需要備份的某個表空間置於開始備份模式。 3)使用ocopy.exe拷貝表空間,然後將該表空間置於結束備份模式中(ocopy.exe不能用於直接拷貝聯機的數據庫文件)。 4)對數據庫中的每個表空間執行步驟23(可以通過視圖dba_tablespacesv$datafile查看數據庫中有哪些表空間和數據文件)。 5)通過在svrmgrl上執行archive log list命令獲取當前的日誌順序號,從oldest online log sequence開始到current log sequence的聯機redo日誌應該是熱備份的一部分。 6)在svrmgrl上執行alter system switch logfile;命令來強迫日誌切換,以便所有的日誌都被歸檔。 7)使用alter database backup controlfile to trace;命令獲得控制文件的一個備份,可以到%oracle_base%admin%oracle_sid%udump目錄中尋找最新的跟蹤文件,其中有重建控制文件的全部命令。 8)使用windows nt的命令從%log_archive_dest%中拷貝歸檔的日誌文件到備份目錄。
4.3
熱備份數據庫的腳本文件
hotbak.cmd
rem Oracle
數據庫熱備份腳本文件名
hotbak.cmd
rem
用於Windows NT/2000 平臺,已經過嚴密的測試,大家可以試驗!!!

rem
該腳本執行後,在c:temp目錄中產生minlog.sqlminlog.cmd

rem tblspc01.sql
tblspc02.sqlcontrol01.sqlcontrol02.sql

rem maxlog.sql
maxlog.cmdarchive.sqlarchive.cmd10個腳本文件。

rem
設置
SID
set oracle_sid=tmq
rem
設置初始化參數文件

set my_pfile=e:oracleora81databaseinittmq.ora
set my_ifile=E:OracleADMINtmqpfileinit.ora
rem
設置歸檔日誌目錄

set my_archive_dir=E:OracleORADATAtmqarchive
rem
設置internal帳戶的密碼

set my_password=oracle
rem
建立臨時目錄

mkdir c:temp
set my_temp=c:temp
rem
建立備份目錄,該目錄必須有足夠大的空間用於存放數據庫的備份文件

mkdir e:backup
set my_bakdir=e:backup
rem ===== (1)
開始備份參數文件
=======
echo Backing up the init.ora file
copy %my_pfile% %my_bakdir%
copy %my_ifile% %my_bakdir%
rem ===== (2)
創建minlog.sql腳本獲取最小的online redo日誌順序號
=====
echo set heading off; >%my_temp%minlog.sql
echo set feedback off; >>%my_temp%minlog.sql
echo spool %my_temp%minlog.cmd; >>%my_temp%minlog.sql
echo select 'set minlog_value=' ^|^| min(sequence#) from v$log where upper(status)=upper('INACTIVE'); >>%my_temp%minlog.sql
echo spool off; >>%my_temp%minlog.sql
echo select 'exit;' from dual; >>%my_temp%minlog.sql
echo exit; >>%my_temp%minlog.sql
rem ===== (3) run minlog.sql to genrate minlog.cmd ========
sqlplus internal/%my_password% @%my_temp%minlog.sql
rem ===== (4) run minlog.cmd to set minlog_value ========
call %my_temp%minlog.cmd
rem === (5)
創建tblspc01.sql腳本用於生成備份數據文件的腳本文件
tblspc02.sql ===
echo set heading off; >%my_temp%tblspc01.sql
echo set feedback off; >>%my_temp%tblspc01.sql
echo spool %my_temp%tblspc02.sql; >>%my_temp%tblspc01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' begin backup;' from dba_tablespaces; >>%my_temp%tblspc01.sql
echo select 'host start/wait ocopy ' ^|^| file_name ^|^| ' %my_bakdir%;' from dba_data_files; >>%my_temp%tblspc01.sql
echo select 'alter tablespace ' ^|^| tablespace_name ^|^| ' end backup;' from dba_tablespaces; >>%my_temp%tblspc01.sql
echo spool off; >>%my_temp%tblspc01.sql
echo select 'exit;' from dual; >>%my_temp%tblspc01.sql
echo exit; >>%my_temp%tblspc01.sql
rem ===== (6) run tblspc01.sql to genrate tblspc02.sql ========
sqlplus internal/%my_password% @%my_temp%tblspc01.sql
rem ===== (7) on svrmgrl run tblspc02.sql to backup the datafiles ========
svrmgrl @%my_temp%tblspc02.sql
rem ===== (8)
創建maxlog.sql腳本獲取最大的online redo日誌順序號
=====
echo set heading off; >%my_temp%maxlog.sql
echo set feedback off; >>%my_temp%maxlog.sql
echo spool %my_temp%maxlog.cmd; >>%my_temp%maxlog.sql
echo select 'set maxlog_value=' ^|^| max(sequence#) from v$log where upper(status)=upper('CURRENT'); >>%my_temp%maxlog.sql
echo spool off; >>%my_temp%maxlog.sql
echo select 'alter system switch logfile;' from dual; >> %my_temp%maxlog.sql
echo select 'exit;' from dual; >>%my_temp%maxlog.sql
echo exit; >>%my_temp%maxlog.sql
rem ===== (9) run maxlog.sql to genrate maxlog.cmd ========
sqlplus internal/%my_password% @%my_temp%maxlog.sql
rem ===== (10) run maxlog.cmd to set maxlog_value ========
call %my_temp%maxlog.cmd
rem == (11)
創建control01.sql腳本用於生成備份控制文件的腳本文件
control02.sql ===
echo set heading off; >%my_temp%control01.sql
echo set feedback off; >>%my_temp%control01.sql
echo spool %my_temp%control02.sql; >>%my_temp%control01.sql
echo select 'connect internal/%my_password%;' from dual; >>%my_temp%control01.sql
echo select 'alter database backup controlfile to trace;' from dual; >>%my_temp%control01.sql
echo spool off; >>%my_temp%control01.sql
echo select 'exit;' from dual; >>%my_temp%control01.sql
echo exit; >>%my_temp%control01.sql
rem ===== (12) run control01.sql to genrate control02.sql ========
sqlplus internal/%my_password% @%my_temp%control01.sql
rem ===== (13) on svrmgrl run control02.sql to backup the datafiles ========
svrmgrl @%my_temp%control02.sql
rem ===== (14)
創建archive.sql腳本用於生成備份歸檔日誌文件的腳本文件
archive.cmd =====
echo set heading off; >%my_temp%archive.sql
echo set feedback off; >>%my_temp%archive.sql
echo spool %my_temp%archive.cmd; >>%my_temp%archive.sql
rem
僅備份與本次熱備份相關的日誌文件

echo select 'copy ' ^|^| name ^|^| ' %my_bakdir%' from V_$ARCHIVED_LOG where sequence# between %minlog_value% and %maxlog_value%+1; >>%my_temp%archive.sql
echo spool off; >>%my_temp%archive.sql
echo select 'exit;' from dual; >>%my_temp%archive.sql
echo exit; >>%my_temp%archive.sql
rem ===== (15) run archive.sql to genrate archive.cmd ========
sqlplus internal/%my_password% @%my_temp%archive.sql
rem ===== (16) run archive.cmd to backup the archive log files ========
call %my_temp%archive.cmd
rem ===== the end ======
echo ===== the hot backup is completed!!! ======

5、使用export作爲備份策略
5.1 export
的命令選項說明
Oracle
數據庫的exp工具提供tablesusersfull databasetablespace四種級別的導出方式,把指定的數據庫內容導出到一個或者多個oracle二進制文件中,該文件只允許用imp工具來讀取,imp的命令選項可用imp help=y來查閱。 您可以通過輸入 EXP 命令以及各種自變量來控制“導出”的運行方式。要指定參數,您可以使用關鍵字: 格式:EXP KEYWORD=value KEYWORD=(value1,value2,...,valueN) 實例:EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR) TABLES=(T1:P1,T1:P2),如果 T1 是分區表
USERID
必須是命令行中的第一個參數。 下列關鍵字僅用於可傳輸的表空間
TRANSPORT_TABLESPACE
導出可傳輸的表空間元數據 (N)
TABLESPACES
將傳輸的表空間列表
5.2 export
備份數據庫的腳本文件expbak.cmd
rem Oracle
數據庫export備份腳本文件名expbak.cmd
rem
用於Windows NT/2000 平臺
rem
設置SID
set oracle_sid=tmq
rem
設置system帳戶的密碼
set my_password=manager
rem
建立備份目錄
mkdir c:temp
set my_temp=c:temp
mkdir e:backup
set my_bakdir=e:backup
rem
如果是表級備份,請設置tables參數;如果是用戶級備份,要設置owner參數;全庫備份,設置full=y
rem
下面以用戶級備份爲例加以說明。
set my_owner=(scott,system)
exp system/%my_password% file=%my_bakdir%myexp.dat log=%my_bakdir%myexp.log buffer=1024000 owner=%my_owner%
rem ===== the end ======
echo ===== the export backup is completed!!! ======

6、各種備份策略的自動執行方法 不管是冷備份、熱備份,還是export備份;不管是unix平臺,還是windows平臺,都可以利用at命令來定時、自動執行上述備份策略。AT 命令安排在特定日期和時間運行命令和程序,在windows nt平臺上必須首先運行調度服務(schedule),才能使用at命令。
AT
命令用法如下:
AT [computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"
computername
指定遠程計算機。 如果省略這個參數,會計劃在本地計算機上運行命令。
id
指定給已計劃命令的識別號。
/delete
刪除某個已計劃的命令。如果省略 id,計算機上所有已計劃的命令都會被刪除。
/yes
不需要進一步確認時,跟刪除所有作業的命令一起使用。
time
指定運行命令的時間。
/interactive
允許作業在運行時,與當時登錄的用戶桌面進行交互。
/every:date[,...]
每個月或每個星期在指定的日期運行命令。如果省略日期,則默認爲在每月的本日運行。
/next:date[,...]
指定在下一個指定日期(如,下週四)運行命令。如果省略日期,則默認爲在每月的本日運行。
"command"
準備運行的 Windows NT 命令或批處理程序。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章