监控Oracle数据库的常用shell脚本

时间:2007-06-15 来源: 作者: 【字体: 减小 增大收藏 | 投稿
  
前言

  这篇文章介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过UnixCron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库:

   检查实例的可用性
 
   检查监听器的可用性

   检查alert日志文件中的错误信息
 
   在存放log文件的地方满以前清空旧的log文件

   分析table和index以获得更好的性能

   检查表空间的使用情况

   找出无效的对象

   监控用户和事务

  DBA需要的Unix基本知识

  基本的UNIX命令

  以下是一些常用的Unix命令:

   ps--显示进程
   grep--搜索文件中的某种文本模式 财管家园 fs119.net
   mailx--读取或者发送mail
   cat--连接文件或者显示它们
   cut--选择显示的列
   awk--模式匹配语言
   df--显示剩余的磁盘空间

  以下是DBA如何使用这些命令的一些例子:

  显示服务器上的可用实例:

$ps-ef|grepsmon
oracle2183210Feb24?19:05ora_smon_oradb1
oracle89810Feb15?0:00ora_smon_oradb2
dliu2519919038010:48:57pts/60:00grepsmon
oracle277981005:43:54?0:00ora_smon_oradb3
oracle2878110Mar03?0:01ora_smon_oradb4、
  显示服务器上的可用监听器:

$ps-ef|greplistener|grep-vgrep
(译者注:grep命令应该加上-i参数,即grep-ilistener,该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)
oracle2387910Feb24?33:36/8.1.7/bin/tnslsnrlistener_db1-inherit 财软.联盟.fs119.net
oracle279391005:44:02?0:00/8.1.7/bin/tnslsnrlistener_db2-inherit
oracle2353610Feb12?4:19/8.1.7/bin/tnslsnrlistener_db3-inherit
oracle2889110Mar03?0:01/8.1.7/bin/tnslsnrlistener_db4-inherit
  查看Oracle存档目录的文件系统使用情况

$df-k|greporaarch
/dev/vx/dsk/proddg/oraarch711239684754872658507687%/u09/oraarch
  统计alter.log文件中的行数:

$catalert.log|wc-l
2984

  列出alert.log文件中的全部Oracle错误信息:

$grepORA-alert.log
ORA-00600:internalerrorcode,arguments:[kcrrrfswda.1],[],[],[],[],[]
ORA-00600:internalerrorcode,arguments:[1881],[25860496],[25857716],[]
  CRONTAB基本

  一个crontab文件中包含有六个字段: 财管家,园,fs119.net

  分钟0-59

  小时0-23

  月中的第几天1-31

  月份1-12

  星期几0-6,with0=Sunday

  Unix命令或者Shell脚本

  要编辑一个crontab文件,输入:

  Crontab-e

  要查看一个crontab文件,输入:

Crontab-l
04**5/dba/admin/analyze_table.ksh
303**3,6/dba/admin/hotbackup.ksh/dev/null2>&1


  在上面的例子中,第一行显示了一个分析表的脚本在每个星期5的4:00am运行。第二行显示了一个执行热备份的脚本在每个周三和周六的3:00a.m.运行。 财软联,盟,fs119.net

财软联盟.fs119.net

财软联.盟.fs119.net


财软联.盟.fs119.net

财管,家园,fs119.net

  监控数据库的常用Shell脚本

  以下提供的8个shell脚本覆盖了DBA每日监控工作的90%,你可能还需要修改UNIX的环境变量。

  检查Oracle实例的可用性

  oratab文件中列出了服务器上的所有数据库

$cat/var/opt/oracle/oratab
###################################################################
##/var/opt/oracle/oratab##
###################################################################
oradb1:/u01/app/oracle/product/8.1.7:Y
oradb2:/u01/app/oracle/product/8.1.7:Y
oradb3:/u01/app/oracle/product/8.1.7:N
oradb4:/u01/app/oracle/product/8.1.7:Y
  以下的脚本检查oratab文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)

###################################################################

财.软联盟.fs119.net


##ckinstance.ksh#####################################################################
ORATAB=/var/opt/oracle/oratab
echo"`date`"
echo"OracleDatabase(s)Status`hostname`:\n"

