1. 程式人生 > >Zabbix 3.2.6 通過Discovery批量監控Oracle表空間

Zabbix 3.2.6 通過Discovery批量監控Oracle表空間

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 check
source ~/.bash_profile
function check {
sqlplus -S "/ as sysdba" <<  EOF
set linesize 200
set pagesize 200
spool /tmp/ora_tablespace.txt
select 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) b
where a.tablespace_name = b.tablespace_name;
spool off
set linesize 100
set pagesize 100
spool /tmp/ora_autex.txt
select tablespace_name,autoextensible from dba_data_files;
spool off
quit
EOF
};check &>/dev/null

執行這個腳本,並生成兩個保存有oracle表空間名稱信息的文件:/tmp/ora_tablespace.txt和/tmp/ora_autex.txt。

技術分享

我們需要把腳本放到oracle用戶的crontab計劃任務表中,讓腳本在後臺每15分鐘執行一次,一定要保證計劃任務能正常按計劃執行,否則這可能會被監控欺騙(監控端獲取到的數據一直保持不變)。

[oracle@mail ~]$ 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 tablespace
table_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 ","
    fi
done
    printf "\n\t]\n"
printf "}\n"

3、創建監控項目檢測腳本tablespace_check.sh

用於zabbix獲取oracle表空間使用率、剩余量和檢查是否開啟自動擴展。腳本為/usr/local/zabbix/scripts/tablespace_check.sh,腳本內容如下:

#!/bin/bash
# oracle tablespace check
CEHCK_TYPE=$1
TABLESPACE_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/scripts
chmod +x tablespace_check.sh 
chmod +x discovery_oracle_tablespace.sh

檢查腳本的輸入情況是否正常,如下圖:

[root@mail ~]# /usr/local/zabbix/scripts/tablespace_check.sh pre SYSTEM
100
[root@mail ~]# /usr/local/zabbix/scripts/tablespace_check.sh fre SYSTEM   
25559040[root@mail ~]# /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.sh
UserParameter=tablespace.check[*],/usr/local/zabbix/scripts/tablespace_check.sh $1 $2

重新啟動Zabbix客戶端服務。

service zabbix_agentd restart

5、在Zabbix服務端測試監控Key

測試結果如下,一切正常。

[root@monitor bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[pre,SYSTEM]
100
[root@monitor bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[fre,SYSTEM]
25559040
[root@monitor bin]# ./zabbix_get -s 10.0.2.64 -k tablespace.check[check,SYSTEM]
1

四、Zabbix服務端配置

1、創建模板,並添加自動發現規則

技術分享

Name:Oracle tablespace discover
Type:Zabbix agent
Key:discovery.oracle.tablespace

2、創建Item prototypes

這裏主要添加的三個item就是我們獲取到的三個指標,我這裏只演示使用率的配置,大家可以通過附件下載我的模板,直接導入即可。

技術分享

使用率:

技術分享

Name:Oracle tablespace:{#TABLESPACE_NAME} 使用率
Type:Zabbix agent
Key:tablespace.check[pre,{#TABLESPACE_NAME}]

3、創建Trigger prototypes

同樣,這裏有兩個觸發器,我這裏只演示當表空間使用率超過95%報警的信息配置。

技術分享


技術分享

4、創建Graph prototypes

技術分享

五、結果驗證

等待一段時間的發現之後,我們可以看到主機發現了相關的監控項,並可以執行報警信息。

技術分享

USERS表空間的圖標情況:

技術分享

註意:以上的監控時間間隔和告警級別大家可以根據自己的實際情況設定,我這裏只是進行演示配置而已。

技術分享


本文出自 “運維點滴記錄” 博客,請務必保留此出處http://wzlinux.blog.51cto.com/8021085/1974523

Zabbix 3.2.6 通過Discovery批量監控Oracle表空間