oracle運維腳本

 

# 監控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這個特殊實例)

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

 

#! /bin/bash

 

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

 

fi

 

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

 

 

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

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

# 將日誌目錄空間控制在200M,當容量大於200M時,將最舊日誌打包複製到其它目錄,並刪除之

# 直到日誌目錄空間容量小於200M爲止。

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

 

#! /bin/bash

 

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]

 

fi

 

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

 

done

 

 

 

# 監控警告文件錯誤信息(chk_alert_info.sh)

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

# 固定時間間隔內檢查alert_$ORACLE_SID.log文件中是否包含ORA-開頭的錯誤信息,如果存在

# 則將其以郵件的形式通知管理員。

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

 

#! /bin/bash

 

. /home/oracle/.bash_profile

 

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

 

fi

 

rm -rf alert.err

 

rm -rf alert_temp.log

 

 

 

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

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

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

# 管理員

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

 

#! /bin/bash

 

limit=90%

 

tempfile=chk_disk_space.tmp

 

mark=n

 

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

 

mark=y

 

break

 

fi

 

done

 

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

 

df -h > $tempfile

 

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

 

rm -rf $tempfile

fi

 

 

 

 

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

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

# 監控空閒表空間,當空閒表空間低於20%時,發送郵件通知管理員

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

 

#! /bin/bash

 

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

 

fi

 

 

# 全庫冷備份(full_cold_backup.sh)

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

# 數據庫打開時,自動生成備份腳本。然後關閉數據庫,對控制文件,數據文件,重做日誌文件,

# 初始化參數文件及口令文件做冷備,完成後打開數據庫。

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

 

#! /bin/bash

 

. /home/oracle/.bash_profile

 

backup_dir=/disk01/backup/coldbak

 

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

 

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

 

date >> $log_file

 

su - oracle > /dev/null << EOF

 

sqlplus -s /nolog

 

conn / as sysdba

 

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;

 

spool off

 

shutdown immediate

 

! bash file_copy_$ORACLE_SID.sh

 

startup

 

exit

 

EOF

 

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

 

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

 

fi

 

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

 

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

 

fi

 

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

 

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

 

fi

 

 

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

 

date >> $log_file

 

 

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

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

# 實現指定級別的增量備份,由用戶傳入備份級別參數,如果不指參數則進行0級備份

#==========

=================================================================

 

#! /bin/bash

 

. /home/oracle/.bash_profile

 

if [ $1 ];then

 

backup_level=$1

 

else

 

backup_level=0

 

fi

 

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

 

date >> $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;

 

EOF

 

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

 

date >> $log_file

 

 

 

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

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

# EXP對數據庫schema對象進行備份,用戶可以將需要備份的用戶名做爲參數傳入SHELL腳本

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

 

#! /bin/bash

 

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"

 

else

 

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

 

fi

 

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

 

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

 

date >> $log_file

 

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

 

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

 

date >> $log_file

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章