db=`egrep-i":Y|:N"$ORATAB|cut-d":"-f1|grep-v"\#"|grep-v"\*"`
pslist="`ps-ef|greppmon`"
foriin$db;do
echo"$pslist"|grep"ora_pmon_$i">/dev/null2>$1
if(($?));then
echo"OracleInstance-$i:Down"
else
echo"OracleInstance-$i:Up"
fi
done

  使用以下的命令来确认该脚本是可以执行的:

$chmod744ckinstance.ksh
$ls-lckinstance.ksh
-rwxr--r--1oracledba657Mar522:59ckinstance.ksh*
  以下是实例可用性的报表:

$ckinstance.ksh
MonMar410:44:12PST2002
OracleDatabase(s)StatusforDBHOSTserver:
OracleInstance-oradb1:Up
OracleInstance-oradb2:Up
OracleInstance-oradb3:Down 财 软联盟 fs119.net
OracleInstance-oradb4:Up
  检查Oracle监听器的可用性

  以下有一个类似的脚本检查Oracle监听器。如果监听器停了,该脚本将会重新启动监听器:

#######################################################################
##cklsnr.sh##
#######################################################################
#!/bin/ksh
DBALIST="primary.dba@company.com,another.dba@company.com";exportDBALIST
cd/var/opt/oracle
rm-flsnr.exist
ps-ef|grepmylsnr|grep-vgrep>lsnr.exist
if[-slsnr.exist]
then
echo
else
echo"Alert"|mailx-s"Listener'mylsnr'on`hostname`isdown"$DBALIST
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
ORACLE_SID=db1;exportORACLE_SID
ORAENV_ASK=NO;exportORAENV_ASK
PATH=$PATH:/bin:/usr/local/bin;exportPATH
.oraenv
LD_LIBRARY_PATH=${ORACLE_HOME}/lib;exportLD_LIBRARY_PATH
lsnrctlstartmylsnr
财软联 盟 fs119.net

fi

  检查Alert日志(ORA-XXXXX)

  每个脚本所使用的一些环境变量可以放到一个profile中:

#######################################################################
##oracle.profile##
#######################################################################
EDITOR=vi;exportEDITORORACLE_BASE=/u01/app/oracle;export
ORACLE_BASEORACLE_HOME=$ORACLE_BASE/product/8.1.7;export
ORACLE_HOMELD_LIBRARY_PATH=$ORACLE_HOME/lib;export
LD_LIBRARY_PATHTNS_ADMIN=/var/opt/oracle;export
TNS_ADMINNLS_LANG=american;export
NLS_LANGNLS_DATE_FORMAT='MonDDYYYYHH24:MI:SS';export
NLS_DATE_FORMATORATAB=/var/opt/oracle/oratab;export
ORATABPATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/
sbin:/usr/openwin/bin:/opt/bin:.;export
PATHDBALIST="primary.dba@company.com,another.dba@company.com";export
DBALIST 财管,家园,fs119.net
  以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误,该脚本还会给DBA发送一个警告的email。

####################################################################
##ckalertlog.sh##
####################################################################
#!/bin/ksh
../etc/oracle.profile
forSIDin`cat$ORACLE_HOME/sidlist`
do
cd$ORACLE_BASE/admin/$SID/bdump
if[-falert_${SID}.log]
then
mvalert_${SID}.logalert_work.log
touchalert_${SID}.log
catalert_work.log>>alert_${SID}.hist
grepORA-alert_work.log>alert.err
fi
if[`catalert.err|wc-l`-gt0]
then
mailx-s"${SID}ORACLEALERTERRORS"$DBALIST<alert.err
fi
rm-falert.err
rm-falert_work.log
done

  清除旧的归档文件

  以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:
财软联盟.fs119.net


$df-k|greparch
FilesystemkbytesusedavailcapacityMountedon
/dev/vx/dsk/proddg/archive71123968302102484059423243%/u08/archive

#######################################################################
##clean_arch.ksh##
#######################################################################
#!/bin/ksh
df-k|greparch>dfk.result
archive_filesystem=`awk-F""'{print$6}'dfk.result`
archive_capacity=`awk-F""'{print$5}'dfk.result`

