首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

哪位高手能给小弟我一个oracle数据库表空间监控工具啊求表空间监控工具.

2013-08-04 
谁能给我一个oracle数据库表空间监控工具啊?求表空间监控工具...急!急!!急!急!急! 在线等啊求一个oracle数

谁能给我一个oracle数据库表空间监控工具啊?求表空间监控工具...急!急!!急!急!急! 在线等啊
求一个oracle数据库表空间监控程序或工具,能及时监控到表空间超出等情况,最好能发邮件或短信提醒的,谢谢,公司给安排的工作,今天必须完成,希望大神帮帮我啊!可以发我邮箱 296580677@qq.com哪位高手能给小弟我一个oracle数据库表空间监控工具啊求表空间监控工具. Oracle 数据库 监控工具
[解决办法]
-- 我是用 存储过程 + job循环调度 + 139邮箱实时接收雉通知实现的。
--
[解决办法]

-- 下面是我的实现代码(当然,在写过程前,你得有你们的邮件服务器,且在oracle中配置好ACL)

-- 一、监控土豆北京Oracle数据库服务器各表空间的使用情况:

-- 在以上4台服务器的data_monitor用户中创建视图:
GRANT SELECT ON DBA_FREE_SPACE TO DATA_MONITOR;
GRANT SELECT ON DBA_DATA_FILES TO DATA_MONITOR;
GRANT CREATE VIEW TO DATA_MONITOR;

CREATE OR REPLACE VIEW data_monitor.tablespace_info
AS
SELECT a.tablespace_name as tablespace_name,
       to_char(b.total/1024/1024,999999.99) as Total,
       to_char((b.total-a.free)/1024/1024,'9999990D99') as Used,
       to_char(a.free/1024/1024,'9999990D99') as Free,
       to_char(round((total-free)/total,4)*100,'9999990D99')
[解决办法]
'%' as Used_Rate
  FROM (SELECT tablespace_name, sum(bytes) free FROM SYS.DBA_FREE_SPACE GROUP BY tablespace_name) a,
       (SELECT tablespace_name, sum(bytes) total FROM SYS.DBA_DATA_FILES GROUP BY tablespace_name ) b
 WHERE a.tablespace_name=b.tablespace_name
   AND round((total-free)/total,4)*100 > 90
 ORDER BY round((total-free)/total,4) DESC;

----------------------------------------
-- *1). 创建存储过程用以监控各表空间的使用情况

create or replace PROCEDURE pro_get_tbs_info
AS
/******************************************************************************


  **     功能:监控Oracle数据库服务器
  **     10.103.23.102 ---- oracle(操作系统用户)
  **     10.103.23.103 ---- oraadv(操作系统用户)
  **     10.106.23.166 ---- oraweb(操作系统用户)
  **     10.106.23.167 ---- oraadv(操作系统用户)
  **           各表空间的使用情况,如果其占用空间超过总分配空间的90%,将邮件报警!
  **   创建者:罗友谋
  ** 创建时间:2013.12.21
  ****************************************************************************/
  v_tablespace_info     varchar2(4000);
  v_tablespace_info_all varchar2(4000);
  v_title               varchar2(400);

  v_host_ip         tb_monitor_info.host_ip%type;
  v_host_name       varchar2(100);
  v_monitor_type    tb_monitor_info.monitor_type%type;
  v_db_link_name    tb_monitor_info.db_link_name%type;
  v_tb_name         tb_monitor_info.tb_name%type;

  v_monitor_times   tb_monitor_log.monitor_times%type;
  v_error_times     tb_monitor_log.error_times%type;
  v_date_id         tb_monitor_log.date_id%type;
  v_last_date       tb_monitor_log.last_date%type;
  v_last_text       tb_monitor_log.last_text%type;

  v_mail_info       VARCHAR2(4000);
  v_mail_title      VARCHAR2(200);
  v_mail_from       varchar2(50);
  v_mail_to         tb_monitor_info.mail_to%type;
  v_mail_to_dba     varchar2(50);
  v_fail_text       varchar2(4000);

  v_err_code        NUMBER;
  v_err_msg         VARCHAR2(200);
  v_err_info        VARCHAR2(400);

  v_sql1          varchar2(4000);
  v_sql2          varchar2(4000);
  v_cnt           number(18,0);



  cursor cur_tablespace_info IS
    SELECT t1.host_ip, t1.monitor_type, t1.db_link_name, t1.tb_name, t1.mail_to,
           to_number(to_char(sysdate,'YYYYMMDD')) as date_id, sysdate as last_date,
           decode(t2.monitor_times,null,1,t2.monitor_times+1) as monitor_times,
           nvl(t2.error_times,0) as error_times,
           nvl(last_text,'') as last_text,
           'SELECT COUNT(1) AS cnt FROM '
