本文介紹了8個常用的監控資料shell指令碼。首先回顧了一些DBA常用的Unix命令,以及解釋了如何通過Unix Cron來定時執行DBA指令碼。網上也有好多類似的文章,但基本上都不能正常運行,花點時間重新整理了下,以後就能直接使用了。
一.同時文章還介紹了8個重要的指令碼來監控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 -ef| grep smon
oracle 22086 1 0 02:32:24 ? 0:04 ora_smon_PPRD10
oracle 5215 28972 0 08:10:19 pts/4 0:00 grep smon
2. 顯示伺服器上的可用監聽器:
$ ps -ef grep listener grep -v grep
(grep命令應該加上-i參數,即grep -i listener,該參數的作用是忽略大小寫,因為有些時候listener是大寫的,這時就會看不到結果)
$ ps -ef|grep -i listener
oracle 9655 1 0 Mar 12 ? 0:01 /data/app/oracle/9.2.0/bin/tnslsnr LISTENER -inherit
oracle 22610 1 0 02:45:02 ? 0:02 /data/app/oracle/10.2.0/bin/tnslsnr LISTENER -inherit
oracle 5268 28972 0 08:13:02 pts/4 0:00 grep -i listener
3. 查看Oracle存檔目錄的檔案系統使用方式
$ df -k | grep /data
/dev/md/dsk/d50 104977675 88610542 15317357 86% /data
4. 統計alter.log檔案中的行數:
$ cat alert_PPRD10.log | wc -l
13124
$ more alert_PPRD10.log | wc -l
13124
5. 列出alert.log檔案中的全部Oracle錯誤資訊:
$ grep ORA-* alert.log
ORA-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []
ORA-00600: internal error code, arguments: [1881], [25860496], [25857716], []
6. CRONTAB基本
一個crontab檔案中包含有六個欄位:
分鐘 0-59
小時 0-23
月中的第幾天 1-31
月份 1 - 12
星期幾 0 - 6, with 0 = Sunday
7. 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的環境變數。
1. 檢查Oracle執行個體的可用性
oratab檔案中列出了伺服器上的所有資料庫
$ cat /var/opt/oracle/oratab
#
# This file is used by ORACLE utilities. It is created by root.sh
# and updated by the Database Configuration Assistant when creating
# a database.
# A colon, ':', is used as the field terminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME:<N|Y>:
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third filed indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
#
# *:/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 "Oracle Database(s) Status `hostname` :\n"
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
以下是執行個體可用性的報表:
$ sh ckinstance.ksh
Wed May 13 12:51:20 PDT 2009
Oracle Database(s) Status gambels :
Oracle Instance - PPRD: Up
Oracle Instance - PPRD10: Up
2. 檢查Oracle監聽器的可用性
以下有一個類似的指令碼檢查Oracle監聽器。假如監聽器停了,該指令碼將會重新啟動監聽器:
#####################################################################
## cklsnr.sh ##
#####################################################################
#!/bin/ksh
TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN
ORACLE_SID= PPRD10; export ORACLE_SID
ORAENV_ASK=NO; export ORAENV_ASK
PATH=$PATH:/bin:/usr/local/bin; export PATH
. oraenv
DBALIST="www.bkjia.com,www.bkjia.net";export DBALIST
cd /var/opt/oracle
rm -f lsnr.exist
ps -ef | grep PPRD10 | grep -v grep > lsnr.exist
if [ -s lsnr.exist ]
then
echo
else
echo "Alert" | mailx -s "Listener 'PPRD10' on `hostname` is down" $DBALIST
lsnrctl start PPRD10
fi
3. 檢查Alert日誌(ORA-XXXXX)
####################################################################
## ckalertlog.sh ##
####################################################################
#!/bin/ksh
EDITOR=vi; export EDITOR
ORACLE_SID=PPRD10; export ORACLE_SID
ORACLE_BASE=/data/app/oracle; export ORACLE_BASE
ORACLE_HOME=$ORACLE_BASE/10.2.0; 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="www.bkjia.com,www.bkjia.net";export DBALIST
cd $ORACLE_BASE/admin/PPRD10/bdump
if [ -f alert_PPRD10.log ]
then
mv alert_PPRD10.log alert_work.log
touch alert_PPRD10.log
cat alert_work.log >> alert_PPRD10.hist
grep ORA- alert_work.log > alert.err
fi
if [ `cat alert.err | wc -l` -gt 0 ]
then
mailx -s " PPRD10 ORACLE ALERT ERRORS" $DBALIST < alert.err
fi
rm -f alert.err
rm -f alert_work.log