if[[$archive_capacity>90%]]
then
echo"Filesystem${archive_filesystem}is${archive_capacity}filled"
#tryoneofthefollowingoptiondependonyourneed
find$archive_filesystem-typef-mtime2-execrm-r{}\;
tar
rman
fi
财,管家园,fs119.net

财软联.盟.fs119.net

财,管家园,fs119.net

财.管家园.fs119.net


财,软联盟,fs119.net

财 软联盟 fs119.net

  分析表和索引(以得到更好的性能)

  以下我将展示如果传送参数到一个脚本中:

####################################################################
##analyze_table.sh##
####################################################################
#!/bin/ksh
#inputparameter:1:password#2:SID
if(($#<1))thenecho"Pleaseenter'oracle'userpasswordasthefirstparameter!"exit0
fi
if(($#<2))thenecho"Pleaseenterinstancenameasthesecondparameter!"exit0
fi

  要传入参数以执行该脚本,输入:

$analyze_table.shmanageroradb1
  脚本的第一部分产生了一个analyze.sql文件,里面包含了分析表用的语句。脚本的第二部分分析全部的表:

##################################################################### 财,管家园,fs119.net
##analyze_table.sh##
#####################################################################
sqlplus-s<oracle/$1@$2
setheadingoff
setfeedoff
setpagesize200
setlinesize100
spoolanalyze_table.sql
select'ANALYZETABLE'||owner||'.'||segment_name||
'ESTIMATESTATISTICSSAMPLE10PERCENT;'
fromdba_segments
wheresegment_type='TABLE'
andownernotin('SYS','SYSTEM');
spooloff
exit
!
sqlplus-s<oracle/$1@$2
@./analyze_table.sql
exit
!
  以下是analyze.sql的一个例子:

$catanalyze.sql
ANALYZETABLEHIRWIN.JANUSAGE_SUMMARYESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEHIRWIN.JANUSER_PROFILEESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEAPPSSYS.HIST_SYSTEM_ACTIVITYESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEHTOMEH.QUEST_IM_VERSIONESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEJSTENZEL.HIST_SYS_ACT_0615ESTIMATESTATISTICSSAMPLE10PERCENT;

财管家园,fs119.net


ANALYZETABLEJSTENZEL.HISTORY_SYSTEM_0614ESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEJSTENZEL.CALC_SUMMARY3ESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEIMON.QUEST_IM_LOCK_TREEESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEAPPSSYS.HIST_USAGE_SUMMARYESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEPATROL.P$LOCKCONFLICTTXESTIMATESTATISTICSSAMPLE10PERCENT;

  检查表空间的使用

  以下的脚本检测表空间的使用。如果表空间只剩下10%,它将会发送一个警告email。

#####################################################################
##ck_tbsp.sh##
#####################################################################
#!/bin/ksh
sqlplus-s<oracle/$1@$2
setfeedoff
setlinesize100
setpagesize200
spooltablespace.alert
SELECTF.TABLESPACE_NAME,
TO_CHAR((T.TOTAL_SPACE-F.FREE_SPACE),'999,999')"USED(MB)",
TO_CHAR(F.FREE_SPACE,'999,999')"FREE(MB)",
财软联盟 fs119.net

TO_CHAR(T.TOTAL_SPACE,'999,999')"TOTAL(MB)",
TO_CHAR((ROUND((F.FREE_SPACE/T.TOTAL_SPACE)*100)),'999')||'%'PER_FREE
FROM(
SELECTTABLESPACE_NAME,
ROUND(SUM(BLOCKS*(SELECTVALUE/1024
FROMV\$PARAMETER
WHERENAME='db_block_size')/1024)
)FREE_SPACE
FROMDBA_FREE_SPACE
GROUPBYTABLESPACE_NAME
)F,
(
SELECTTABLESPACE_NAME,
ROUND(SUM(BYTES/1048576))TOTAL_SPACE
FROMDBA_DATA_FILES
GROUPBYTABLESPACE_NAME
)T
WHEREF.TABLESPACE_NAME=T.TABLESPACE_NAME
AND(ROUND((F.FREE_SPACE/T.TOTAL_SPACE)*100))<10;
spooloff
exit
!
if[`cattablespace.alert|wc-l`-gt0]
then
cattablespace.alert-ltablespace.alert>tablespace.tmp
mailx-s"TABLESPACEALERTfor${2}"$DBALIST<tablespace.tmp
fi

  警告email输出的例子如下:

TABLESPACE_NAMEUSED(MB)FREE(MB)TOTAL(MB)PER_FREE
----------------------------------------------------------------------------
SYSTEM2,0472032,2509%

财管.家园.fs119.net


STBS01302253278%
STBS02241112524%
STBS03233192528%
  查找出无效的数据库对象

  以下查找出无效的数据库对象:

#######################################################################invalid_object_alert.sh########################################################################!/bin/ksh./etc/oracle.profile
sqlplus-s<oracle/$1@$2
setfeedoff
setheadingoffcolumnobject_nameformata30
spoolinvalid_object.alert
SELECTOWNER,OBJECT_NAME,OBJECT_TYPE,STATUSFROMDBA_OBJECTSWHERESTATUS='INVALID'ORDERBYOWNER,OBJECT_TYPE,OBJECT_NAME;
spooloff
exit!if[`catinvalid_object.alert|wc-l`-gt0]then
mailx-s"INVALIDOBJECTSfor${2}"$DBALIST<invalid_object.alert
fi$catinvalid_object.alert
OWNEROBJECT_NAMEOBJECT_TYPESTATUS
----------------------------------------------------------------------
HTOMEHDBMS_SHARED_POOLPACKAGEBODYINVALID 财软联,盟,fs119.net
HTOMEHX_$KCBFWAITVIEWINVALID
IMONIW_MONPACKAGEINVALID
IMONIW_MONPACKAGEBODYINVALID
IMONIW_ARCHIVED_LOGVIEWINVALID
IMONIW_FILESTATVIEWINVALID
IMONIW_SQL_FULL_TEXTVIEWINVALID
IMONIW_SYSTEM_EVENT1VIEWINVALID
IMONIW_SYSTEM_EVENT_CATVIEWINVALIDLBAILEYCHECK_TABLESPACE_USAGEPROCEDUREINVALID
PATROLP$AUTO_EXTEND_TBSPVIEWINVALID
SYSDBMS_CRYPTO_TOOLKITPACKAGEINVALID
SYSDBMS_CRYPTO_TOOLKITPACKAGEBODYINVALID
SYSUPGRADE_SYSTEM_TYPES_TO_816PROCEDUREINVALID
SYSAQ$_DEQUEUE_HISTORY_TTYPEINVALID
SYSHS_CLASS_CAPSVIEWINVALIDSYSHS_CLASS_DDVIEWINVALID
  监视用户和事务(死锁等)

  以下的脚本在死锁发生的时候发送一个警告e-mail:

###################################################################
##deadlock_alert.sh##
###################################################################
#!/bin/ksh
../etc/oracle.profile 财管家.园.fs119.net
sqlplus-s<oracle/$1@$2
setfeedoff
setheadingoff
spooldeadlock.alert
SELECTSID,DECODE(BLOCK,0,'NO','YES')BLOCKER,
DECODE(REQUEST,0,'NO','YES')WAITER
FROMV$LOCK
WHEREREQUEST>0ORBLOCK>0
ORDERBYblockDESC;
spooloff
exit
!
if[`catdeadlock.alert|wc-l`-gt0]
then
mailx-s"DEADLOCKALERTfor${2}"$DBALIST<deadlock.alert
fi

  结论

0,20,407-17**1-5/dba/scripts/ckinstance.sh>/dev/null2>&1
0,20,407-17**1-5/dba/scripts/cklsnr.sh>/dev/null2>&1
0,20,407-17**1-5/dba/scripts/ckalertlog.sh>/dev/null2>&1
30***0-6/dba/scripts/clean_arch.sh>/dev/null2>&1
*5**1,3/dba/scripts/analyze_table.sh>/dev/null2>&1
*5**0-6/dba/scripts/ck_tbsp.sh>/dev/null2>&1
*5**0-6/dba/scripts/invalid_object_alert.sh>/dev/null2>&1
0,20,407-17**1-5/dba/scripts/deadlock_alert.sh>/dev/null2>&1

财.管家园.fs119.net


  通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。 财管家,园,fs119.net

财管家园.fs119.net

财.软联盟.fs119.net


上一篇:Oracle9i中监视索引的使用
下一篇:Oracle专家调优秘密

精品课程推荐