背景
Oracle表空间使用率实时监控,当表空间使用率达到95%时触发告警机制。Oracle表空间分为系统默认表空间和用户创建的表空间,而表空间又有自动扩展和非自动扩展两种类型,用户(DBA)在创建表空间时可以根据应用需求指定是否开启表空间自动扩展。那么在这里我们需要分析一个监控策略,就是当zabbix监控到某个表空间使用率达到95%,那么就让触发器触发警告(Warning)信息,并发送邮件给DBA或管理者。当检测到表空间没有开启自动扩展时,则触发Information信息。说明一下:oracle表空间是否开启自动扩展以及最大能扩展到多少在最初应该规划好的,有时在创建表空间时指定初始容量和最大能扩展的容量一致的话,那么就会让这个表空间立即拥有最大能扩展的容量,而不是随着表空间的消耗而慢慢增加。所以即使我们检测到该表空间开启了自动扩展功能,实际上也不会继续扩展了。当然在大多数业务场景下一般是不建议开启表空间自动扩展功能的,除非你的业务是非关键的。回到监控这里,当我们同时收到这两个告警信息时,那么就要及时处理oracle表空间使用率大于95%的问题了。
监控方式
首先通过自动发现脚本发现oracle表空间,然后再制定额外的属于oracle表空间的监控项目,配置告警触发器,最后在zabbix的Web页面端展示oracle表空间的使用率和剩余量。
获取oracle数据库表空间信息的原始脚本和自动发现脚本
Oracle表空间的信息需要SQL语句查询得到,因此,我们首先创建一个获取表空间信息的原始脚本/home/oracle/bin/check_tablespace.sh,这个脚本由oracle用户去执行,脚本编写如下:
oracle@hmracdb1:~/bin> cat check_tablespace.sh
#!/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@hmracdb1:~/bin> ls -l /tmp/ora_*
-rw-r--r-- 1 oracle oinstall 1030 Mar 23 20:50 /tmp/ora_autex.txt
-rw-r--r-- 1 oracle oinstall 929 Mar 23 20:50 /tmp/ora_tablespace.txt
oracle@hmracdb1:~/bin> cat /tmp/ora_tablespace.txt
TABLESPACE_NAME TOTAL FREE USAGE
--------------------------------------------- ---------- ---------- ----------
TEST11 50 49 1
SYSAUX 2048 1197 851
UNDOTBS1 2048 2036.3125 11.6875
USERS 1024 1023 1
SYSTEM 2048 1358.375 689.625
UDB_SPACE 40960 31673.875 9286.125
UNDOTBS2 2048 2035.1875 12.8125
7 rows selected.
oracle@hmracdb1:~/bin> cat /tmp/ora_autex.txt
TABLESPACE_NAME AUTOEX
------------------------------------------------------ ------
SYSTEM YES
SYSAUX YES
UNDOTBS1 YES
UNDOTBS2 YES
USERS YES
UDB_SPACE YES
UDB_SPACE YES
TEST11 YES
8 rows selected.
我们需要把脚本放到oracle用户的crontab计划任务表中,让脚本在后台每5分钟执行一次,一定要保证计划任务能正常按计划执行,否则这可能会被监控欺骗(监控端获取到的数据一直保持不变)。
hmracdb1:~ # crontab -u oracle -l
#DO NOT EDIT THIS FILE - edit the master and reinstall.
#(/tmp/crontab.XXXXj0XHiH installed on Thu Mar 23 11:38:37 2017)
#(Cron version V5.0 – $Id: crontab.c,v 1.12 2004/01/23 18:56:42 vixie Exp $)
*/5 * * * * /home/oracle/bin/check_tablespace.sh
手动执行SQL语句获取表空间使用率
SQL> set linesize 200
select ff.s tablespace_name,
ff.b total,
(ff.b - fr.b)usage,
fr.b free,
round((ff.b - fr.b) / ff.b * 100) || '% ' usagep
from (select tablespace_name s, sum(bytes) / 1024 / 1024 b
from dba_data_files
group by tablespace_name) ff,
(select tablespace_name s, sum(bytes) / 1024 / 1024 b
from dba_free_space
group by tablespace_name) fr
12 where ff.s = fr.s;
TABLESPACE_NAME TOTAL USAGE FREE USAGEP
------------------------------------------------ ---------- ---------- ---------- -------
TEST11 50 1 49 2%
SYSAUX 2048 851.375 1196.625 42%
UNDOTBS1 2048 12.6875 2035.3125 1%
USERS 1024 1 1023 0%
SYSTEM 2048 689.625 1358.375 34%
UDB_SPACE 40960 9286.125 31673.875 23%
UNDOTBS2 2048 12.8125 2035.1875 1%
7 rows selected.
编写一个zabbix自动发现oracle表空间的脚本discovery_oracle_tablespace.sh
hmracdb1:~ # cat 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"
赋予脚本执行权限,并放到$ZABBIX_HOME/scripts/目录下,下面是执行该脚本输出为json格式的oracle表空间的信息
hmracdb1:/opt/zabbix/scripts # ./discovery_oracle_tablespace.sh
{
"data":[
{"{#TABLESPACE_NAME}":"TEST11"},
{"{#TABLESPACE_NAME}":"SYSAUX"},
{"{#TABLESPACE_NAME}":"UNDOTBS1"},
{"{#TABLESPACE_NAME}":"USERS"},
{"{#TABLESPACE_NAME}":"SYSTEM"},
{"{#TABLESPACE_NAME}":"UDB_SPACE"},
{"{#TABLESPACE_NAME}":"UNDOTBS2"}
]
}
监控项目检测脚本tablespace_check.sh用于zabbix获取oracle表空间使用率、剩余量和检查是否开启自动扩展。
hmracdb1:~ # cat 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
确认脚本输出的值为zabbix监控所取的数值
hmracdb1:~ # ./tablespace_check.sh pre SYSTEM
34
hmracdb1:~ # ./tablespace_check.sh fre SYSTEM
1424359424hmracdb1:~ # ./tablespace_check.sh check SYSTEM
1
将脚本都保存到$ZABBIX_HOME/scpirts目录下,然后配置UserParameter参数,增加监控key,key名称分别为discovery.oracle.tablespace、tablespace.check,在以下配置文件末尾增加两行
hmracdb1:/opt/zabbix/scripts # vim ../etc/zabbix_agentd.conf.d/userparameter_script.conf
UserParameter=discovery.oracle.tablespace[*],/opt/zabbix/scripts/discovery_oracle_tablespace.sh
UserParameter=tablespace.check[*],/opt/zabbix/scripts/tablespace_check.sh $1 $2
重启zabbix_agentd
在zabbix服务端获取oracle表空间和监控数值
[root@Zabbix_19F ~]# zabbix_get -p10050 -k 'tablespace.check[pre,SYSTEM]' -s 10.xxx.xxx.xxx
34
[root@Zabbix_19F ~]# zabbix_get -p10050 -k 'tablespace.check[fre,SYSTEM]' -s 10.xxx.xxx.xxx
1424359424
[root@Zabbix_19F ~]# zabbix_get -p10050 -k 'tablespace.check[check,SYSTEM]' -s 10.xxx.xxx.xxx
1
Zabbix Web端配置
新建oracle表空间模版My_Templates_Linux_Discovery_oracle_tablespace,添加自动发现规则,10分钟更新一次
添加Item prototypes监控项目,第一个表空间使用率
第二个表空间剩余容量
第三个检查表空间是否开启自动扩展
创建告警触发器
首先创建检测表空间使用率是否大于95%的触发器
创建检测是否开启自动扩展的触发器