监控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 通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|