標籤:oracle zabbix
一、背景
接到任務,要求對所有資料庫的所有資料表空間進行監控,願意是遇到資料表空間不足導致業務資料庫的不可用,我們知道通過Zabbix監控Oracle的外掛程式有一些,比如Orabbix或者Pyora,前者通過Java進行資料擷取,所以必須要安裝Java,我之前的文章有講解安裝過程,後者雖說是用Python指令碼進行監控,但是我們的帳號密碼都暴露在指令碼中,導致安全性下降,所以我們這裡通過指令碼來進行實現。
利用Zabbix監控Oracle資料表空間利用率,但是這個Oracle庫的資料表空間有很多個,而且不同的伺服器的資料表空間各不相同,我怕累死,就想辦法利用Discovery做一個自動探索,實現自動大量新增同類item的需求。
二、監控機制
Oracle資料表空間使用率即時監控,當資料表空間使用率達到95%時觸發警示機制。Oracle資料表空間分為系統預設資料表空間和使用者建立的資料表空間,而資料表空間又有自動擴充和非自動擴充兩種類型,使用者(DBA)在建立資料表空間時可以根據應用需求指定是否開啟資料表空間自動擴充。那麼在這裡我們需要分析一個監控策略,就是當Zabbix監控到某個資料表空間使用率達到95%,那麼就讓觸發器觸發警告(Warning)資訊,並發送郵件給DBA或管理者。當檢測到資料表空間沒有開啟自動擴充時,則觸發Information資訊。
Oracle資料表空間是否開啟自動擴充以及最大能擴充到多少在最初應該規劃好的,有時在建立資料表空間時指定初始容量和最大能擴充的容量一致的話,那麼就會讓這個資料表空間立即擁有最大能擴充的容量,而不是隨著資料表空間的消耗而慢慢增加。所以即使我們檢測到該資料表空間開啟了自動擴充功能,實際上也不會繼續擴充了。當然在大多數業務情境下一般是不建議開啟資料表空間自動擴充功能的,除非你的業務是非關鍵的。回到監控這裡,當我們同時收到這兩個警示資訊時,那麼就要及時處理Oracle資料表空間使用率大於95%的問題了。
三、Oracle用戶端配置
1、建立指令碼check_tablespace.sh
Oracle資料表空間的資訊需要SQL語句查詢得到,因此,我們首先建立一個擷取資料表空間資訊的原始指令碼/home/oracle/check_tablespace.sh,這個指令碼由oracle使用者去執行,指令碼內容如下:
#!/bin/bash# tablespace usagep checksource ~/.bash_profilefunction check {sqlplus -S "/ as sysdba" << EOFset linesize 200set pagesize 200spool /tmp/ora_tablespace.txtselect a.tablespace_name, total, free,(total-free) as usage from (select tablespace_name, sum(bytes)/1024/1024 as total from dba_data_files group by tablespace_name) a, (select tablespace_name, sum(bytes)/1024/1024 as free from dba_free_space group by tablespace_name) bwhere a.tablespace_name = b.tablespace_name;spool offset linesize 100set pagesize 100spool /tmp/ora_autex.txtselect tablespace_name,autoextensible from dba_data_files;spool offquitEOF};check &>/dev/null
執行這個指令碼,並產生兩個儲存有oracle資料表空間名稱資訊的檔案:/tmp/ora_tablespace.txt和/tmp/ora_autex.txt。
650) this.width=650;" title="QQ20171020101930.jpg" alt="04ceff54abd583da2d4985751afbdbf6.jpg" src="https://s1.51cto.com/oss/201710/20/04ceff54abd583da2d4985751afbdbf6.jpg" />
我們需要把指令碼放到oracle使用者的crontab計劃任務表中,讓指令碼在後台每15分鐘執行一次,一定要保證計劃任務能正常按計劃執行,否則這可能會被監控欺騙(監控端擷取到的資料一直保持不變)。
[[email protected] ~]$ crontab -l*/15 * * * * /home/oracle/check_tablespace.sh
2、建立指令碼discovery_oracle_tablespace.sh
通過指令碼取得資料表空間的名字,並轉換成json格式的(因為zabbix的自動探索功能擷取的資料類型是JSON格式的)。
下面編寫一個zabbix自動探索oracle資料表空間的指令碼,我這裡的指令碼路徑是/usr/local/zabbix/scripts/discovery_oracle_tablespace.sh。
#!/bin/bash#zabbix discovery oracle tablespacetable_spaces=(`cat /tmp/ora_tablespace.txt | sed -e "1,3d" -e "/^$/d" -e "/selected/d" | awk ‘{print $1}‘`)length=${#table_spaces[@]} printf "{\n"printf ‘\t‘"\"data\":["for ((i=0;i<$length;i++))do printf "\n\t\t{" printf "\"{#TABLESPACE_NAME}\":\"${table_spaces[$i]}\"}" if [ $i -lt $[$length-1] ];then printf "," fidone printf "\n\t]\n"printf "}\n"
3、建立監控項目檢測指令碼tablespace_check.sh
用於zabbix擷取oracle資料表空間使用率、剩餘量和檢查是否開啟自動擴充。指令碼為/usr/local/zabbix/scripts/tablespace_check.sh,指令碼內容如下:
#!/bin/bash# oracle tablespace checkCEHCK_TYPE=$1TABLESPACE_NAME=$2 function usagepre { grep "\b$TABLESPACE_NAME\b" /tmp/ora_tablespace.txt | awk ‘{printf "%.f\n",($2-$3)/$2*100}‘} function available { grep "\b$TABLESPACE_NAME\b" /tmp/ora_tablespace.txt | awk ‘{printf $3*1024*1024}‘} function check { if grep "\b$TABLESPACE_NAME\b" /tmp/ora_autex.txt | awk ‘{print $2}‘ | uniq | grep "YES" &>/dev/null;then echo 1 else echo 0 fi} case $CEHCK_TYPE in pre) usagepre ;; fre) available ;; check) check ;; *) echo -e "Usage: $0 [pre|fre|check] [TABLESPACE_NAME]"esac
給建立的指令碼添加執行許可權。
cd /usr/local/zabbix/scriptschmod +x tablespace_check.sh chmod +x discovery_oracle_tablespace.sh
檢查指令碼的輸入情況是否正常,如:
[[email protected] ~]# /usr/local/zabbix/scripts/tablespace_check.sh pre SYSTEM100[[email protected] ~]# /usr/local/zabbix/scripts/tablespace_check.sh fre SYSTEM 25559040[[email protected] ~]# /usr/local/zabbix/scripts/tablespace_check.sh check SYSTEM 1
4、為Zabbix增加監控Key
在Zabbix用戶端設定檔/etc/zabbix/zabbix_agentd.conf增加如下參數:
Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf
建立檔案/etc/zabbix/zabbix_agentd.conf.d/oracle_tablespace.conf,內容如下:
UserParameter=discovery.oracle.tablespace,/usr/local/zabbix/scripts/discovery_oracle_tablespace.shUserParameter=tablespace.check[*],/usr/local/zabbix/scripts/tablespace_check.sh $1 $2
重新啟動Zabbix用戶端服務。
service zabbix_agentd restart
5、在Zabbix服務端測試監控Key
測試結果如下,一切正常。
[[email protected] bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[pre,SYSTEM]100[[email protected] bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[fre,SYSTEM]25559040[[email protected] bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[check,SYSTEM]1
四、Zabbix服務端配置
1、建立模板,並添加自動探索規則
650) this.width=650;" title="QQ20171020111815.jpg" src="https://s4.51cto.com/oss/201710/20/6c0ce1348ef371d6d6b32f24a6ec1d5f.jpg" alt="6c0ce1348ef371d6d6b32f24a6ec1d5f.jpg" />
Name:Oracle tablespace discoverType:Zabbix agentKey:discovery.oracle.tablespace
2、建立Item prototypes
這裡主要添加的三個item就是我們擷取到的三個指標,我這裡只示範使用率的配置,大家可以通過附件下載我的模板,直接匯入即可。
650) this.width=650;" src="https://s5.51cto.com/oss/201710/20/ef16b91540c0a80300b5ee6688bdd77c.jpg" title="QQ20171020112243.jpg" alt="ef16b91540c0a80300b5ee6688bdd77c.jpg" />
使用率:
650) this.width=650;" src="https://s2.51cto.com/oss/201710/20/b9a3a825d0be269b8c9d78d27e7a64ef.jpg" title="QQ20171020112259.jpg" alt="b9a3a825d0be269b8c9d78d27e7a64ef.jpg" />
Name:Oracle tablespace:{#TABLESPACE_NAME} 使用率Type:Zabbix agentKey:tablespace.check[pre,{#TABLESPACE_NAME}]
3、建立Trigger prototypes
同樣,這裡有兩個觸發器,我這裡只示範當資料表空間使用率超過95%警示的資訊配置。
650) this.width=650;" src="https://s5.51cto.com/oss/201710/20/93b180ee137f23572bdd4f4339d8b551.jpg" title="QQ20171020112757.jpg" alt="93b180ee137f23572bdd4f4339d8b551.jpg" />
650) this.width=650;" src="https://s5.51cto.com/oss/201710/20/e5ce7de6a7de7e3e0f61fe8b5c93f23e.jpg" style="float:none;" title="QQ20171020112810.jpg" alt="e5ce7de6a7de7e3e0f61fe8b5c93f23e.jpg" />
4、建立Graph prototypes
650) this.width=650;" src="https://s4.51cto.com/oss/201710/20/bac73d007e053165c5ac2b05680a8e71.jpg" title="QQ20171020114447.jpg" alt="bac73d007e053165c5ac2b05680a8e71.jpg" />
五、結果驗證
等待一段時間的發現之後,我們可以看到主機發現了相關的監控項,並可以執行警示資訊。
650) this.width=650;" src="https://s4.51cto.com/oss/201710/20/92eadd9765374005847aaa48d8e5063b.jpg" title="QQ20171020113350.jpg" alt="92eadd9765374005847aaa48d8e5063b.jpg" />
USERS資料表空間的表徵圖情況:
650) this.width=650;" src="https://s2.51cto.com/oss/201710/20/a5d0363dbed8f9e80994f36c8eed20b3.jpg" title="QQ20171020114558.jpg" alt="a5d0363dbed8f9e80994f36c8eed20b3.jpg" />
注意:以上的監控時間間隔和警示層級大家可以根據自己的實際情況設定,我這裡只是進行示範配置而已。
650) this.width=650;" src="https://s4.51cto.com/oss/201710/20/b3132173a157fda0f134948b2508af29.jpg" title="qrcode_for_gh_891f5ff6ec4e_258.jpg" alt="b3132173a157fda0f134948b2508af29.jpg" />
本文出自 “營運點滴記錄” 部落格,請務必保留此出處http://wzlinux.blog.51cto.com/8021085/1974523
Zabbix 3.2.6 通過Discovery批量監控Oracle資料表空間