Oracle資料庫的自動備份

來源:互聯網
上載者:User
 
 
 

 

相信為數不少的系統管理員每天都在做著同一樣的工作——對資料進行備份。一旦哪一天疏忽了,而這一天系統又恰恰發生了故障,需要進行資料恢複,那麼此時就無能為力了。假如每天設定一個固定的時間,系統自動進行備份,那該多好啊!下面筆者結合實踐經驗,談一談UNIX環境下Oracle資料庫自動備份,以起到拋磚引玉的作用。
  
  我們計劃讓資料庫在晚上23點做export匯出備份,在淩晨2點將備份檔案拷貝到磁帶上,在淩晨4點將備份檔案拷貝到另一台UNIX機器上,為此我們可進行如下操作:
  
  一、匯出資料庫
  export命令將資料庫中的資料備份成一個二進位檔案,它通常有三種模式:使用者模式、表模式和整個資料庫模式。本文擬採用使用者模式,備份之前,應先建立一個備份目錄,以容納備份檔案,比如可建一個/backup目錄。接著我們可在UNIX的Oracle目錄下(也可以是其它目錄)分別建立兩個檔案ora—backup,tar—backup。需要說明的是,前一個檔案需要對Oracle的參數進行初始化,為了方便起見,我們不妨將初始化命令放到一個檔案中(檔案名稱姑且定為ora—env),再由第一個檔案調用它。
  
  1. ora—env檔案對Oracle的參數進行初始化,其內容如下:
  
  ORACLE—HOME=$ORACLE—HOME;export ORACLE—HOME
  
  ORACLE—SID=ora73;export ORACLE—SID
  
  ORACLE—TERM=sun;export ORACLE—TERM
  
  LD—LIBRARY—PATH=$ORACLE—HOME/lib;export LD—LIBRARY—PATH
  
  ORA—NLS32=$ORACLE—HOME/ocommon/nls/admin/data;export ORA—NLS
  
  PATH=.:/usr/ccs/bin:/usr/ucb:$ORACLE—HOME/bin:$PATH;export PATH
  
  DISPLAY=host1:0;export DISPLAY
  
  NLS—LANG=american—america.zhs16cgb231280;export NLS—LANG
  
  2. ora—backup檔案對資料庫做export匯出,匯出的檔案名稱可以任意定,本文定為字母“xx”加當天日期,即假如當天日期是12月10號,則匯出的檔案名稱為“xx1210.dmp”,以區別於其它日期的備份檔案。
  
  ora—backup檔案內容:
  
  ./oracle/ora—env
  
  #初始化Oracle資料庫
  
  rq=′date +″%m%d″ ′
  
  #把當天日期賦予變數rq
  
  rm /backup/
  
  # 清空 /backup目錄
  
  exp test/test file=/backup/xx$rq.dmp log=/backup/xx$rq.log
  
  本命令用於在$提示符下,匯出test使用者的資料(其口令亦為test),匯出檔案及日誌均放在/backup目錄下。
  
  二、磁帶備份
  tar—backup檔案將用export命令匯出的資料檔案拷貝到磁帶上。
  
  tar—backup檔案內容:
  
  tar rvf /dev/rmt/0n/backup/
  
  本命令可將/backup目錄下當天產生的檔案備份到磁帶上。本檔案中,tar命令使用了三個參數,其中r選項表示向磁帶上拷入檔案而不破壞磁帶原來內容,v選項表示在拷貝過程中顯示檔案資訊,f選項後面加上磁帶裝置名稱,指定檔案向何處拷貝,n選項表示磁帶機不倒帶。/dev/rmt/0表示UNIX主機第一個磁帶磁碟機,同理,/dev/rmt/1則表示UNIX主機第二個磁帶磁碟機,依此類推。
  
  ora—env、ora—backup、tar—backup檔案編寫完成後,分別使用下述命令:
  
  chmod 755 ora—env
  
  chmod 755 ora—backup
  
  chmod 755 tar—backup
  
  這樣,三個檔案就都變成了可執行檔。
  
  三、異地備份
  我們知道,通常可用FTP命令在兩台主機間傳輸資料,但一般是通過互動方式實現的,即需要手工輸入目標主機的IP地址、使用者名稱、口令等。顯然,這不符合自動備份的要求。所幸的是,我們可以通過編寫一個.netrc的檔案來達到目標。這一檔案必須命名為.netrc,且必須存放在啟動FTP命令的機器上的使用者註冊目錄中,該檔案的許可權應禁止組內或其它使用者進行讀訪問。這樣,當使用者使用FTP命令的時候,系統將會在該使用者的註冊目錄中尋找.netrc檔案,如果能夠尋找到,將會首先執行該檔案,否則,會互動式地提示使用者輸入使用者名稱、口令等。
  
  在使用FTP命令之前,應先在另一台作備份用的UNIX機器上建一目錄,以容納備份檔案,本文建的目錄是/pub 。需要指出的是,為了加快備份速度,兩台主機之間的傳輸速率應儘可能的高,最好位於同一區域網路上。
  
  .netrc檔案內容如下:
  
  machine host2
  
  # host2為作備份用的主機名稱
  
  login oracle
  
  #oracle為備份主機上的一個使用者
  
  password oracle
  
  #oracle使用者的口令為oracle
  
  macdef init
  
  #定義一個名為init的宏,它將在自動註冊進程的最後被執行
  
  bin
  
  #檔案的傳輸方式設為二進位
  
  lcd /backup
  
  # 進入本地工作目錄/backup
  
  cd /pub
  
  # 進入備份主機目錄/pub
  
  mput
  
  # 將/backup目錄下的所有檔案傳輸至備份主機
  
  bye
  
  #退出FTP會話進程
  
  .netrc檔案編寫完成後,使用下述命令:
  
  chmod 600 .netrc
  
  這樣,.netrc檔案就只能被該使用者所訪問。
  
  四、啟動備份進程
  Cron是一個永久進程,它由/etc/rc.local啟動執行。Cron檢查/var/spool/cron/crontabs/目錄中的檔案,找到所要執行的任務和執行任務的時間。
  
  Crontab檔案的每一行由六個域(minutes、hours、day of month、month、day of week、 command)組成,域之間用空格或Tab分開,其中:
  
  minutes:分鐘域,值的範圍是0到59
  
  hours:小時域,值的範圍是0到23
  
  day of month:日期,值的範圍是1到31
  
  month:月份,值的範圍是1到12
  
  day of week:星期,值的範圍是0到6,星期日值為0
  
  command:所要啟動並執行命令
  
  如果一個域是,表明命令可以在該域所有可能的取值範圍內執行。
  
  如果一個域是由連字號隔開的兩個數字,表明命令可以在兩個數字之間的範圍內執行(包括兩個數字本身)。
  
  如果一個域是由逗號隔開的一系列值組成的,表明命令可以在這些值組成的範圍內執行。
  
  如果日期域和星期域都有值,則這兩個域都有效。
  
  現在,我們編寫一個檔案,用以啟動自動備份進程。值得注意的是,該檔案只能在Oracle使用者名稱下用crontab -e 命令來編輯,否則將不會被定時執行,檔案名稱定為Oracle,檔案將放在/var/spool/cron/crontabs 目錄下。編輯完成後,可以在Oracle的$提示符下,用crontab -l命令來查看。
  
  Oracle檔案內容:
  
  0 23 /oracle/ora—backup
  
  # 每天23點對資料庫執行備份
  
  0 2 /oracle/tar—backup
  
  # 每天2點將檔案備份到磁帶上
  
  0 4 ftp -i host2
  
  # 每天4點將檔案備份到另一台主機上
  
  經過以上的操作後,系統每天晚上將自動產生一個備份,並且自動將備份檔案分別拷貝到磁帶上和另一台主機上。系統管理員需要做的是,隔幾天換一盤磁帶(更換磁帶的周期取決於備份檔案的大小和磁帶的容量)和清理備份目錄。這樣,他們就可以從備份資料的繁瑣中解脫出來,去做其它更有意義的工作。而資料庫既實現了磁帶備份,又實現了異地備份,相應的安全性也大大提高了。

