监控Oracle数据库的常用shell脚本
原文地址:监控Oracle数据库的常用shell脚本 作者:aaron8219
一.脚本来监控Oracle数据库:
1.检查实例的可用性
2.检查监听器的可用性
3.检查alert日志文件中的错误信息
4.在存放log文件的地方满以前清空旧的log文件
5.分析table和index以获得更好的性能
6.检查表空间的使用情况
7.找出无效的对象
8.监控用户和事务
二.DBA需要的Unix基本知识
基本的UNIX命令,以下是一些常用的Unix命令:
ps--显示进程
grep--搜索文件中的某种文本模式
mailx--读取或者发送mail
cat--连接文件或者显示它们
cut--选择显示的列
awk--模式匹配语言
df--显示剩余的磁盘空间
以下是DBA如何使用这些命令的一些例子:
1.显示服务器上的可用实例:
$ps�Cef|grepsmon
oracle220861002:32:24?0:04ora_smon_PPRD10
oracle521528972008:10:19pts/40:00grepsmon
2.显示服务器上的可用监听器:
$ps-ef|greplistenergrep-vgrep
(grep命令应该加上-i参数,即grep-ilistener,该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)
$ps�Cef|grep-ilistener
oracle965510Mar12?0:01/data/app/oracle/9.2.0/bin/tnslsnrLISTENER-inherit
oracle226101002:45:02?0:02/data/app/oracle/10.2.0/bin/tnslsnrLISTENER-inherit
oracle526828972008:13:02pts/40:00grep-ilistener
3.查看Oracle存档目录的文件系统使用情况
$df-k|grep/data
/dev/md/dsk/d50104977675886105421531735786%/data
4.统计alter.log文件中的行数:
$catalert_PPRD10.log|wc-l
13124
$morealert_PPRD10.log|wc-l
13124
5.列出alert.log文件中的全部Oracle错误信息:
$grepORA-*alert.log
ORA-00600:internalerrorcode,arguments:[kcrrrfswda.1],[],[]
ORA-00600:internalerrorcode,arguments:[1881],[25860496],[25857716],[]
6.CRONTAB基本
一个crontab文件中包含有六个字段:
分钟0-59
小时0-23
月中的第几天1-31
月份1-12
星期几0-6,with0=Sunday
7.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.运行。
三.监控数据库的常用Shell脚本
以下提供的8个shell脚本覆盖了DBA每日监控工作的90%,你可能还需要修改UNIX的环境变量。
1.检查Oracle实例的可用性
oratab文件中列出了服务器上的所有数据库
$cat/var/opt/oracle/oratab
#
#ThisfileisusedbyORACLEutilities.Itiscreatedbyroot.sh
#andupdatedbytheDatabaseConfigurationAssistantwhencreating
#adatabase.
#Acolon,':',isusedasthefieldterminator.Anewlineterminates
#theentry.Linesbeginningwithapoundsign,'#',arecomments.
#
#Entriesareoftheform:
#$ORACLE_SID:$ORACLE_HOME::
#
#Thefirstandsecondfieldsarethesystemidentifierandhome
#directoryofthedatabaserespectively.Thethirdfiledindicates
#tothedbstartutilitythatthedatabaseshould,"Y",orshouldnot,
#"N",bebroughtupatsystemboottime.
#
#Multipleentrieswiththesame$ORACLE_SIDarenotallowed.
#
#
#*:/data/app/oracle/9.2.0:N
TRNG:/data/app/oracle/9.2.0:Y
*:/data/app/oracle/9.2.0:N
PPRD:/data/app/oracle/10.2.0:Y
PPRD10:/data/app/oracle/10.2.0:N
以下的脚本检查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
以下是实例可用性的报表:
$shckinstance.ksh
WedMay1312:51:20PDT2009
OracleDatabase(s)Statusgambels:
OracleInstance-PPRD:Up
OracleInstance-PPRD10:Up
2.检查Oracle监听器的可用性
以下有一个类似的脚本检查Oracle监听器。假如监听器停了,该脚本将会重新启动监听器:
#####################################################################
##cklsnr.sh##
#####################################################################
#!/bin/ksh
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
ORACLE_SID=PPRD10;exportORACLE_SID
ORAENV_ASK=NO;exportORAENV_ASK
PATH=$PATH:/bin:/usr/local/bin;exportPATH
.oraenv
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";exportDBALIST
cd/var/opt/oracle
rm-flsnr.exist
ps-ef|grepPPRD10|grep-vgrep>lsnr.exist
if[-slsnr.exist]
then
echo
else
echo"Alert"|mailx-s"Listener'PPRD10'on`hostname`isdown"$DBALIST
lsnrctlstartPPRD10
fi
3.检查Alert日志(ORA-XXXXX)
####################################################################
##ckalertlog.sh##
####################################################################
#!/bin/ksh
EDITOR=vi;exportEDITOR
ORACLE_SID=PPRD10;exportORACLE_SID
ORACLE_BASE=/data/app/oracle;exportORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0;exportORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib;exportLD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
NLS_LANG=american;exportNLS_LANG
NLS_DATE_FORMAT='MonDDYYYYHH24:MI:SS';exportNLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;exportORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.;exportPATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";exportDBALIST
cd$ORACLE_BASE/admin/PPRD10/bdump
if[-falert_PPRD10.log]
then
mvalert_PPRD10.logalert_work.log
touchalert_PPRD10.log
catalert_work.log>>alert_PPRD10.hist
grepORA-alert_work.log>alert.err
fi
if[`catalert.err|wc-l`-gt0]
then
mailx-s"PPRD10ORACLEALERTERRORS"$DBALIST<alert.err
fi
rm-falert.err
rm-falert_work.log
4.清除旧的归档文件
以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:
$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-mtime+2-execrm-r{};
tar
rman
fi
5.分析表和索引(以得到更好的性能)
以下我将展示假如传送参数到一个脚本中:
####################################################################
##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文件,里面包含了分析表用的语句。脚本的第二部分分析全部的表:
#################################################################
##analyze_table.sh##
#################################################################
sqlplus-s'/assysdba'<
setheadingoff
setFeedoff
setpagesize200
setlinesize100
spoolanalyze_table.sql
select'ANALYZETABLE'||owner||'.'||segment_name||
'ESTIMATESTATISTICSSAMPLE10PERCENT;'
fromdba_segments
wheresegment_type='TABLE'
andownernotin('SYS','SYSTEM');
spooloff
exit
EOF
sqlplus-s'/assysdba'<
@./analyze_table.sql
exit
EOF
以下是analyze.sql的一个例子:
$catanalyze.sql
ANALYZETABLEHIRWIN.JANUSAGE_SUMMARYESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEHIRWIN.JANUSER_PROFILEESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEAPPSSYS.HIST_SYSTEM_ACTIVITYESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEHTOMEH.QUEST_IM_VERSIONESTIMATESTATISTICSSAMPLE10PERCENT;
ANALYZETABLEJSTENZEL.HIST_SYS_ACT_0615ESTIMATESTATISTICSSAMPLE10PERCENT;
6.检查表空间的使用
以下的脚本检测表空间的使用。假如表空间只剩下10%,它将会发送一个警告email。
#####################################################################
##ck_tbsp.sh##
#####################################################################
#!/bin/ksh
EDITOR=vi;exportEDITOR
ORACLE_SID=PPRD10;exportORACLE_SID
ORACLE_BASE=/data/app/oracle;exportORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0;exportORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib;exportLD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
NLS_LANG=american;exportNLS_LANG
NLS_DATE_FORMAT='MonDDYYYYHH24:MI:SS';exportNLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;exportORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.;exportPATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";exportDBALIST
sqlplus-s'/assysdba'<
setFeedoff
setlinesize100
setpagesize200
column"USED(MB)"formata10
column"FREE(MB)"formata10
column"TOTAL(MB)"formata10
columnPER_FREEformata10
spooltablespace.alert
SELECTF.TABLESPACE_NAME,
TO_CHAR((T.TOTAL_SPACE-F.FREE_SPACE),'999,999')"USED(MB)",
TO_CHAR(F.FREE_SPACE,999')"FREE(MB)",
TO_CHAR(T.TOTAL_SPACE,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))<80;
spooloff
exit
EOF
if[`cattablespace.alert|wc-l`-gt0]
then
cattablespace.alert>tablespace.tmp
mailx-s"TABLESPACEALERTforPPRD10"$DBALIST<tablespace.tmp
fi
警告email输出的例子如下:
TABLESPACE_NAMEUSED(MB)FREE(MB)TOTAL(MB)PER_FREE
----------------------------------------------------------------------
SYSTEM51940192044%
MILLDATA5594411,00044%
SYSAUX33160994065%
MILLREPORTS14625440064%
7.查找出无效的数据库对象
以下查找出无效的数据库对象:
#####################################################################
##invalid_object_alert.sh
#####################################################################
#!/bin/ksh
EDITOR=vi;exportEDITOR
ORACLE_SID=PPRD10;exportORACLE_SID
ORACLE_BASE=/data/app/oracle;exportORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0;exportORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib;exportLD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
NLS_LANG=american;exportNLS_LANG
NLS_DATE_FORMAT='MonDDYYYYHH24:MI:SS';exportNLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;exportORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.;exportPATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";exportDBALIST
sqlplus-s'/assysdba'<
setFeedoff
setheadingoff
columnOWNERformata10
columnOBJECT_NAMEformata35
columnOBJECT_TYPEformata10
columnSTATUSformata10
spoolinvalid_object.alert
SELECTOWNER,OBJECT_NAME,OBJECT_TYPE,STATUSFROMDBA_OBJECTSWHERESTATUS='INVALID'ORDERBYOWNER,OBJECT_NAME;
spooloff
exit
EOF
if[`catinvalid_object.alert|wc-l`-gt0]then
mailx-s"INVALIDOBJECTSforPPRD10"$DBALIST<invalid_object.alert
fi
$moreinvalid_object.alert
PUBLICALL_WM_LOCKED_TABLESSYNONYMINVALID
PUBLICALL_WM_VERSIONED_TABLESSYNONYMINVALID
PUBLICDBA_WM_VERSIONED_TABLESSYNONYMINVALID
PUBLICSDO_CART_TEXTSYNONYMINVALID
PUBLICSDO_GEOMETRYSYNONYMINVALID
PUBLICSDO_REGAGGRSYNONYMINVALID
PUBLICSDO_REGAGGRSETSYNONYMINVALID
PUBLICSDO_REGIONSYNONYMINVALID
PUBLICSDO_REGIONSETSYNONYMINVALID
PUBLICUSER_WM_LOCKED_TABLESSYNONYMINVALID
PUBLICUSER_WM_VERSIONED_TABLESSYNONYMINVALID
PUBLICWM_COMPRESS_BATCH_SIZESSYNONYMINVALID
8.监视用户和事务(死锁等)
以下的脚本在死锁发生的时候发送一个警告e-mail:
###################################################################
##deadlock_alert.sh##
###################################################################
#!/bin/ksh
EDITOR=vi;exportEDITOR
ORACLE_SID=PPRD10;exportORACLE_SID
ORACLE_BASE=/data/app/oracle;exportORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0;exportORACLE_HOME
LD_LIBRARY_PATH=$ORACLE_HOME/lib;exportLD_LIBRARY_PATH
TNS_ADMIN=/var/opt/oracle;exportTNS_ADMIN
NLS_LANG=american;exportNLS_LANG
NLS_DATE_FORMAT='MonDDYYYYHH24:MI:SS';exportNLS_DATE_FORMAT
ORATAB=/var/opt/oracle/oratab;exportORATAB
PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/sbin:/usr/openwin/bin:/opt/bin:.;exportPATH
DBALIST="tianlesoftware@vip.qq.com,tianlesoftware@hotmail.com";exportDBALIST
sqlplus-s'/assysdba'<
setFeedoff
setheadingoff
spooldeadlock.alert
SELECTSID,DECODE(BLOCK,'NO','YES')BLOCKER,
DECODE(REQUEST,'YES')WAITER
FROMV/$LOCK
WHEREREQUEST>0ORBLOCK>0
ORDERBYblockDESC;
spooloff
exit
EOF
if[`catdeadlock.alert|wc-l`-gt0]
then
mailx-s"DEADLOCKALERTforPPRD10"$DBALIST<deadlock.alert
fi
四.结论
0,20,407-17**1-5/dba/scripts/ckinstance.sh>/dev/null2>&1
0,407-17**1-5/dba/scripts/cklsnr.sh>/dev/null2>&1
0,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,407-17**1-5/dba/scripts/deadlock_alert.sh>/dev/null2>&1
通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。