天天看點

Oracle資料庫管理常用的監控腳本------極大的簡化運維工作

 

  最近幾天都研究SHELL腳本,為了友善對公司的Oracle運維,簡化管理,學習一些SHELL腳本是非常有必要的,通過書本和網上的一些資料,整理出了一些比較精典的腳本,都是經過清自測試可行的,放上來共大家分享。

# 監控Oracle監聽狀态(chk_lsnr_stat.sh) 

# ======================================================================================

# 監控Oracle監聽器狀态,發現狀态異常啟動監聽,并發送郵件通知管理者,如果啟動監聽失敗,發送郵件

# 通知管理者。 

#! /bin/bash 

. /home/oracle/.bash_profile 

tempfile=$ORACLE_BASE/admin/$ORACLE_SID/tempfile.lis 

su - oracle -c "lsnrctl status" > /dev/null 

if [ $? != '0' ]; then 

   echo "" >> $tempfile 

   echo "======================================================" >> $tempfile 

   echo "`date +%D-%T`" >> $tempfile 

   su - oracle -c "lsnrctl start" >> $tempfile 

   if [ $? = '0' ]; then 

      cat $tempfile | mail [email protected] -s "The Listener Shutdown,and Restarted Success" 

   else 

     cat $tempfile | mail [email protected] -s "The Listener Shutdown,and Restarted Failed" 

   fi 

fi 

---------------------------------------------------------------------------------------- 

# 監控Oracle執行個體狀态(chk_inst_stat.sh) 

# ===================================================================================== 

# 監控Oracle執行個體是否打開,執行個體打開時,資料庫是否可用,當執行個體關閉,資料庫不可用時發送告警郵件 

# 通知管理者(判斷時除開+ASM這個特殊執行個體) 

ORATAB=/etc/oratab 

tempfile=/home/oracle/tempfile.lis 

db=`cat $ORATAB |egrep -i ":Y|:N"|cut -d ":" -f 1|grep -v "^+"` 

pslist="`ps -ef | grep pmon|grep -v grep`"  

mark=n 

dbstat=`su - oracle << EOF 

    sqlplus -s /nolog 

    conn / as sysdba 

    set feedback off heading off pagesize 0 

    select status from v\\$instance; 

    exit 

EOF` 

for db_name in $db; do 

       echo "$pslist" | grep "ora_pmon_$db_name" > /dev/null 2>&1 

    if [ $? = "0" ]; then  

       if [ $dbstat != "OPEN" ];then 

          mark=y 

          break 

       fi 

    else 

       mark=y 

       break 

    fi  

done 

if [ $mark != 'n' ];then 

   echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' >> $tempfile 

   echo "SERVER: $HOSTNAME" >> $tempfile 

   echo "`date +%D-%T`"  >> $tempfile 

   echo 'WARN!!! Oracle Database Unavailable' >> $tempfile 

   echo "Maybe The Following Reasons: The Instance or Database is not OPEN" >>$tempfile 

   echo | mail -s "Oracle Database Abnormal" [email protected] < $tempfile 

   rm -f $tempfile 

------------------------------------------------------------------------------------------ 

# 監控歸檔目錄空間(chk_arc_space.sh) 

#===================================================================================== 

# 将日志目錄空間控制在200M,當容量大于200M時,将最舊日志打包複制到其它目錄,并删除之 

# 直到日志目錄空間容量小于200M為止。 

ARC_DIR=/disk01/tbs03 

BAK_DIR=/opt/arcbackup 

limit=200 

capacity() 

  du -sh $ARC_DIR|awk -F " " '{print $1}'|tr -d M 

oldlog() 

  ls -l|sort -k6|sed '1d'|head -1|awk -F " " '{print $9}' 

cd $ARC_DIR 

if [ `capacity` -gt $limit ]; then 

     echo ""|mail -s "The Archivelog Directory is Over Than $limit"\ 

 [email protected] 

while [ `capacity` -gt $limit ]  

do   

    file=`oldlog` 

    tar -czf $file.`date +%Y%m%d%H%M`.tar.gz $file 

    cp $file.`date +%Y%m%d%H%M`.tar.gz $BAK_DIR/ 

    rm -rf $ARC_DIR/$file $ARC_DIR/$file.`date +%Y%m%d%H%M`.tar.gz 

# 監控警告檔案錯誤資訊(chk_alert_info.sh) 

#================================================================================ 

# 固定時間間隔内檢查alert_$ORACLE_SID.log檔案中是否包含ORA-開頭的錯誤資訊,如果存在 

# 則将其以郵件的形式通知管理者。 

cd $ORACLE_BASE/admin/$ORACLE_SID/bdump/ 

mv alert_$ORACLE_SID.log alert_temp.log 

touch alert_$ORACLE_SID.log 

cat alert_temp.log >> alert.$ORACLE_SID.hist 

grep ORA- alert_temp.log > alert.err 

if [ `cat alert.err|wc -l` -gt 0 ];then 

     mail -s "ORACLE ALERT ERROR" [email protected] < alert.err 

rm -rf alert.err 

rm -rf alert_temp.log 