轉自:http://www.myfaq.com.cn/A/2004-07-07/85801.html

實現指令碼
rem #=========================================================================
rem # Purpose:exp Oracle DB ZYTK30 to file ZYTK30_YYYYMMDDHHMM.dmp,
rem #         and Delete the file,7 days ago created
rem # Author :Comer Chu, 2006

rem # History:
rem # Note   :erveryday excute this script by windows task schedule 
rem #=========================================================================

@echo off
rem 1#---獲得當前日期和7天前日期,date的格式 "YYYY-MM-DD"----------
set dt=%date:~0,10%
set i=1

:forok
if %i%==1 goto i01
if %i%==2 goto i02
if %i%==3 goto i03
if %i%==4 goto i04
if %i%==5 goto i05
if %i%==6 goto i06
if %i%==7 goto i07

:i01
set i=2
goto nextok
:i02
set i=3
goto nextok
:i03
set i=4
goto nextok
:i04
set i=5
goto nextok
:i05
set i=6
goto nextok
:i06
set i=7
goto nextok
:i07
set i=8
goto nextok

:nextok
set dy=%dt:~0,4%
set dm=%dt:~5,2%
set dd=%dt:~8,2%

if %dm%%dd%==0101 goto L01
if %dm%%dd%==0201 goto L02
if %dm%%dd%==0301 goto L07
if %dm%%dd%==0401 goto L02
if %dm%%dd%==0501 goto L04
if %dm%%dd%==0601 goto L02
if %dm%%dd%==0701 goto L04
if %dm%%dd%==0801 goto L02
if %dm%%dd%==0901 goto L02
if %dm%%dd%==1001 goto L05
if %dm%%dd%==1101 goto L03
if %dm%%dd%==1201 goto L06

if %dd%==02 goto L10
if %dd%==03 goto L10
if %dd%==04 goto L10
if %dd%==05 goto L10
if %dd%==06 goto L10
if %dd%==07 goto L10
if %dd%==08 goto L10
if %dd%==09 goto L10
if %dd%==10 goto L11
set /A dd=dd-1
set dt=%dy%-%dm%-%dd%
goto END
:L10
set /A dd=%dd:~1,1%-1
set dt=%dy%-%dm%-0%dd%
goto END
:L11
set dt=%dy%-%dm%-09
goto END

:L02
set /A dm=%dm:~1,1%-1
set dt=%dy%-0%dm%-31
goto END
:L04
set /A dm=dm-1
set dt=%dy%-0%dm%-30
goto END

:L05
set dt=%dy%-09-30
goto END
:L03
set dt=%dy%-10-31
goto END
:L06
set dt=%dy%-11-30
goto END
:L01
set /A dy=dy-1
set dt=%dy%-12-31
goto END

:L07
set /A "dd=dy%%4"
if not %dd%==0 goto L08
set /A "dd=dy%%100"
if not %dd%==0 goto L09
set /A "dd=dy%%400"
if %dd%==0 goto L09
:L08
set dt=%dy%-02-28
goto END
:L09
set dt=%dy%-02-29
goto END

:END
if %i%==2 goto forok
if %i%==3 goto forok
if %i%==4 goto forok
if %i%==5 goto forok
if %i%==6 goto forok
if %i%==7 goto forok
if %i%==8 goto db

:db
rem 2#---備份oracle資料到本機,並且只備份資料表空間,前提本機正確配置了Oracle的用戶端,否則exp無法執行!
rem td like 20060827183200
set td=%Date:~0,4%%Date:~5,2%%Date:~8,2%%Time:~0,2%%Time:~3,2%%Time:~6,2%
e:\oracleback
exp user/password@zytk30 tablespaces=(ZYTK30_AC,ZYTK30_OP,ZYTK30_ID,ZYTK30_BAK) file=e:\OracleBack\ZYTK30_%td%.dmp log=e:\OracleBack\expZYTK30.Log buffer=800000
rar a ZYTK30_%td%.rar ZYTK30_%td%.dmp

rem set dt to format "yyyymmdd"
set dt=%dt:~0,4%%dt:~5,2%%dt:~8,2%
rem 3#---刪除7天前的備份檔案---------------------------------------------------------
del e:\OracleBack\ZYTK30_%dt%*.rar

rem 4#---刪除當天dmp備份檔案--------------------------------------------------------
del e:\OracleBack\ZYTK30_%td%*.dmp

定時任務
以上內容儲存為exp_ZYTK30.bat,再使用windows內建的任務計劃來排程器每天自動去備份資料了
具體步驟:控制台-\任務計劃-\新增工作計劃,選擇每天,選擇exp_ZYTK30.bat就ok了。

說明
上面是保留備份最近7天的資料,每天一個(當然也可以多個,設定任務計劃即可)。你可以修改上面的代碼到最近8、9甚至n天

比如:修改成保留8天的備份
在if %i%==7 goto i07 下增加
if %i%==8 goto i08
:i07
set i=8

在goto nextok 下增加
:i08
set i=9
goto nextok

將if %i%==8 goto mdb 改為
if %i%==8 goto forok
if %i%==9 goto mdb

依次類推到n天。也可以針對檔案夾的刪除,稍作變動即可。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.