|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!媒介
这篇文章先容了DBA天天在监控Oracle数据库方面的职责,报告了怎样经由过程shell剧本来完成这些反复的监控事情。本文起首回忆了一些DBA经常使用的Unix下令,和注释了怎样经由过程UnixCron来准时实行DBA剧本。同时文章还先容了8个主要的剧本来监控Oracle数据库:
反省实例的可用性
反省监听器的可用性
反省alert日记文件中的毛病信息
在寄存log文件的中央满之前清空旧的log文件
剖析table和index以取得更好的功能
反省表空间的利用情形
找出有效的工具
监控用户和事件
DBA必要的Unix基础常识
基础的UNIX下令
以下是一些经常使用的Unix下令:
ps--显现历程
grep--搜刮文件中的某种文本形式
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
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文件中包括有六个字段:
分钟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.运转。
监控数据库的经常使用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文件中列出的一切数据库,而且找出该数据库的形态(启动仍是封闭)
###################################################################
##ckinstance.ksh#####################################################################
ORATAB=/var/opt/oracle/oratab
echo"`date`"
echo"OracleDatabase(s)Status`hostname`:
"
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
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"Listenermylsnron`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
反省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
以下的剧本起首挪用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%容量的时分清空旧的回档文件:
$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
剖析表和索引(以失掉更好的功能)
以下我将展现假如传送参数到一个剧本中:
####################################################################
##analyze_table.sh##
####################################################################
#!/bin/ksh
#inputparameter:1:password#2:SID
if(($#<1))thenecho"Pleaseenteroracleuserpasswordasthefirstparameter!"exit0
fi
if(($#<2))thenecho"Pleaseenterinstancenameasthesecondparameter!"exit0
fi
要传进参数以实行该剧本,输出:
$analyze_table.shmanageroradb1
剧本的第一局部发生了一个analyze.sql文件,内里包括了剖析表用的语句。剧本的第二局部剖析全体的表:
#####################################################################
##analyze_table.sh##
#####################################################################
sqlplus-s<oracle/$1@$2
setheadingoff
setfeedoff
setpagesize200
setlinesize100
spoolanalyze_table.sql
selectANALYZETABLE||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=INVALIDORDERBYOWNER,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
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
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
经由过程以上的剧本,可年夜年夜加重你的事情。你可使用这些是来做更主要的事情,比方功能调剂。
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们! |
|