空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          Oracle數據庫自動備份
           
           
           

           

          相信為數不少的系統管理員每天都在做著同一樣的工作——對數據進行備份。一旦哪一天疏忽了,而這一天系統又恰恰發生了故障,需要進行數據恢復,那么此時就無能為力了。假如每天設定一個固定的時間,系統自動進行備份,那該多好啊!下面筆者結合實踐經驗,談一談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天。也可以針對文件夾的刪除,稍作變動即可。

          posted on 2008-02-22 16:48 蘆葦 閱讀(1101) 評論(0)  編輯  收藏 所屬分類: 數據庫
          主站蜘蛛池模板: 乌拉特前旗| 凤山市| 麦盖提县| 祁东县| 卓尼县| 双桥区| 广德县| 庄浪县| 珲春市| 云阳县| 通辽市| 清远市| 堆龙德庆县| 定安县| 隆林| 济南市| 宣汉县| 宜兰市| 长子县| 沐川县| 错那县| 佛坪县| 隆回县| 安远县| 柳河县| 开封市| 阿鲁科尔沁旗| 永福县| 五河县| 三都| 兰考县| 本溪| 比如县| 清丰县| 江源县| 龙口市| 浦县| 巴里| 高平市| 梁山县| 静宁县|