zabbix自动发现oracle表空间并监控其使用率

一、监控需求

    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 <<  EOF  # oracle数据库安装用户名

    sqlplus -S "/ as sysdba"

   …完整代码见附录1、discovery_oracle_tablespace.sh

 

脚本执行结果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 <<  EOF

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<$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"

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30187411/viewspace-2153385/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30187411/viewspace-2153385/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值