久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

監控Oracle數據庫的常用shell腳本怎么寫

141次閱讀
沒有評論

共計 10132 個字符,預計需要花費 26 分鐘才能閱讀完成。

本篇文章給大家分享的是有關監控 Oracle 數據庫的常用 shell 腳本怎么寫,丸趣 TV 小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著丸趣 TV 小編一起來看看吧。

丸趣 TV 小編下面介紹了 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` :/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*
以下是實例可用性的報表:
$ 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.err|wc -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

分析表和索引(以得到更好的性能)
以下我將展示如果傳送參數到一個腳本中:

##############################################
## analyze_table.sh ##
###############################################
#!/bin/ksh
# input parameter: 1: password # 2: SID
if (($# 1)) then echo Please enter oracle user password as the first parameter ! exit 0
fi
if (($# 2)) then echo Please enter instance name as the second parameter! exit 0
fi

要傳入參數以執行該腳本,輸入:
$ analyze_table.sh manager oradb1
腳本的第一部分產生了一個 analyze.sql 文件,里面包含了分析表用的語句。腳本的第二部分分析全部的表:

################################################
## analyze_table.sh ##
###############################################
sqlplus -s oracle/$1@$2
set heading off
set feed off
set pagesize 200
set linesize 100
spool analyze_table.sql
select ANALYZE TABLE || owner || . || segment_name ||
ESTIMATE STATISTICS SAMPLE 10 PERCENT;
from dba_segments
where segment_type = TABLE
and owner not in (SYS , SYSTEM
spool off
exit
!
sqlplus -s oracle/$1@$2
@./analyze_table.sql
exit
!
以下是 analyze.sql 的一個例子:

$ cat analyze.sql
ANALYZE TABLE HIRWIN.JANUSAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE HIRWIN.JANUSER_PROFILE ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE APPSSYS.HIST_SYSTEM_ACTIVITY ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE HTOMEH.QUEST_IM_VERSION ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE JSTENZEL.HIST_SYS_ACT_0615 ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE JSTENZEL.HISTORY_SYSTEM_0614 ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE JSTENZEL.CALC_SUMMARY3 ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE IMON.QUEST_IM_LOCK_TREE ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE APPSSYS.HIST_USAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;
ANALYZE TABLE PATROL.P$LOCKCONFLICTTX ESTIMATE STATISTICS SAMPLE 10 PERCENT;

檢查表空間的使用
以下的腳本檢測表空間的使用。如果表空間只剩下 10%,它將會發送一個警告 email。

####################################################
## ck_tbsp.sh ##
####################################################
#!/bin/ksh
sqlplus -s oracle/$1@$2
set feed off
set linesize 100
set pagesize 200
spool tablespace.alert
SELECT F.TABLESPACE_NAME,
TO_CHAR ((T.TOTAL_SPACE – F.FREE_SPACE), 999,999 ) USED (MB) ,
TO_CHAR (F.FREE_SPACE, 999,999) FREE (MB) ,
TO_CHAR (T.TOTAL_SPACE, 999,999) TOTAL (MB) ,
TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)), 999 )|| % PER_FREE
FROM (
SELECT TABLESPACE_NAME,
ROUND (SUM (BLOCKS*(SELECT VALUE/1024
FROM V/$PARAMETER
WHERE NAME = db_block_size )/1024)
) FREE_SPACE
FROM DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME
) F,
(
SELECT TABLESPACE_NAME,
ROUND (SUM (BYTES/1048576)) TOTAL_SPACE
FROM DBA_DATA_FILES
GROUP BY TABLESPACE_NAME
) T
WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME
AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100))
spool off
exit
!
if [`cat tablespace.alert|wc -l` -gt 0]
then
cat tablespace.alert -l tablespace.alert tablespace.tmp
mailx -s TABLESPACE ALERT for ${2} $DBALIST tablespace.tmp
fi

警告 email 輸出的例子如下:

TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE
——————- ——— ———– ——————- ——————
SYSTEM 2,047 203 2,250 9 %
STBS01 302 25 327 8 %
STBS02 241 11 252 4 %
STBS03 233 19 252 8 %

查找出無效的數據庫對象
以下查找出無效的數據庫對象:

###################################### ## invalid_object_alert.sh ## ###################################### #!/bin/ksh . /etc/oracle.profile
sqlplus -s oracle/$1@$2
set feed off
set heading off column object_name format a30
spool invalid_object.alert
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE STATUS = INVALID ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;
spool off
exit ! if [`cat invalid_object.alert|wc -l` -gt 0] then
mailx -s INVALID OBJECTS for ${2} $DBALIST invalid_object.alert
fi$ cat invalid_object.alert
OWNER OBJECT_NAME OBJECT_TYPE STATUS
———————————————————————-
HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID
HTOMEH X_$KCBFWAIT VIEW INVALID
IMON IW_MON PACKAGE INVALID
IMON IW_MON PACKAGE BODY INVALID
IMON IW_ARCHIVED_LOG VIEW INVALID
IMON IW_FILESTAT VIEW INVALID
IMON IW_SQL_FULL_TEXT VIEW INVALID
IMON IW_SYSTEM_EVENT1 VIEW INVALID
IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY CHECK_TABLESPACE_USAGE PROCEDURE INVALID
PATROL P$AUTO_EXTEND_TBSP VIEW INVALID
SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID
SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID
SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID
SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID
SYS HS_CLASS_CAPS VIEW INVALID SYS HS_CLASS_DD VIEW INVALID

監視用戶和事務(死鎖等)
以下的腳本在死鎖發生的時候發送一個警告 e -mail:

#######################################
## deadlock_alert.sh ##
##########################################
#!/bin/ksh
.. /etc/oracle.profile
sqlplus -s oracle/$1@$2
set feed off
set heading off
spool deadlock.alert
SELECT SID, DECODE(BLOCK, 0, NO , YES) BLOCKER,
DECODE(REQUEST, 0, NO , YES) WAITER
FROM V$LOCK
WHERE REQUEST 0 OR BLOCK 0
ORDER BY block DESC;
spool off
exit
!
if [`cat deadlock.alert|wc -l` -gt 0]
then
mailx -s DEADLOCK ALERT for ${2} $DBALIST deadlock.alert
fi
結論

0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh /dev/null 2 1
0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh /dev/null 2 1
0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh /dev/null 2 1
30 * * * 0-6 /dba/scripts/clean_arch.sh /dev/null 2 1
* 5 * * 1,3 /dba/scripts/analyze_table.sh /dev/null 2 1
* 5 * * 0-6 /dba/scripts/ck_tbsp.sh /dev/null 2 1
* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh /dev/null 2 1
0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh /dev/null 2 1
通過以上的腳本,可大大減輕你的工作。你可以使用這些是來做更重要的工作,例如性能調整。

以上就是監控 Oracle 數據庫的常用 shell 腳本怎么寫,丸趣 TV 小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注丸趣 TV 行業資訊頻道。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-18發表,共計10132字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 县级市| 留坝县| 秭归县| 荆门市| 临清市| 丰都县| 隆安县| 休宁县| 当涂县| 云龙县| 远安县| 嵩明县| 宁陕县| 阳东县| 抚宁县| 仙游县| 万荣县| 京山县| 孝昌县| 保亭| 井陉县| 博野县| 谷城县| 革吉县| 浮山县| 石家庄市| 开化县| 苗栗县| 怀来县| 景谷| 长白| 大城县| 丰县| 阳泉市| 且末县| 黄陵县| 上蔡县| 阿合奇县| 名山县| 洪泽县| 桃园县|