# 監控磁盤空間使用率(chk_disk_space) 

# ==================================================================== 

# 判斷/dev開頭的磁盤或分區空間使用率,當磁盤空間使用率超過90%則發送郵件通知 

# 管理者 

limit=90% 

tempfile=chk_disk_space.tmp 

diskusage() 

   df -h|grep -v Filesystem|sed '/\/dev\/mapper/N;s/\n//'|grep "^/dev"|awk -F " " '{print $5}' 

for percent in `diskusage` 

do 

   if [[ $percent > $limit]];then 

    df -h > $tempfile 

    mail -s "Disk Usage Over than $limit on `hostname`" < $tempfile 

    rm -rf $tempfile     

# 監控表空間空閑表空間(chk_tbs_free.sh) 

#================================================================================== 

# 監控空閑表空間,當空閑表空間低于20%時,發送郵件通知管理者 

su - oracle > /dev/null << EOF 

sqlplus -s /nolog 

conn / as sysdba 

set feedback off  

set heading off 

set verify off 

set pagesize 0 

set linesize 200 

spool tbsfree.alert 

select t.tablespace_name,f.free_space/t.total_space from  

(select tablespace_name,sum(bytes) total_space from  

dba_data_files group by tablespace_name) t, 

(select tablespace_name,sum(bytes) free_space from  

dba_free_space group by tablespace_name) f  

where t.tablespace_name=f.tablespace_name and f.free_space/t.total_space < 0.20 

spool off 

exit 

EOF 

if [ `cat tbsfree.alert|wc -l` -gt 0 ];then 

      cat tbsfree.alert|mail -s "No Free Space in Oracle db" [email protected] 

      rm -rf tbsfree.alert 

# 全庫冷備份(full_cold_backup.sh) 

# ================================================================================= 

# 資料庫打開時,自動生成備份腳本。然後關閉資料庫,對控制檔案,資料檔案,重做日志檔案, 

# 初始化參數檔案及密碼檔案做冷備,完成後打開資料庫。 

backup_dir=/disk01/backup/coldbak 

log_file=/disk01/backup/coldbak/cold_backup_$ORACLE_SID.log 

echo 'Begin Cold Backup>>>>>>>>>>>>>>>>'  >> $log_file 

date >> $log_file 

set feedback off heading off pagesize 0 line 1000 

spool file_copy_$ORACLE_SID.sh 

select 'cp ' || name || ' $backup_dir/' from v$controlfile; 

select 'cp' || file_name || ' $backup_dir/' from dba_data_files; 

select 'cp' || member || ' $backup_dir/' from v$logfile; 

shutdown immediate 

! bash file_copy_$ORACLE_SID.sh 

startup 

if [ -e $ORACLE_HOME/dbs/init$ORACLE_SID.ora ];then 

     cp $ORACLE_HOME/dbs/init$ORACLE_SID.ora $backup_dir/ 

if [ -e $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora ];then 

     cp $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora $backup_dir/ 

if [ -e $ORACLE_HOME/dbs/orapw$ORACLE_SID ];then 

     cp $ORACLE_HOME/dbs/orapw$ORACLE_SID $backup_dir/ 

echo 'Cold Backup Finished>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>' >>$log_file 

# RMAN備份SHELL腳本(rman_backup.sh) 

#=========================================================================== 

# 實作指定級别的增量備份,由使用者傳入備份級别參數,如果不指參數則進行0級備份 

if [ $1 ];then 

   backup_level=$1 

else 

   backup_level=0 

backup_user=sys 

backup_user_pw=oracle 

#catalog_user=rman 

#catalog_user_pw=rman 

log_file=/home/oracle/rman_backup.log 

echo 'Begining rman backup  >>>>>>>>>>>>>>>>>>>>>>>>>>'  >> $log_file 

su - oracle >> $log_file << EOF 

rman target $backup_user/$backup_user_pw  

     # catalog $catalog_user/$catalog_user_pw 

backup incremental level = $backup_level database; 

quit; 

echo 'rman backup finished  >>>>>>>>>>>>>>>>>>>>>>>>>'  >> $log_file 

# 邏輯備份SHELL腳本(schema_exp.sh) 

#========================================================================= 

# EXP對資料庫schema對象進行備份,使用者可以将需要備份的使用者名做為參數傳入SHELL腳本 

BAK_DIR=/disk01/backup/logical_bak/ 

log_file=/disk01/backup/logical_bak/user_full_bak.log 

exp_par="userid=system/oracle buffer=10485760 owner=$1" 

if [ $2 ];then 

    exp_par="$exp_par file=$2" 

    exp_par="$exp_par file="$BAK_DIR/$1_`date +%Y%m%d%H%M`.dmp"" 

echo "Begining User $1 Export ---------------------" >> $log_file 

echo "Export with following parameters: $exp_par" >> $log_file 

su - oracle -c "exp $exp_par" >> $log_file 2>&1 

echo "Backup Finished ---------------------" >> $log_file 

本文轉自清風拂面 51CTO部落格,原文連結:http://blog.51cto.com/crazy123/1160933