一、监控需求
oracle的表空间使用率实时监控,达到90%触发器触发警告(Warning)信息,当检测到表空间没有开启自动扩展时,则触发Information信息。
二、oracle表空间特性
1、系统表空间
system表空间存放内容为:
数据字典:SYSTEM表空间(tablespace)总是用于存储整个数据库的数据字典表(data dictionary table)。数据字典表存储在编号为1的数据文件(datafile)中。
PL/SQL 程序结构描述:所有和PL/SQL程序结构(包括过程(procedure),函数(function),包 package),及触发器(trigger))有关的数据都被保存在SYSTEM表空间(tablespace)中。如果数据库中用户定义的程序结构很多,那么管理员必须为之在SYSTEM表空间中提供足够的空间。
综上,多数系统中,因数据字典和plsql程序结构不会频繁增加,system表空间增长缓慢,告警级别可降低或不监控。
2、临时表空间
临时表空间用来管理数据库排序操作以及用于存储临时表、中间排序结果等临时对象,当ORACLE里需要用到SORT的时候,并且当PGA中sort_area_size大小不够时,将会把数据放入临时表空间里进行排序。像数据库中一些操作:CREATE INDEX、ANALYZE、SELECT DISTINCT、ORDER BY、GROUP BY、UNION ALL、INTERSECT、MINUS、SORT-MERGE
JOINS、HASH JOIN等都可能会用到临时表空间。当操作完成后,系统会自动清理临时表空间中的临时对象,自动释放临时段。这里的释放只是标记为空闲、可以重用,其实实质占用的磁盘空间并没有真正释放。这也是临时表空间有时会不断增大的原因。
它跟永久表空间不同的地方在于它由临时数据文件(temporary files)组成的,而不是永久数据文件(datafiles)。临时表空间不会存储永久类型的对象,所以它不会也不需要备份。另外,对临时数据文件的操作不产生redo日志,不过会生成undo日志。
综上,多数情况下temp表空间的使用率无需监控,只需注意它过大的情况即可。
3、undo表空间
对Oracle数据库UNDO表空间的监控和管理是我们日常最重要的工作之一,UNDO表空间通常都是Oracle自动化管理(通过undo_management初始化参数确定);UNDO表空间是用于存储DML操作的前镜像数据,它是实例恢复,数据回滚,一致性查询功能的重要组件;我们常常会忽略对它的监控,使用率100%,导致DML操作无法进行。
4、用户表空间
用户表空间即真正支撑具体业务的表空间,空间利用率上对业务连续性起着决定性的作用。我么需要结合业务场景具体确定数据文件是否自动扩展,使用率达到阈值后快速响应扩容。
5、统一特性
表空间上限即dba_data_file视图maxbytes字段是指数据文件可自动扩展的上限,不影响手动resize。
表空间使用率取决于segment的高水位线,若要释放空间,需降低高水位线的相关操作。
自动扩展过程会影响性能,非关键业务表空间数据文件可适当开启自动扩展,除此之外的表空间建议关闭,做好监控即可。
三、监控方式
基于zabbix监控系统,我们可以定制任何需要的监控项目,首先通过自动发现脚本发现oracle表空间,然后再制定额外的属于oracle表空间的监控项目,配置告警触发器,最后在zabbix的Web页面端展示oracle表空间的使用率和剩余量。
1、自动发现oracle数据库表空间并获取信息的脚本(root用户启动zabbix_agentd,其他用户执行需在脚本中添加自动输入oracle数据库安装用户的密码相关shell命令)
[root@ebstest01
ora_zabbix]# vi discovery_oracle_tablespace.sh
#!/bin/bash
#
tablespace usagep check
ZABBIX_H=/home/oraprod/ora_zabbix #脚本存放目录
mkdir -p
$ZABBIX_H
function
check {
su - oraprod>
$ZABBIX_H/tablespace.log <
sqlplus
-S "/ as sysdba"
脚本执行结果ora_tablespace.txt:
[root@ebstest01 ora_zabbix]# cat ora_tablespace.txt
[root@ebstest01
ora_zabbix]# ./discovery_oracle_tablespace.sh
{
"data":[
{"{#TABLESPACE_NAME}":"CTXD"},
{"{#TABLESPACE_NAME}":"ODM"},
{"{#TABLESPACE_NAME}":"APPS_TS_MEDIA"},
{"{#TABLESPACE_NAME}":"APPS_TS_TX_DATA"},
{"{#TABLESPACE_NAME}":"APPS_TS_TX_IDX"},
{"{#TABLESPACE_NAME}":"APPS_TS_NOLOGGING"},
{"{#TABLESPACE_NAME}":"APPS_TS_ARCHIVE"},
{"{#TABLESPACE_NAME}":"APPS_TS_INTERFACE"},
{"{#TABLESPACE_NAME}":"SYSAUX"},
{"{#TABLESPACE_NAME}":"APPS_TS_SEED"},
{"{#TABLESPACE_NAME}":"SYSTEM"},
{"{#TABLESPACE_NAME}":"APPS_TS_QUEUES"},
{"{#TABLESPACE_NAME}":"APPS_TS_SUMMARY"},
{"{#TABLESPACE_NAME}":"TEMP1"},
{"{#TABLESPACE_NAME}":"TEMP2"},
{"{#TABLESPACE_NAME}":"OWAPUB"},
{"{#TABLESPACE_NAME}":"PORTAL"},
{"{#TABLESPACE_NAME}":"APPS_UNDOTS1"},
{"{#TABLESPACE_NAME}":"OLAP"},
{"{#TABLESPACE_NAME}":"APPS_TS_TOOLS"}
]
}
2、监控项目检测脚本tablespace_check.sh用于zabbix获取oracle表空间使用率、剩余量和检查是否开启自动扩展。
[root@ebstest01
ora_zabbix]# cat tablespace_check.sh
#!/bin/bash
# oracle
tablespace check
ZABBIX_H=/home/oraprod/ora_zabbix #脚本存放目录
CEHCK_TYPE=$1
TABLESPACE_NAME=$2
function
current_total_mb {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $2}'
}
function
free_mb {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $3}'
}
function
used_mb {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $4}'
}
function
free_p {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf "%.2f\n", $5}'
}
function
used_p {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf "%.2f\n", $6}'
}
function
aut_yes {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $7}'
}
function
aut_no {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $8}'
}
function
max_total_mb {
grep "\b$TABLESPACE_NAME\b"
$ZABBIX_H/ora_tablespace.txt | awk '{printf $9}'
}
case
$CEHCK_TYPE in
ctotal)
current_total_mb ;;
fre)
free_mb ;;
use)
used_mb ;;
frep)
free_p ;;
usep)
used_p ;;
aty)
aut_yes ;;
atn)
aut_no ;;
mtotal)
max_total_mb ;;
*)
echo -e "Usage: $0
[ctotal|fre|use|frep|usep|aty|atn|mtotal] [TABLESPACE_NAME]"
esac
确认脚本输出的值为zabbix监控所取的数值
[root@ebstest01
ora_zabbix]# ./tablespace_check.sh use SYSTEM
12330.97
[root@ebstest01
ora_zabbix]# ./tablespace_check.sh fre SYSTEM
27197.0313
2、将脚本都保存到$ZABBIX_H/目录下,然后配置UserParameter参数,增加监控key,key名称分别为discovery.oracle.tablespace、tablespace.check,在以下配置文件末尾增加两行
[root@ebstest01
ora_zabbix]# cd /usr/local/zabbix/etc/zabbix_agentd.conf.d/
[root@ebstest01
zabbix_agentd.conf.d]# cat userparameter_script.conf
UserParameter=discovery.oracle.tablespace[*],/home/oraprod/ora_zabbix/discovery_oracle_tablespace.sh
UserParameter=tablespace.check[*],/home/oraprod/ora_zabbix/tablespace_check.sh
$1 $2
3、agent端重启zabbix_ahgentd,在zabbix服务端获取oracle表空间和监控数值
[root@ebsdb01
~]# /usr/local/zabbix/bin/zabbix_get -p10050 -k 'tablespace.check[fre,SYSAUX]'
-s 172.18.11.28
1181.5625
[root@ebsdb01
~]# /usr/local/zabbix/bin/zabbix_get -p10050 -k 'tablespace.check[use,SYSAUX]'
-s 172.18.11.28
818.44
[root@ebsdb01
~]# /usr/local/zabbix/bin/zabbix_get -p10050 -k 'tablespace.check[aty,SYSAUX]'
-s 172.18.11.28
0
四、Zabbix Web端配置
新建oracle表空间模版My_Templates_Linux_Discovery_oracle_tablespace,添加自动发现规则,10分钟更新一次。
注:以下图中{#PROCESS_NAME}替换为脚本结果中的{#TABLESPACE_NAME},pre、fre、check等参数替换为脚本tablespace_check.sh中的选择项[ctotal|fre|use|frep|usep|aty|atn|mtotal]。
添加Item prototypes监控项目,第一个表空间使用率
第二个表空间剩余容量
第三个检查表空间是否开启自动扩展
创建告警触发器
首先创建检测表空间使用率是否大于95%的触发器
创建检测是否开启自动扩展的触发器
查看监控数据
五、附录
1、discovery_oracle_tablespace.sh
#!/bin/bash
# tablespace usagep check
ZABBIX_H=/home/oraprod/ora_zabbix
mkdir -p $ZABBIX_H
function check {
su - oraprod > $ZABBIX_H/tablespace.log <
sqlplus -S "/ as sysdba"
set lines 300 pages 1000
col tablespace_name for a30
spool $ZABBIX_H/ora_tablespace.txt
select *
from (select a.tablespace_name,
round(a.s, 2)
"CURRENT_TOTAL(MB)",
nvl(f.s, 0)
"FREE(MB)",
round((a.s - nvl(f.s, 0)), 2)
"USED(MB)",
round(nvl(f.s, 0) /
a.s * 100, 2) "FREE%",
round(100 - nvl(f.s,
0) / a.s * 100, 2) "USED%",
at.aut_yes,
at.aut_no,
round(a.ms, 2)
"MAX_TOTAL(MB)"
from (select
d.tablespace_name,
sum(bytes /
1024 / 1024) s,
sum(decode(maxbytes, 0, bytes, maxbytes) / 1024 / 1024) ms
from
dba_data_files d
group by d.tablespace_name)
a,
(select
tablespace_name, sum(bytes / 1024 / 1024) s
from
dba_free_space
group by
tablespace_name) f,
(select
nvl(at1.tablespace_name, at2.tablespace_name) tablespace_name,
nvl(at1.cat,0) "AUT_YES",
nvl(at2.cat,0) "AUT_NO"
from (select
tablespace_name,
autoextensible,
count(autoextensible) cat
from dba_data_files
where
autoextensible = 'YES'
group by
tablespace_name, autoextensible) at1
full join (select
tablespace_name,
autoextensible,
count(autoextensible) cat
from
dba_data_files
where
autoextensible = 'NO'
group
by tablespace_name, autoextensible) at2
on at1.tablespace_name =
at2.tablespace_name) at
where at.tablespace_name =
f.tablespace_name(+)
and at.tablespace_name =
a.tablespace_name(+)
union all
select t2.tablespace_name,
t1.bytes
"CURRENT_TOTAL(MB)",
round((t1.bytes -
t2.bytes_used), 2) "FREE(MB)",
t2.bytes_used
"USED(MB)",
round((t1.bytes -
t2.bytes_used) * 100 / t1.bytes, 2) "FREE%",
round(t2.bytes_used *
100 / t1.bytes, 2) "USED%",
t3.aut_yes,
t3.aut_no,
t1.ms
"MAX_TOTAL(MB)"
from (select
tablespace_name,
sum(bytes) /
1024 / 1024 bytes,
sum(decode(maxbytes, 0, bytes, maxbytes) / 1024 / 1024) ms
from
dba_temp_files
group by
tablespace_name) t1,
(select
tablespace_name,
sum(bytes_cached) / 1024 / 1024 bytes_used
from
v\$temp_extent_pool
group by
tablespace_name) t2,
(select
nvl(at1.tablespace_name, at2.tablespace_name) tablespace_name,
nvl(at1.cat,0) "AUT_YES",
nvl(at2.cat,0) "AUT_NO"
from (select
tablespace_name,
autoextensible,
count(autoextensible) cat
from
dba_temp_files
where
autoextensible = 'YES'
group by
tablespace_name, autoextensible) at1
full join (select
tablespace_name,
autoextensible,
count(autoextensible) cat
from
dba_temp_files
where
autoextensible = 'NO'
group
by tablespace_name, autoextensible) at2
on
at1.tablespace_name = at2.tablespace_name) t3
where t3.tablespace_name =
t2.tablespace_name(+)
and t3.tablespace_name =
t1.tablespace_name(+))
order by "FREE%";
spool off
quit
EOF
};check &>/dev/null
#zabbix discovery oracle tablespace
table_spaces=(`cat $ZABBIX_H/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
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"