讓我們一起學(xué)做業(yè)余DBA!
2024-07-21 02:35:40
供稿:網(wǎng)友
前言
這篇文章介紹了DBA天天在監(jiān)控Oracle數(shù)據(jù)庫方面的職責(zé),講述了如何通過shell腳本來完成這些重復(fù)的監(jiān)控工作。本文首先回顧了一些DBA常用的Unix命令,以及解釋了如何通過Unix Cron來定時(shí)執(zhí)行DBA腳本。 同時(shí)文章還介紹了8個(gè)重要的腳本來監(jiān)控Oracle數(shù)據(jù)庫:
檢查實(shí)例的可用性
檢查監(jiān)聽器的可用性
檢查alert日志文件中的錯(cuò)誤信息
在存放log文件的地方滿以前清空舊的log文件
分析table和index以獲得更好的性能
檢查表空間的使用情況
找出無效的對(duì)象
監(jiān)控用戶和事務(wù)
DBA需要的Unix基本知識(shí)
基本的UNIX命令
以下是一些常用的Unix命令:
ps--顯示進(jìn)程
grep--搜索文件中的某種文本模式
mailx--讀取或者發(fā)送mail
cat--連接文件或者顯示它們
cut--選擇顯示的列
awk--模式匹配語言
df--顯示剩余的磁盤空間
以下是DBA如何使用這些命令的一些例子:
顯示服務(wù)器上的可用實(shí)例:
$ 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、
顯示服務(wù)器上的可用監(jiān)聽器:
$ ps -ef grep listener grep -v grep
(譯者注:grep命令應(yīng)該加上-i參數(shù),即grep -i listener,該參數(shù)的作用是忽略大小寫,因?yàn)橛行r(shí)候listener是大寫的,這時(shí)就會(huì)看不到結(jié)果)
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存檔目錄的文件系統(tǒng)使用情況
$ df -k grep oraarch
/dev/vx/dsk/PRoddg/oraarch 71123968 4754872 65850768 7% /u09/oraarch
統(tǒng)計(jì)alter.log文件中的行數(shù):
$ cat alert.log wc -l
2984
列出alert.log文件中的全部Oracle錯(cuò)誤信息:
$ grep ORA- alert.log
ORA-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []
ORA-00600: internal error code, arguments: [1881], [25860496], [25857716], []
CRONTAB基本
一個(gè)crontab文件中包含有六個(gè)字段:
分鐘 0-59
小時(shí) 0-23
月中的第幾天 1-31
月份 1 - 12
星期幾 0 - 6, with 0 = Sunday
Unix命令或者Shell腳本
要編輯一個(gè)crontab文件,輸入:
Crontab -e
要查看一個(gè)crontab文件,輸入:
Crontab -l
0 4 * * 5 /dba/admin/analyze_table.ksh
30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null 2>&1
在上面的例子中,第一行顯示了一個(gè)分析表的腳本在每個(gè)星期5的4:00am運(yùn)行。
第二行顯示了一個(gè)執(zhí)行熱備份的腳本在每個(gè)周三和周六的3:00a.m.運(yùn)行。
監(jiān)控?cái)?shù)據(jù)庫的常用Shell腳本
以下提供的8個(gè)shell腳本覆蓋了DBA每日監(jiān)控工作的90%,你可能還需要修改UNIX的環(huán)境變量。
檢查Oracle實(shí)例的可用性
oratab文件中列出了服務(wù)器上的所有數(shù)據(jù)庫
$ 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文件中列出的所有數(shù)據(jù)庫,并且找出該數(shù)據(jù)庫的狀態(tài)(啟動(dòng)還是關(guān)閉)
###################################################################
## 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
使用以下的命令來確認(rèn)該腳本是可以執(zhí)行的:
$ chmod 744 ckinstance.ksh
$ ls -l ckinstance.ksh
-rwxr--r-- 1 oracle dba 657 Mar 5 22:59 ckinstance.ksh*
以下是實(shí)例可用性的報(bào)表:
$ 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監(jiān)聽器的可用性
以下有一個(gè)類似的腳本檢查Oracle監(jiān)聽器。假如監(jiān)聽器停了,該腳本將會(huì)重新啟動(dòng)監(jiān)聽器:
#######################################################################
## 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)
每個(gè)腳本所使用的一些環(huán)境變量可以放到一個(gè)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
以下的腳本首先調(diào)用oracle.profile來設(shè)置全部的環(huán)境變量。
假如發(fā)現(xiàn)任何的Oracle錯(cuò)誤,該腳本還會(huì)給DBA發(fā)送一個(gè)警告的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
清除舊的歸檔文件
以下的腳本將會(huì)在log文件達(dá)到90%容量的時(shí)候清空舊的歸檔文件:
$ df -k grep arch
Filesystem kbytes used avail capacity Mounted on
/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive<