当前页面位置: » 丰搜网 » 文档中心 » 详细内容
监控oracle数据库的常用shell脚本
前言
这篇文章介绍了dba每天在监控oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些dba常用的unix命令,以及解释了如何通过unix cron来定时执行dba脚本。同时文章还介绍了8个重要的脚本来监控oracle数据库:
检查实例的可用性
检查监听器的可用性
检查alert日志文件中的错误信息
在存放log文件的地方满以前清空旧的log文件
分析table和index以获得更好的性能
检查表空间的使用情况
找出无效的对象
监控用户和事务
dba需要的unix基本知识
基本的unix命令
以下是一些常用的unix命令:
ps--显示进程 grep--搜索文件中的某种文本模式 mailx--读取或者发送mail cat--连接文件或者显示它们 cut--选择显示的列 awk--模式匹配语言 df--显示剩余的磁盘空间
以下是dba如何使用这些命令的一些例子:
显示服务器上的可用实例:
$ ps -ef grep smon
oracle 21832 1 0 feb 24 ? 19:05 ora_smon_oradb1
oracle 898 1 0 feb 15 ? 0:00 ora_smon_oradb2
dliu 25199 19038 0 10:48:57 pts/6 0:00 grep smon
oracle 27798 1 0 05:43:54 ? 0:00 ora_smon_oradb3
oracle 28781 1 0 mar 03 ? 0:01 ora_smon_oradb4、 |
显示服务器上的可用监听器:
$ ps -ef grep listener grep -v grep
(译者注:grep命令应该加上-i参数,即grep -i listener,
该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)
oracle 23879 1 0 feb 24 ? 33:36 /8.1.7/bin/tnslsnr listener_db1 -inherit
oracle 27939 1 0 05:44:02 ? 0:00 /8.1.7/bin/tnslsnr listener_db2 -inherit
oracle 23536 1 0 feb 12 ? 4:19 /8.1.7/bin/tnslsnr listener_db3 -inherit
oracle 28891 1 0 mar 03 ? 0:01 /8.1.7/bin/tnslsnr listener_db4 -inherit |
查看oracle存档目录的文件系统使用情况
$ df -k grep oraarch
/dev/vx/dsk/proddg/oraarch 71123968 4754872 65850768 7% /u09/oraarch |
统计alter.log文件中的行数:
$ cat alert.log wc -l
2984
|
列出alert.log文件中的全部oracle错误信息:
$ grep ora- alert.log
ora-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []
ora-00600: internal error code, arguments: [1881], [25860496], [25857716], [] |
crontab基本
一个crontab文件中包含有六个字段:
分钟 0-59
小时 0-23
月中的第几天 1-31
月份 1 - 12
星期几 0 - 6, with 0 = sunday
unix命令或者shell脚本
要编辑一个crontab文件,输入:crontab -e
要查看一个crontab文件,输入:
crontab -l
0 4 * * 5 /dba/admin/analyze_table.ksh
30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null 2>&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 oracle database(s) status `hostname` :
db=`egrep -i :y:n $oratab cut -d: -f1 grep -v # grep -v *`
pslist=`ps -ef grep pmon`
for i in $db ; do
echo $pslist grep ora_pmon_$i > /dev/null 2>$1
if (( $? )); then
echo oracle instance - $i: down
else
echo oracle instance - $i: up
fi
done
|
使用以下的命令来确认该脚本是可以执行的:
$ chmod 744 ckinstance.ksh
$ ls -l ckinstance.ksh
-rwxr--r-- 1 oracle dba 657 mar 5 22:59 ckinstance.ksh* |
以下是实例可用性的报表:
$ ckinstance.ksh
mon mar 4 10:44:12 pst 2002
oracle database(s) status for dbhost server:
oracle instance - oradb1: up
oracle instance - oradb2: up
oracle instance - oradb3: down
oracle instance - oradb4: up |
检查oracle监听器的可用性
以下有一个类似的脚本检查oracle监听器。如果监听器停了,该脚本将会重新启动监听器:
#######################################################################
## cklsnr.sh ##
#######################################################################
#!/bin/ksh
dbalist=primary.dba@company.com,another.dba@company.com;export dbalist
cd /var/opt/oracle
rm -f lsnr.exist
ps -ef grep mylsnr grep -v grep > lsnr.exist
if [ -s lsnr.exist ]
then
echo
else
echo alert mailx -s listener ‘mylsnr‘ on `hostname` is down $dbalist
tns_admin=/var/opt/oracle; export tns_admin
oracle_sid=db1; 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日志(ora-xxxxx)
每个脚本所使用的一些环境变量可以放到一个profile中:
#######################################################################
## oracle.profile ##
#######################################################################
editor=vi;export editor oracle_base=/u01/app/oracle; export
oracle_base oracle_home=$oracle_base/product/8.1.7; 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 hh24: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=primary.dba@company.com,another.dba@company.com;export
dbalist |
以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的oracle错误,该脚本还会给dba发送一个警告的email。
####################################################################
## ckalertlog.sh ##
####################################################################
#!/bin/ksh
.. /etc/oracle.profile
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_work.log
touch alert_${sid}.log
cat alert_work.log >> alert_${sid}.hist
grep ora- alert_work.log > alert.err
fi
if [ `cat alert.errwc -l` -gt 0 ]
then
mailx -s ${sid} oracle alert errors $dbalist < alert.err
fi
rm -f alert.err
rm -f alert_work.log
done
|
清除旧的归档文件
以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:
$ df -k grep arch
filesystem kbytes used avail capacity mounted on
/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive
#######################################################################
## clean_arch.ksh ##
#######################################################################
#!/bin/ksh
df -k grep arch > 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
# try one of the following option depend on your need
find $archive_filesystem -type f -mtime +2 -exec rm -r {} ;
tar
rman
fi
|
关键字 本文所属关键字
相关 与本文相关文章
分类 所有文章关键字导航
标准 网站致力的规范