在非工作时间(如:凌晨时分),有时数据库会遇到一些夯死状态,造成新的session无法登陆到数据库,如果手头没有任何监控工具,那么可以通过简单的shell脚本来实现监控,其原理是通过登录数据库服务器来执行简单的查询语句,如此时session无法登陆,就无法得到查询结果,即可判断此时数据库可能已夯死。
以下为脚本完整内容:
#!/bin/sh
# version 1.0 created by aaron8219
# set the environment
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_HOME
PATH=$ORACLE_HOME/bin:$PATH
export PATH
. /home/oracle/.bash_profile
cd /home/oracle/scripts
# delete logfile
rm -f dbcheck.txt
# display message
echo '#############################################################'>dbcheck.txt
echo 'dbcheck on'>>dbcheck.txt
date>>dbcheck.txt
echo '#############################################################'>>dbcheck.txt
echo ' '>>dbcheck.txt
echo '#############################################################'>>dbcheck.txt
echo '###########ORA10G STATUS CHECK################################'>>dbcheck.txt
echo '#############################################################'>>dbcheck.txt
# check db status
sqlplus -S system/oracle@ora10g <<EOF
set echo off
set feedback off
spool dbcheck.txt append
alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
select sysdate from dual;
spool off
set echo on
set feedback on
exit
EOF
# send mail to mailbox
uuencode /home/oracle/scripts/dbcheck.txt dbcheck.txt | mailx -s 'db status check!!!' [email protected]
如果是unix系统,使用mailx,如果是linux系统,则使用mail语法基本一致
uuencode可将二进制文件转换为文本文件,转换后的文件可以通过纯文本e-mail进行传输,在接收方对该文件使用uudecode再将其转换为初始的二进制文件
在数据库正常情况下,运行后生成的txt日志文件会显示如下内容:
[root@ora10g oracle]# cat dbcheck.txt
#############################################################
dbcheck on
Fri Aug 21 16:16:40 CST 2015
#############################################################
#############################################################
###########ORA10G STATUS CHECK################################
#############################################################
SYSDATE
-------------------
2015-08-21:16:16:40
将以上shell脚本添加到root用户的crontab中,让其每隔一段时间(如:1小时)自动运行,然后通过发邮件到指定邮箱实现邮件监控
[root@ora10g oracle]# crontab -l
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
01 10 * * * su - oracle -c /u01/orabackup/scripts/backup_full.sh
20 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 * * * /home/oracle/scripts/dbcheck.sh >> /home/oracle/scripts/dbcheck.log &
由crontab执行后生成的文件dbcheck.log的内容会少一些,但这个log文件的内容会追加,不像txt文件每次都会删除,可以另外作为一个参考
[root@ora10g oracle]# cat dbcheck.log
SYSDATE
-------------------
2015-08-21:16:20:02
如果监听意外停止或未启动,那么运行脚本的时候屏幕会输出:
[root@ora10g oracle]# su - oracle
[oracle@ora10g ~]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 21-8月 -2015 16:28:11
Copyright (c) 1991, 2005, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora10g)(PORT=1521)))
The command completed successfully
[oracle@ora10g ~]$ exit
logout
[root@ora10g oracle]# ./dbcheck.sh
ERROR:
ORA-12541: TNS:no listener
SP2-0306: Invalid option.
Usage: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]
where <logon> ::= <username>[/<password>][@<connect_identifier>] | /
SP2-0306: Invalid option.
Usage: CONN[ECT] [logon] [AS {SYSDBA|SYSOPER}]
where <logon> ::= <username>[/<password>][@<connect_identifier>] | /
SP2-0157: unable to CONNECT to ORACLE after 3 attempts, exiting SQL*Plus
而此时去查看日志内容,是没有sysdate的值的:
[root@ora10g oracle]# cat dbcheck.txt
#############################################################
dbcheck on
Fri Aug 21 16:28:34 CST 2015
#############################################################
#############################################################
###########ORA10G STATUS CHECK################################
#############################################################
可以在脚本中添加对多套数据库的监控,通过NET SERVICE NAME连接到这些库,因此前提是这些库的监听和TNS
字符串都正常,因此这个脚本的局限性的。但即便只是发现监听未启动而不是数据库夯死,只要发现邮件中的查询没有值,就可以由当班监控值班人员(负责检查监控邮件的人)第一时间通知DBA,对及时发现数据库问题而言,还是有一定意义的。当然了,有条件的话,当然是使用一些专业的监控工具更靠谱了。