这篇文章介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过UnixCron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库:
检查实例的可用性
检查监听器的可用性
检查alert日志文件中的错误信息
在存放log文件的地方满以前清空旧的log文件
分析table和index以获得更好的性能
检查表空间的使用情况
找出无效的对象
监控用户和事务
基本的UNIX命令
以下是一些常用的Unix命令:
ps--显示进程
grep--搜索文件中的某种文本模式 财管家园 fs119.net
mailx--读取或者发送mail
cat--连接文件或者显示它们
cut--选择显示的列
awk--模式匹配语言
df--显示剩余的磁盘空间
以下是DBA如何使用这些命令的一些例子:
显示服务器上的可用实例:
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、
显示服务器上的可用监听器:
(译者注: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存档目录的文件系统使用情况
/dev/vx/dsk/proddg/oraarch711239684754872658507687%/u09/oraarch
统计alter.log文件中的行数:
2984
列出alert.log文件中的全部Oracle错误信息:
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文件,输入:
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
以下提供的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文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)
###################################################################
##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监听器。如果监听器停了,该脚本将会重新启动监听器:
#######################################################################
##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
fi
每个脚本所使用的一些环境变量可以放到一个profile中:
财管,家园,fs119.net #######################################################################
##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
以下的脚本首先调用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 财管.家园.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;
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)",
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%
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
Google.cn搜索相关文章:
谷歌中搜索全球网 监控Oracle数据库的常用shell脚本
百度中搜索 监控Oracle数据库的常用shell脚本
谷歌中搜索www.fs119.net 监控Oracle数据库的常用shell脚本
下一篇:Oracle专家调优秘密