您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用shell腳本實現對OGG進程過期trail文件的刪除處理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用shell腳本實現對OGG進程過期trail文件的刪除處理”吧!
#!/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
到此,相信大家對“怎么用shell腳本實現對OGG進程過期trail文件的刪除處理”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。