前言
这篇文章介绍了DBA每天在监控Oracle数据库方面的职责讲述了如何通过shell脚本来完成这些重复的监控工作本文首先回顾了一些DBA常用的Unix命令以及解释了如何通过Unix Cron来定时执行DBA脚本同时文章还介绍了个重要的脚本来监控Oracle数据库
检查实例的可用性
检查监听器的可用性
检查alert日志文件中的错误信息
在存放log文件的地方满以前清空旧的log文件
分析table和index以获得更好的性能
检查表空间的使用情况
找出无效的对象
监控用户和事务
DBA需要的Unix基本知识
基本的UNIX命令
以下是一些常用的Unix命令
ps显示进程
grep搜索文件中的某种文本模式
mailx读取或者发送mail
cat连接文件或者显示它们
cut选择显示的列
awk模式匹配语言
df显示剩余的磁盘空间
以下是DBA如何使用这些命令的一些例子
显示服务器上的可用实例
$ ps ef | grep smon
oracle Feb ? : ora_smon_oradb
oracle Feb ? : ora_smon_oradb
dliu :: pts/ : grep smon
oracle :: ? : ora_smon_oradb
oracle Mar ? : ora_smon_oradb
显示服务器上的可用监听器
$ ps ef | grep listener | grep v grep
(译者注grep命令应该加上i参数即grep i listener该参数的作用是忽略大小写因为有些时候listener是大写的这时就会看不到结果)
oracle Feb ? : //bin/tnslsnr listener_db inherit
oracle :: ? : //bin/tnslsnr listener_db inherit
oracle Feb ? : //bin/tnslsnr listener_db inherit
oracle Mar ? : //bin/tnslsnr listener_db inherit
查看Oracle存档目录的文件系统使用情况
$ df k | grep oraarch
/dev/vx/dsk/proddg/oraarch % /u/oraarch
统计alterlog文件中的行数
$ cat alertlog | wc l
列出alertlog文件中的全部Oracle错误信息
$ grep ORA alertlog
ORA: internal error code arguments: [kcrrrfswda] [] [] [] [] []
ORA: internal error code arguments: [] [] [] []
CRONTAB基本
一个crontab文件中包含有六个字段
分钟
小时
月中的第几天
月份
星期几 with = Sunday
Unix命令或者Shell脚本
要编辑一个crontab文件输入
Crontab e
要查看一个crontab文件输入
Crontab l
* * /dba/admin/analyze_tableksh
* * /dba/admin/hotbackupksh /dev/null >&
在上面的例子中第一行显示了一个分析表的脚本在每个星期的am运行第二行显示了一个执行热备份的脚本在每个周三和周六的am运行
监控数据库的常用Shell脚本
以下提供的个shell脚本覆盖了DBA每日监控工作的%你可能还需要修改UNIX的环境变量
检查Oracle实例的可用性
oratab文件中列出了服务器上的所有数据库
$ cat /var/opt/oracle/oratab
###################################################################
## /var/opt/oracle/oratab ##
###################################################################
oradb:/u/app/oracle/product/:Y
oradb:/u/app/oracle/product/:Y
oradb:/u/app/oracle/product/:N
oradb:/u/app/oracle/product/:Y
以下的脚本检查oratab文件中列出的所有数据库并且找出该数据库的状态(启动还是关闭)
###################################################################
## ckinstanceksh ## ###################################################################
ORATAB=/var/opt/oracle/oratab
echo `date`
echo Oracle Database(s) Status `hostname` :\n
db=`egrep i :Y|:N $ORATAB | cut d: f | grep v \# | grep v \*`
pslist=`ps ef | grep pmon`
for i in $db ; do
echo $pslist | grep ora_pmon_$i > /dev/null >$
if (( $? )); then
echo Oracle Instance $i: Down
else
echo Oracle Instance $i: Up
fi
done
使用以下的命令来确认该脚本是可以执行的
$ chmod ckinstanceksh
$ ls l ckinstanceksh
rwxrr oracle dba Mar : ckinstanceksh*
以下是实例可用性的报表
$ ckinstanceksh
Mon Mar :: PST
Oracle Database(s) Status for DBHOST server:
Oracle Instance oradb: Up
Oracle Instance oradb: Up
Oracle Instance oradb: Down
Oracle Instance oradb: Up
检查Oracle监听器的可用性
以下有一个类似的脚本检查Oracle监听器如果监听器停了该脚本将会重新启动监听器
#######################################################################
## cklsnrsh ##
#######################################################################
#!/bin/ksh
DBALIST=priano;export DBALIST
cd /var/opt/oracle
rm f lsnrexist
ps ef | grep mylsnr | grep v grep > lsnrexist
if [ s lsnrexist ]
then
echo
else
echo Alert | mailx s Listener mylsnr on `hostname` is down $DBALIST
TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN
ORACLE_SID=db; export ORACLE_SID
ORAENV_ASK=NO; export ORAENV_ASK
PATH=$PATH:/bin:/usr/local/bin; export PATH
oraenv
LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH
lsnrctl start mylsnr
fi
检查Alert日志(ORAXXXXX)
每个脚本所使用的一些环境变量可以放到一个profile中
#######################################################################
## oracleprofile ##
#######################################################################
EDITOR=vi;export EDITOR ORACLE_BASE=/u/app/oracle; export
ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/; export
ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export
LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export
TNS_ADMIN NLS_LANG=american; export
NLS_LANG NLS_DATE_FORMAT=Mon DD YYYY HH:MI:SS; export
NLS_DATE_FORMAT ORATAB=/var/opt/oracle/oratab;export
ORATAB PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/ccs/bin:/bin:/usr/bin:/usr/sbin:/
sbin:/usr/openwin/bin:/opt/bin:; export
PATH DBALIST=priano;export
DBALIST
以下的脚本首先调用oracleprofile来设置全部的环境变量如果发现任何的Oracle错误该脚本还会给DBA发送一个警告的email
####################################################################
## ckalertlogsh ##
####################################################################
#!/bin/ksh
/etc/oracleprofile
for SID in `cat $ORACLE_HOME/sidlist`
do
cd $ORACLE_BASE/admin/$SID/bdump
if [ f alert_${SID}log ]
then
mv alert_${SID}log alert_worklog
touch alert_${SID}log
cat alert_worklog >> alert_${SID}hist
grep ORA alert_worklog > alerterr
fi
if [ `cat alerterr|wc l` gt ]
then
mailx s ${SID} ORACLE ALERT ERRORS $DBALIST < alerterr
fi
rm f alerterr
rm f alert_worklog
done
清除旧的归档文件
以下的脚本将会在log文件达到%容量的时候清空旧的归档文件
$ df k | grep arch
Filesystem kbytes used avail capacity Mounted on
/dev/vx/dsk/proddg/archive % /u/archive<