[解决办法]
t1.tb_name
[解决办法]
'@'
[解决办法]
t1.db_link_name as sqls
    FROM tb_monitor_info t1 left join tb_monitor_log t2 on t1.host_ip=t2.host_ip and t1.monitor_type=t2.monitor_type and t2.date_id=to_number(to_char(sysdate,'YYYYMMDD'))
    WHERE t1.monitor_type='tablespace_used'
      AND t1.status=1;

  rec_tablespace_info cur_tablespace_info%rowtype;
BEGIN

  v_tablespace_info := '';
  v_tablespace_info_all := '';
  v_fail_text := '';

  select data_monitor.fun_mail_from, data_monitor.fun_mail_to_dba
    into v_mail_from, v_mail_to_dba
    from dual;

  OPEN cur_tablespace_info;
  LOOP
    FETCH cur_tablespace_info INTO rec_tablespace_info;
    EXIT WHEN cur_tablespace_info%NOTFOUND;

    v_host_ip       := rec_tablespace_info.host_ip;
    v_monitor_type  := rec_tablespace_info.monitor_type;
    v_db_link_name  := rec_tablespace_info.db_link_name;
    v_tb_name       := rec_tablespace_info.tb_name;
    v_mail_to       := rec_tablespace_info.mail_to;
    v_date_id       := rec_tablespace_info.date_id;
    v_last_date     := rec_tablespace_info.last_date;


    v_monitor_times := rec_tablespace_info.monitor_times;
    v_error_times   := rec_tablespace_info.error_times;
    v_last_text     := rec_tablespace_info.last_text;
    v_sql1          := rec_tablespace_info.sqls;

    BEGIN
      EXECUTE IMMEDIATE v_sql1 INTO v_cnt;

      IF v_cnt >0 THEN
      BEGIN
        EXECUTE IMMEDIATE 'SELECT listagg(lpad(tablespace_name,30,'' '')
[解决办法]
chr(9)
[解决办法]
lpad(total,11,'' '')
[解决办法]
chr(9)
[解决办法]
lpad(used,11,'' '')
[解决办法]
chr(9)
[解决办法]
lpad(free,11,'' '')
[解决办法]
chr(9)
[解决办法]
lpad(used_rate,12,'' ''),chr(10)) within group(order by rownum) as tbs_info FROM '
[解决办法]
v_tb_name
[解决办法]
'@'
[解决办法]
v_db_link_name INTO v_tablespace_info;
        IF v_error_times < 4 THEN
          SELECT 'Tablespace_Info For '
[解决办法]
v_host_ip
[解决办法]
' Date: '
[解决办法]
to_char(v_last_date,'YYYY-MM-DD HH24:MI:SS')
[解决办法]
chr(10)
[解决办法]



                 lpad(' ',120,'-')
[解决办法]
chr(10)
[解决办法]

                 lpad('Tablespace_Name',30,' ')
[解决办法]
chr(9)
[解决办法]

                 lpad('Total(M)',11,' ')
[解决办法]
chr(9)
[解决办法]

                 lpad('Used(M)',11,' ')
[解决办法]
chr(9)
[解决办法]

                 lpad('Free(M)',11,' ')
[解决办法]
chr(9)
[解决办法]

                 lpad('Used_Rate',12,' ')
[解决办法]
chr(10) INTO v_title
            FROM dual;
          v_mail_info := v_title
[解决办法]
v_tablespace_info;
          v_tablespace_info_all := v_tablespace_info_all
