最近几天都研究SHELL脚本,为了方便对公司的Oracle运维,简化管理,学习一些SHELL脚本是非常有必要的,通过书本和网上的一些资料,整理出了一些比较精典的脚本,都是经过清自测试可行的,放上来共大家分享。

 

 
    
  1. # 监控Oracle监听状态(chk_lsnr_stat.sh) 
  2. # ======================================================================================
  3. # 监控Oracle监听器状态,发现状态异常启动监听,并发送邮件通知管理员,如果启动监听失败,发送邮件
  4. # 通知管理员。 
  5. # ======================================================================================
  6.  
  7. #! /bin/bash 
  8.  
  9. . /home/oracle/.bash_profile 
  10.  
  11. tempfile=$ORACLE_BASE/admin/$ORACLE_SID/tempfile.lis 
  12.  
  13. su - oracle -c "lsnrctl status" > /dev/null 
  14.  
  15. if [ $? != '0' ]; then 
  16.    echo "" >> $tempfile 
  17.  
  18.    echo "======================================================" >> $tempfile 
  19.  
  20.    echo "`date +%D-%T`" >> $tempfile 
  21.  
  22.    su - oracle -c "lsnrctl start" >> $tempfile 
  23.  
  24.    if [ $? = '0' ]; then 
  25.     
  26.       cat $tempfile | mail [email protected] -s "The Listener Shutdown,and Restarted Success" 
  27.   
  28.    else 
  29.  
  30.      cat $tempfile | mail [email protected] -s "The Listener Shutdown,and Restarted Failed" 
  31.  
  32.    fi 
  33.  
  34. fi 
  35.  
  36.  
  37.  
  38. ---------------------------------------------------------------------------------------- 
  39.  
  40.  
  41. # 监控Oracle实例状态(chk_inst_stat.sh) 
  42. # ===================================================================================== 
  43. # 监控Oracle实例是否打开,实例打开时,数据库是否可用,当实例关闭,数据库不可用时发送告警邮件 
  44. # 通知管理员(判断时除开+ASM这个特殊实例) 
  45. # ===================================================================================== 
  46.  
  47. #! /bin/bash 
  48.  
  49. ORATAB=/etc/oratab 
  50.  
  51. tempfile=/home/oracle/tempfile.lis 
  52.  
  53. db=`cat $ORATAB |egrep -i ":Y|:N"|cut -d ":" -f 1|grep -v "^+"` 
  54.  
  55. pslist="`ps -ef | grep pmon|grep -v grep`"  
  56.  
  57. mark=n 
  58.  
  59. dbstat=`su - oracle << EOF 
  60.  
  61.     sqlplus -s /nolog 
  62.  
  63.     conn / as sysdba 
  64.  
  65.     set feedback off heading off pagesize 0 
  66.  
  67.     select status from v\\$instance; 
  68.  
  69.     exit 
  70.  
  71. EOF` 
  72.  
  73. for db_name in $db; do 
  74.   
  75.        echo "$pslist" | grep "ora_pmon_$db_name" > /dev/null 2>&1 
  76.         
  77.     if [ $? = "0" ]; then  
  78.         
  79.        if [ $dbstat != "OPEN" ];then 
  80.  
  81.           mark=y 
  82.            
  83.           break 
  84.     
  85.        fi 
  86.         
  87.     else 
  88.      
  89.        mark=y 
  90.         
  91.        break 
  92.         
  93.     fi  
  94.      
  95. done 
  96.  
  97. if [ $mark != 'n' ];then 
  98.  
  99.    echo '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> $tempfile 
  100.    echo "SERVER: $HOSTNAME" >> $tempfile 
  101.    echo "`date +%D-%T`"  >> $tempfile 
  102.    echo 'WARN!!! Oracle Database Unavailable' >> $tempfile 
  103.    echo "Maybe The Following Reasons: The Instance or Database is not OPEN" >>$tempfile 
  104.     
  105.    echo | mail -s "Oracle Database Abnormal" [email protected] < $tempfile 
  106.    rm -f $tempfile 
  107.     
  108. fi 
  109.  
  110. ------------------------------------------------------------------------------------------ 
  111.  
  112.  
  113. # 监控归档目录空间(chk_arc_space.sh) 
  114. #===================================================================================== 
  115. # 将日志目录空间控制在200M,当容量大于200M时,将最旧日志打包复制到其它目录,并删除之 
  116. # 直到日志目录空间容量小于200M为止。 
  117. #===================================================================================== 
  118.  
  119. #! /bin/bash 
  120.  
  121. ARC_DIR=/disk01/tbs03 
  122.  
  123. BAK_DIR=/opt/arcbackup 
  124.  
  125. limit=200 
  126.  
  127. capacity() 
  128.  
  129.  
  130.   du -sh $ARC_DIR|awk -F " " '{print $1}'|tr -d M 
  131.  
  132.  
  133.  
  134. oldlog() 
  135.  
  136.  
  137.   ls -l|sort -k6|sed '1d'|head -1|awk -F " " '{print $9}' 
  138.    
  139.  
  140. cd $ARC_DIR 
  141.  
  142. if [ `capacity` -gt $limit ]; then 
  143.  
  144.      echo ""|mail -s "The Archivelog Directory is Over Than $limit"\ 
  145.  [email protected] 
  146.  
  147. fi 
  148.  
  149. while [ `capacity` -gt $limit ]  
  150.  
  151. do   
  152.      
  153.     file=`oldlog` 
  154.      
  155.     tar -czf $file.`date +%Y%m%d%H%M`.tar.gz $file 
  156.      
  157.     cp $file.`date +%Y%m%d%H%M`.tar.gz $BAK_DIR/ 
  158.      
  159.     rm -rf $ARC_DIR/$file $ARC_DIR/$file.`date +%Y%m%d%H%M`.tar.gz 
  160.      
  161. done 
  162.  
  163.  
  164.  
  165. # 监控警告文件错误信息(chk_alert_info.sh) 
  166. #================================================================================ 
  167. # 固定时间间隔内检查alert_$ORACLE_SID.log文件中是否包含ORA-开头的错误信息,如果存在 
  168. # 则将其以邮件的形式通知管理员。 
  169. #================================================================================ 
  170.  
  171. #! /bin/bash 
  172.  
  173. . /home/oracle/.bash_profile 
  174.  
  175. cd $ORACLE_BASE/admin/$ORACLE_SID/bdump/ 
  176.  
  177. mv alert_$ORACLE_SID.log alert_temp.log 
  178.  
  179. touch alert_$ORACLE_SID.log 
  180.  
  181. cat alert_temp.log >> alert.$ORACLE_SID.hist 
  182.  
  183. grep ORA- alert_temp.log > alert.err 
  184.  
  185. if [ `cat alert.err|wc -l` -gt 0 ];then 
  186.  
  187.      mail -s "ORACLE ALERT ERROR" [email protected] < alert.err 
  188.       
  189. fi 
  190.  
  191. rm -rf alert.err 
  192.  
  193. rm -rf alert_temp.log 
  194.  
  195.  
  196.  
  197. # 监控磁盘空间利用率(chk_disk_space) 
  198. # ==================================================================== 
  199. # 判断/dev开头的磁盘或分区空间利用率,当磁盘空间利用率超过90%则发送邮件通知 
  200. # 管理员 
  201. # ==================================================================== 
  202.  
  203. #! /bin/bash 
  204.  
  205. limit=90
  206.  
  207. tempfile=chk_disk_space.tmp 
  208.  
  209. mark=n 
  210.  
  211. diskusage() 
  212.  
  213.  
  214.    df -h|grep -v Filesystem|sed '/\/dev\/mapper/N;s/\n//'|grep "^/dev"|awk -F " " '{print $5}' 
  215.     
  216.  
  217. for percent in `diskusage` 
  218.  
  219. do 
  220.  
  221.    if [[ $percent > $limit]];then 
  222.     
  223.        mark=y 
  224.         
  225.        break 
  226.         
  227.    fi 
  228.     
  229. done 
  230.  
  231. if [ $mark != 'n' ];then 
  232.  
  233.     df -h > $tempfile 
  234.      
  235.     mail -s "Disk Usage Over than $limit on `hostname`" < $tempfile 
  236.  
  237.     rm -rf $tempfile     
  238. fi 
  239.  
  240.  
  241.  
  242.  
  243. # 监控表空间空闲表空间(chk_tbs_free.sh) 
  244. #================================================================================== 
  245. # 监控空闲表空间,当空闲表空间低于20%时,发送邮件通知管理员 
  246. #================================================================================== 
  247.  
  248. #! /bin/bash 
  249.  
  250. su - oracle > /dev/null << EOF 
  251. sqlplus -s /nolog 
  252. conn / as sysdba 
  253. set feedback off  
  254. set heading off 
  255. set verify off 
  256. set pagesize 0 
  257. set linesize 200 
  258.  
  259. spool tbsfree.alert 
  260.  
  261. select t.tablespace_name,f.free_space/t.total_space from  
  262. (select tablespace_name,sum(bytes) total_space from  
  263. dba_data_files group by tablespace_name) t, 
  264. (select tablespace_name,sum(bytes) free_space from  
  265. dba_free_space group by tablespace_name) f  
  266. where t.tablespace_name=f.tablespace_name and f.free_space/t.total_space < 0.20 
  267.  
  268. spool off 
  269.  
  270. exit 
  271.  
  272. EOF 
  273.  
  274. if [ `cat tbsfree.alert|wc -l` -gt 0 ];then 
  275.  
  276.       cat tbsfree.alert|mail -s "No Free Space in Oracle db" [email protected] 
  277.        
  278.       rm -rf tbsfree.alert 
  279.        
  280. fi 
  281.  
  282.  
  283. # 全库冷备份(full_cold_backup.sh) 
  284. # ================================================================================= 
  285. # 数据库打开时,自动生成备份脚本。然后关闭数据库,对控制文件,数据文件,重做日志文件, 
  286. # 初始化参数文件及口令文件做冷备,完成后打开数据库。 
  287. # ================================================================================= 
  288.  
  289. #! /bin/bash 
  290.  
  291. . /home/oracle/.bash_profile 
  292.  
  293. backup_dir=/disk01/backup/coldbak 
  294.  
  295. log_file=/disk01/backup/coldbak/cold_backup_$ORACLE_SID.log 
  296.  
  297. echo 'Begin Cold Backup>>>>>>>>>>>>>>>>'  >> $log_file 
  298.  
  299. date >> $log_file 
  300.  
  301. su - oracle > /dev/null << EOF 
  302.  
  303. sqlplus -s /nolog 
  304.  
  305. conn / as sysdba 
  306.  
  307. set feedback off heading off pagesize 0 line 1000 
  308.  
  309. spool file_copy_$ORACLE_SID.sh 
  310.  
  311. select 'cp ' || name || ' $backup_dir/' from v$controlfile; 
  312.  
  313. select 'cp' || file_name || ' $backup_dir/' from dba_data_files; 
  314.  
  315. select 'cp' || member || ' $backup_dir/' from v$logfile; 
  316.  
  317. spool off 
  318.  
  319. shutdown immediate 
  320.  
  321. ! bash file_copy_$ORACLE_SID.sh 
  322.  
  323. startup 
  324.  
  325. exit 
  326.  
  327. EOF 
  328.  
  329. if [ -e $ORACLE_HOME/dbs/init$ORACLE_SID.ora ];then 
  330.  
  331.      cp $ORACLE_HOME/dbs/init$ORACLE_SID.ora $backup_dir/ 
  332.       
  333. fi 
  334.  
  335. if [ -e $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora ];then 
  336.  
  337.      cp $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora $backup_dir/ 
  338.       
  339. fi 
  340.  
  341. if [ -e $ORACLE_HOME/dbs/orapw$ORACLE_SID ];then 
  342.  
  343.      cp $ORACLE_HOME/dbs/orapw$ORACLE_SID $backup_dir/ 
  344.       
  345. fi 
  346.  
  347.  
  348. echo 'Cold Backup Finished>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>$log_file 
  349.  
  350. date >> $log_file 
  351.  
  352.  
  353. # RMAN备份SHELL脚本(rman_backup.sh) 
  354. #=========================================================================== 
  355. # 实现指定级别的增量备份,由用户传入备份级别参数,如果不指参数则进行0级备份 
  356. #=========================================================================== 
  357.  
  358. #! /bin/bash 
  359.  
  360. . /home/oracle/.bash_profile 
  361.  
  362. if [ $1 ];then 
  363.  
  364.    backup_level=$1 
  365.     
  366. else 
  367.  
  368.    backup_level=0 
  369.     
  370. fi 
  371.  
  372. backup_user=sys 
  373.  
  374. backup_user_pw=oracle 
  375.  
  376. #catalog_user=rman 
  377.  
  378. #catalog_user_pw=rman 
  379.  
  380. log_file=/home/oracle/rman_backup.log 
  381.  
  382. echo 'Begining rman backup  >>>>>>>>>>>>>>>>>>>>>>>>>>'  >> $log_file 
  383.  
  384. date >> $log_file 
  385.  
  386. su - oracle >> $log_file << EOF 
  387.  
  388. rman target $backup_user/$backup_user_pw  
  389.      # catalog $catalog_user/$catalog_user_pw 
  390.       
  391. backup incremental level = $backup_level database; 
  392.  
  393. quit; 
  394.  
  395. EOF 
  396.  
  397. echo 'rman backup finished  >>>>>>>>>>>>>>>>>>>>>>>>>'  >> $log_file 
  398.  
  399. date >> $log_file 
  400.  
  401.  
  402.  
  403. # 逻辑备份SHELL脚本(schema_exp.sh) 
  404. #========================================================================= 
  405. # EXP对数据库schema对象进行备份,用户可以将需要备份的用户名做为参数传入SHELL脚本 
  406. #========================================================================= 
  407.  
  408. #! /bin/bash 
  409.  
  410. BAK_DIR=/disk01/backup/logical_bak/ 
  411.  
  412. log_file=/disk01/backup/logical_bak/user_full_bak.log 
  413.  
  414. exp_par="userid=system/oracle buffer=10485760 owner=$1" 
  415.  
  416. if [ $2 ];then 
  417.  
  418.     exp_par="$exp_par file=$2" 
  419.      
  420. else 
  421.  
  422.     exp_par="$exp_par file="$BAK_DIR/$1_`date +%Y%m%d%H%M`.dmp"" 
  423.      
  424. fi 
  425.  
  426. echo "Begining User $1 Export ---------------------" >> $log_file 
  427.  
  428. echo "Export with following parameters: $exp_par" >> $log_file 
  429.  
  430. date >> $log_file 
  431.  
  432. su - oracle -c "exp $exp_par" >> $log_file 2>&1 
  433.  
  434. echo "Backup Finished ---------------------" >> $log_file 
  435.  
  436. date >> $log_file