OGG刪除過期的trail檔案,shell實現
指令碼主要實現對OGG程式過期trail檔案的刪除處理。
指令碼只實現對已經讀取的檔案進行刪除,如果stop或ABENDED的話也不會出問題,因為只刪除已讀取的檔案,未讀取不做操作。
指令碼可以多個程式讀取相同的trail做判斷。
指令碼可以對相對路徑處理,和比對判斷。
指令碼下載:
指令碼使用:
-h獲取幫助
-p指定程式型別
extract,replicat和all
#!/bin/bash #by raysuen #v02 ComGgsci=/u01/ggs/ggsci #指定ggsci的絕對路徑 ExtractTrailDir=/u01/ggs/dirdat #指定trail檔案的目錄 keepfiles=1 #指定保留檔案的數量 rmlog=/u01/scripts/ray/RmOGGTrail.log #指定刪除指令碼的日誌,記錄刪除那些trail檔案 ################################################################## #獲取所有extract 程式資訊 ################################################################## getOGGExtractInfo(){ ${ComGgsci}<<-RAY info extract * RAY } ################################################################## #獲取程式資訊checkpoint資訊 ################################################################## getOGGExtractShowch(){ ${ComGgsci}<<-RAY info $1 showch RAY } ################################################################## #函式:刪除投遞程式指定保留數量前的trail檔案 ################################################################## deleteExtractfile(){ echo "################################# delete Extract tail #################################" >> ${rmlog} ################################################################## #按照指定程式名稱,刪除指定保留數量前的日誌 ################################################################## arrayExtract=() arrayExtractNum=0 isupdate=0 for i in `getOGGExtractInfo | egrep -v "GGSCI|^$" | sed -n '/EXTRACT/,$p' | awk -v dumpfile="" -v mynum=1 '{if($1=="EXTRACT") {dumpfile=$2;mynum=1} else if(($4!="Oracle")&&(mynum==3)){print dumpfile;mynum++}else mynum++}'` #獲取所有的投遞程式名稱 do #獲取指定投遞程式的當前讀取的checkpoint資訊 extractInfo=`getOGGExtractShowch $i | sed -n '/Read Checkpoint #1/,/Write Checkpoint #1/p' | grep -A 4 "Current Checkpoint"` #getOGGExtractShowch $i | sed -n '/Read Checkpoint #1/,/Write Checkpoint #1/p' | grep -A 4 "Current Checkpoint" | awk -v seqno=0 -v trailname="" '{if($1=="Sequence") {seqno=$3} else if($1$2=="ExtractTrail:") {trailname=$3}}END{for(i=6-length(seqno);i>=1;i--) trailname=trailname"0";print trailname""seqno}' #獲取投遞程式讀取的trail檔案的檔案頭 trailePre=`echo "${extractInfo}" | awk '{if($1$2=="ExtractTrail:") print $3}' | sed 's#\./dirdat#'"${ExtractTrailDir}"'#g'` #獲取當前指定投遞程式正在讀取的trail檔案的序列號 traileSeq=`echo "${extractInfo}" | awk '{if($1=="Sequence") print $3}'` #判斷是否為第一次,如果為第一次表示陣列內沒有存放任何extract程式資訊。需要給陣列內賦值 if [ ${arrayExtractNum} -eq 0 ];then arrayExtract[${arrayExtractNum}]=$i" "${trailePre}" "${traileSeq} arrayExtractNum=$[${arrayExtractNum}+1] else #迴圈陣列,判斷陣列內的extract程式讀取的trail檔案是否和當前的extract程式讀取的檔案一致。如果一致,比對2個程式讀取人間的seq號。如果當前程式讀取的seq號比陣列內程式讀取的seq號小,則把陣列內的比對的程式資訊替換為當前程式資訊。 for ((n=0;n<${#arrayExtract[@]};n++)) do #判斷陣列內程式讀取的checkpoint檔案前置名稱是否和當前的程式讀取的檔案前置名稱一樣 if [ "${trailePre}" == `echo ${arrayExtract[${n}]} | awk '{print $2}'` ];then #如果2個程式的前置名稱一樣,則比對checkpoint檔案的seq號,把相對seq號小的程式保留在陣列內 if [ ${traileSeq} -le `echo ${arrayExtract[${n}]} | awk '{print $3}'` ];then arrayExtract[${n}]=$i" "${trailePre}" "${traileSeq} #根據陣列下標,替換seq小的程式資訊 isupdate=1 #修改變數,表示在陣列內替換過內容 #arrayReplicatNum=$[${arrayReplicatNum}-1] break fi fi done if [ ${isupdate} -eq 0 ];then #如果陣列內沒有替換過內容,則把當前程式資訊新增到陣列內,否則修改變數值為0,表示沒有替換過陣列內容。 arrayExtract[${arrayExtractNum}]=$i" "${trailePre}" "${traileSeq} arrayExtractNum=$[${arrayExtractNum}+1] else isupdate=0 fi fi #arrayExtractNum=$[${arrayExtractNum}+1] done for ((i=0;i<${#arrayExtract[@]};i++)) do echo "####################### Extract: `echo "${arrayExtract[${i}]}" | awk '{print $1}'` ########################" >> ${rmlog} #獲取當前程式的trail檔案前置名稱 trailePre=`echo "${arrayExtract[${i}]}" | awk '{print $2}'` for j in $(ls `echo "${arrayExtract[${i}]}" | awk '{print $2"*"}'`) #根據trail檔案的前置名稱ls do #獲取檔案的序列號,如果為0號檔案,可能沒有檔案號需要重新複製檔案序列號。 existsfilenum=`echo $j | sed -e 's#'"${trailePre}"'##g'` #迴圈去掉檔案字首後的數字,可能會006302,所以要把前面的00去掉。判斷第一個非零的數字的位置 for((pos=0;pos<${#existsfilenum};pos++)) do if [ ${existsfilenum:$pos:1} -ne 0 ];then break fi done varlen=$[ ${#existsfilenum} - ${pos} ] #獲取非零數字到字串結尾的長度 existsfilenum=`echo ${existsfilenum:$pos:${varlen}}` #擷取字串,獲取真正的檔案的seq號 if [ -z ${existsfilenum} ];then existsfilenum=0 fi #判斷當前檔案是否小於指定seq號,如果小於則刪除檔案 extractProcNum=`echo "${arrayExtract[${i}]}" | awk '{print $3}'` if [ $[ ${extractProcNum} - ${keepfiles} ] -gt ${existsfilenum} ];then echo $j >> ${rmlog} #echo "rm -f ${j}" | bash fi done #echo ${arrayExtract[${i}]} done #迴圈判斷指定投遞程式對應的抽取程式的抽取trail檔案 } ################################################################## #獲取所有replicat程式資訊 ################################################################## getOGGReplicatInfo(){ ${ComGgsci}<<-RAY info replicat * RAY } ################################################################## #函式:刪除複製程式指定保留數量前的trail檔案 ################################################################## deleteReplicatfile(){ arrayReplicat=() arrayReplicatNum=0 isupdate=0 echo "################################# delete Replicat tail #################################" >> ${rmlog} #獲取複製程式的名稱和正在讀取的checkpoint檔名稱,以逗號分隔 for i in `getOGGReplicatInfo | egrep -v "GGSCI|^$" | sed -n '/REPLICAT/,$p' | awk -v rname="" '{if($1=="REPLICAT") {rname=$2;mynum=1}else if(($1$2$3=="LogReadCheckpoint")){print rname","$5}}'` do #獲取當前複製程式的trail檔案的前置名稱 replicatFilePre=`echo $i | awk -F ',' '{print $2}' | awk -F '/' -v prefile="" '{for(i=1;i<=NF;i++) {if(i==1){continue} else if(i==NF) {prefile=prefile"/"substr($i,1,2)} else {prefile=prefile"/"$i}}}END{print prefile}' | sed 's#\./dirdat#'"${ExtractTrailDir}"'#g'` #獲取當前程式正在讀取的trail檔案的seq號 #replicatSeq=`echo $i | awk -F ',' '{print $2}' | awk -F ''"${replicatFilePre}"'' '{print $NF}' | sed 's#0##g'` replicatSeq=`echo $i | awk -F ',' '{print $2}' | awk -F ''"${replicatFilePre}"'' -v mynum=0 '{for(i=0;i<length($NF);i++) if(substr($NF,i,1)!=0) {mynum=i;break}}END{print substr($NF,mynum)}'` #獲取當前存在的源端投遞過來的trail檔案 #判斷是否為第一次,如果為第一次表示陣列內沒有存放任何replicat程式資訊。需要給陣列內賦值 if [ ${arrayReplicatNum} -eq 0 ];then arrayReplicat[${arrayReplicatNum}]=`echo $i | awk -F ',' '{print $1}'`" "${replicatFilePre}" "${replicatSeq} arrayReplicatNum=$[${arrayReplicatNum}+1] else #迴圈陣列,判斷陣列內的replicat程式讀取的trail檔案是否和當前的replicat程式讀取的檔案一致。如果一致,比對2個程式讀取人間的seq號。如果當前程式讀取的seq號比陣列內程式讀取的seq號小,則把陣列內的比對的程式資訊替換為當前程式資訊。 for ((n=0;n<${#arrayReplicat[@]};n++)) do #判斷陣列內程式讀取的checkpoint檔案前置名稱是否和當前的程式讀取的檔案前置名稱一樣 if [ "${replicatFilePre}" == `echo ${arrayReplicat[${n}]} | awk '{print $2}'` ];then #如果2個程式的前置名稱一樣,則比對checkpoint檔案的seq號,把相對seq號小的程式保留在陣列內 if [ ${replicatSeq} -le `echo ${arrayReplicat[${n}]} | awk '{print $3}'` ];then arrayReplicat[${n}]=`echo $i | awk -F ',' '{print $1}'`" "${replicatFilePre}" "${replicatSeq} isupdate=1 #修改變數,表示在陣列內替換過內容 break fi fi done if [ ${isupdate} -eq 0 ];then arrayReplicat[${arrayReplicatNum}]=`echo $i | awk -F ',' '{print $1}'`" "${replicatFilePre}" "${replicatSeq} arrayReplicatNum=$[${arrayReplicatNum}+1] else isupdate=0 fi fi #arrayReplicatNum=$[${arrayReplicatNum}+1] done for ((i=0;i<${#arrayReplicat[@]};i++)) do echo "####################### Replicat: $(echo ${arrayReplicat[${i}]} | awk '{print $1}') ########################" >> ${rmlog} replicatFilePre=`echo "${arrayReplicat[${i}]}" | awk '{print $2}'` for j in $(ls `echo "${arrayReplicat[${i}]}" | awk '{print $2"*"}'`) do #獲取檔案的seq號 existsfilenum=`echo $j | sed -e 's#'"${replicatFilePre}"'##g'` #迴圈去掉檔案字首後的數字,可能會006302,所以要把前面的00去掉。判斷第一個非零的數字的位置 for((pos=0;pos<${#existsfilenum};pos++)) do if [ ${existsfilenum:$pos:1} -ne 0 ];then break fi done varlen=$[ ${#existsfilenum} - ${pos} ] #獲取非零數字到字串結尾的長度 existsfilenum=`echo ${existsfilenum:$pos:${varlen}}` #擷取字串,獲取真正的檔案的seq號 #如果檔案的seq為0,重新複製seq為0 if [ -z ${existsfilenum} ];then existsfilenum=0 fi #判斷當前的trail檔案是否小於保留時間的條件 replicatProcNum=`echo "${arrayReplicat[${i}]}" | awk '{print $3}'` if [ $[ ${replicatProcNum} - ${keepfiles} ] -gt ${existsfilenum} ];then echo $j >> ${rmlog} #echo "rm -f ${j}" | bash fi done done } help_fun(){ echo "Discription:" echo " This is a script to delete oracle goldengate trail files." echo "Parameters:" echo " -p specify a value for deleting action." echo " avalable value: extract/replicat/all" echo " -h to get help." } ################################################################## #指令碼的執行入口,獲取引數 ################################################################## if [ $# -eq 0 ];then echo "You must specify a right parameter." echo "You can use -h or -H to get help." exit 99 fi while (($#>=1)) do case `echo $1 | sed s/-//g | tr [a-z] [A-Z]` in H) help_fun #執行幫助函式 exit 0 ;; P) shift rmAction=$1 #獲取-p引數的值 shift continue ;; *) echo "You must specify a right parameter." echo "You can use -h or -H to get help." exit 98 ;; esac done ################################################################## #記錄日誌 ################################################################## if [ ! -f ${rmlog} ];then touch ${rmlog} fi echo "" echo "#################################`date +"%Y-%m-%d %H:%M:%S"`#################################" >> ${rmlog} ################################################################## #判斷-p引數的值,執行刪除函式 ################################################################## case `echo ${rmAction} | tr [a-z] [A-Z]` in EXTRACT) deleteExtractfile exit 0 ;; REPLICAT) deleteReplicatfile exit 0 ;; ALL) deleteExtractfile deleteReplicatfile exit 0 ;; *) echo "You must specify a valid value for -p." echo "You can use -h or -H to get help." exit 97 ;; esac
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28572479/viewspace-2649790/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- RocketMQ -- 過期檔案的刪除MQ
- kafka-- 過期檔案的刪除Kafka
- oracle rman 刪除過期的歸檔Oracle
- oracle 刪除過期的歸檔日誌Oracle
- shell指令碼之刪除固定天數之前的檔案指令碼
- OGG強制刪除replicat
- redis 過期鍵刪除策略Redis
- SVN !檔案刪除
- rm 刪除檔案
- Git——刪除檔案Git
- u盤裡的檔案無法刪除 如何刪除u盤裡刪不掉的檔案
- 刪除vmvare的大檔案
- win10休眠檔案有必要刪除嗎 刪除休眠檔案的方法Win10
- linux shell 命令下批量新增檔案的字尾 和批量刪除 擁有某字尾的檔案Linux
- linux的刪除檔案命令和強制刪除命令Linux
- 又拍雲 Node.js 實現檔案上傳、刪除Node.js
- 如何刪除win10更新檔案_win10刪除更新檔案的方法Win10
- Linux shell 根據時間批量刪除指定資料夾下的檔案Linux
- Git刪除指定檔案Git
- Linux批量刪除檔案Linux
- dll檔案刪除不了
- Linux刪除檔案命令Linux
- Git恢復刪除的檔案Git
- 刪除檔案中的數字
- win10怎麼刪除dll檔案_win10dll檔案刪除的方法Win10
- win10休眠檔案如何刪除 win10刪除休眠檔案的步驟Win10
- win10怎麼刪除更新檔案 win10刪除更新檔案的方法Win10
- log4j2 自動刪除過期日誌檔案配置及實現原理解析
- 行動硬碟刪除的檔案能恢復嗎,怎麼恢復硬碟刪除的檔案硬碟
- MySQL socket檔案被刪除MySql
- [20201112]tmpwatch 刪除檔案.txt
- linux 模糊批量刪除檔案Linux
- 批量刪除大量小檔案
- Xcode 刪除沒用的描述檔案XCode
- 如何永久刪除Mac中的檔案?Mac
- 處理OGG-02198 Incompatible record (logical EOF) in trail fileAI
- 如何刪除win10睡眠檔案_win10怎麼刪除睡眠檔案Win10
- Qt 過載QComboBox,實現右側刪除鍵QT