[解决办法]
v_mail_info
[解决办法]
chr(10)
[解决办法]
chr(10);
          v_mail_title := '表空间报警!('
[解决办法]
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
------解决方案--------------------


')';
          PRO_SENDEMAIL(v_mail_info,v_mail_title,v_mail_from,v_mail_to);
        END IF;
      END;
      ELSE
        v_tablespace_info := 'OK';
      END IF;

      merge into tb_monitor_log t1
      using (select v_host_ip as host_ip, v_monitor_type as monitor_type, v_date_id as date_id, v_last_date as last_date,
                    v_monitor_times as monitor_times, decode(v_tablespace_info,'OK',0,v_error_times+1) as error_times,
                    v_tablespace_info as last_text
               from dual) t2
         on (t1.host_ip=t2.host_ip and t1.monitor_type=t2.monitor_type and t1.date_id=t2.date_id)
       when matched then
     update set t1.last_date=t2.last_date, t1.monitor_times=t2.monitor_times, t1.error_times=t2.error_times, t1.last_text=t2.last_text
       when not matched then
     insert (host_ip,monitor_type,date_id,last_date,monitor_times,error_times,last_text)
     values (t2.host_ip,t2.monitor_type,t2.date_id,t2.last_date,t2.monitor_times,t2.error_times,t2.last_text);

      COMMIT;

      EXCEPTION WHEN OTHERS THEN
      BEGIN
        NULL;
        v_err_code   := SQLCODE;
        v_err_msg    := SUBSTR(SQLERRM, 1, 200);
        v_fail_text  := 'Error code: '
[解决办法]
v_err_code
[解决办法]
CHR(10)
[解决办法]
'Error message: '
------解决方案--------------------


v_err_msg
[解决办法]
CHR(10)
[解决办法]
'Execute_Host: '
[解决办法]
v_host_name;
        v_fail_text :=  '主机:'
[解决办法]
v_host_ip
[解决办法]
' 表空间监控失败! 请检查是否网络故障或其他原因。'
[解决办法]
CHR(10)
[解决办法]
CHR(10)
[解决办法]
v_fail_text;
        v_mail_title := '表空间监控失败--请速检查!('
[解决办法]
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
[解决办法]
')';
        PRO_SENDEMAIL(v_fail_text,v_mail_title,v_mail_from,v_mail_to_dba
[解决办法]
';'
[解决办法]
v_mail_to);
      END;

    END;
  END LOOP;
  CLOSE cur_tablespace_info;

  IF v_tablespace_info_all IS NOT NULL THEN
    PRO_SENDEMAIL(v_tablespace_info_all,'表空间报警!',v_mail_from,v_mail_to_dba);
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    -- 关闭尚未关闭的游标
    IF cur_tablespace_info%ISOPEN THEN
      close cur_tablespace_info;
    END IF;
    v_err_code   := SQLCODE;
    v_err_msg    := SUBSTR(SQLERRM, 1, 200);
    v_mail_title := '存储过程(表空间监控: pro_get_tbs_info)执行出错!('
[解决办法]
to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
[解决办法]
')';
    v_host_name  := sys_context('userenv','host');
    v_fail_text  := 'Error code: '


[解决办法]
v_err_code
[解决办法]
CHR(10)
[解决办法]
'Error message: '
[解决办法]
v_err_msg
[解决办法]
CHR(10)
[解决办法]
'Execute_Host: '
[解决办法]
v_host_name;
    PRO_SENDEMAIL(v_fail_text,v_mail_title,v_mail_from,v_mail_to_dba);
END;
/





exec pro_get_tbs_info;

----------------------------------------
-- *2). 创建 Job 定时监控
-- job 1.1  -- 每30分钟执行一次

-- yktdadvdg2
variable  job_get_tbs_info1 number;
begin 
  dbms_job.submit(:job_get_tbs_info1,'pro_get_tbs_info;',TRUNC(SYSDATE,'HH24')+5/1440,'TRUNC(SYSDATE,''HH24'')+5/1440+1/24');
end;
/


[解决办法]
quest Spotlight

热点排行
Bad Request.