Oracle 数据库监控案例(PL/SQL开发处女秀)

即日起,正式踏上PL/SQL语言的征程。

在此,留贴为证!



  1. create or replace package xplan_monitor as
  2.    procedure init_tabs;
  3.    procedure comp_proc;
  4.    procedure update_last_tab;
  5.    procedure clear_result_tab;
  6. END xplan_monitor;
  7. /

  8. create or replace package body xplan_monitor is
  9. procedure init_tabs is
  10.   BEGIN
  11.  
  12.     update_last_tab;
  13.  
  14.     BEGIN
  15.       execute immediate 'drop table sql_plan_changed purge';
  16.     EXCEPTION
  17.       when others then
  18.       dbms_output.put_line('cannot drop table sql_plan_changed!');
  19.       dbms_output.put_line(sqlerrm);
  20.  
  21.     END;
  22.  
  23.     BEGIN
  24.       execute immediate 'create table sql_plan_changed as
  25.                             (select new.sql_id, old.plan_hash_value as plan_hash_value_old,
  26.                                     new.plan_hash_value as plan_hash_value_new,
  27.                                     old.cpu_time as cpu_time_old, new.cpu_time as cpu_time_new,
  28.                                     old.elapsed_time as elapsed_time_old,
  29.                                     new.elapsed_time as elapsed_time_new,
  30.                                     sysdate as insert_time
  31.                                   from vdollor_sqlarea old, v$sqlarea new
  32.                                       where old.sql_id = new.sql_id and rownum < 1)';
  33.     EXCEPTION
  34.       when others then
  35.       dbms_output.put_line('cannot create table sql_plan_changed!');
  36.       dbms_output.put_line(sqlerrm);
  37.     END;
  38.   END init_tabs;
  39.  
  40. procedure comp_proc is
  41.  
  42.     plan_curr number;
  43.     plan_last number;
  44.     sqlid varchar2(13);
  45. /*
  46.     cursor cur_sqlstat( v_para number ) is select * from dba_hist_sqlstat where snap_id = v_para;
  47. */
  48.  
  49. /* get TOP 10 SQL on cpu_time */
  50.     cursor cur_sql_id is select * from
  51.                             (select sql_text, sql_id, round(cpu_time/1000000) cpu_time,
  52.                                     round(elapsed_time/1000000) elapsed_time,
  53.                                     disk_reads, buffer_gets,
  54.                                     rows_processed, plan_hash_value
  55.                               from v$sqlarea order by cpu_time desc)
  56.                             where rownum < 11;
  57.  
  58.   BEGIN

  59.   clear_result_tab;

  60.   FOR cur_row in cur_sql_id LOOP
  61.       select plan_hash_value into plan_curr from v$sqlarea where sql_id = cur_row.sql_id;
  62.  
  63.       BEGIN
  64.  
  65.         execute immediate 'select plan_hash_value into plan_last from vdollor_sqlarea where sql_id = cur_row.sql_id';
  66.         
  67.         IF plan_last != plan_curr THEN
  68.           BEGIN
  69.             execute immediate 'insert into sql_plan_changed (select new.sql_id, old.plan_hash_value as plan_hash_value_old,
  70.                                                  new.plan_hash_value as plan_hash_value_new,
  71.                                                  old.cpu_time as cpu_time_old, new.cpu_time as cpu_time_new,
  72.                                                  old.elapsed_time as elapsed_time_old,
  73.                                                  new.elapsed_time as elapsed_time_new
  74.                                                  sysdate
  75.                                             from vdollor_sqlarea old, v$sqlarea new
  76.                                                 where old.sql_id = cur_row.sql_id and new.sql_id = cur_row.sql_id)';
  77.           EXCEPTION
  78.             WHEN OTHERS THEN
  79.               dbms_output.put_line('Insert table sql_plan_changed failed.');
  80.               dbms_output.put_line(sqlerrm);
  81.           END;
  82.         END IF;
  83.  
  84.       EXCEPTION
  85.         WHEN OTHERS THEN
  86.  
  87.           dbms_output.put_line('no data for sql_id:'||cur_row.sql_id||' in vdollor_sqlare.');
  88.           dbms_output.put_line(sqlerrm);
  89.       
  90.       END;
  91.   END LOOP;
  92.     COMMIT;
  93.     update_last_tab;
  94.   END comp_proc;
  95.  
  96. procedure update_last_tab is
  97.  
  98. /* because of size of v$sqlarea, truncate and insert is not better than drop and create. */
  99.   BEGIN
  100.     BEGIN
  101.       execute immediate q'{drop table vdollor_sqlarea purge}';
  102.     EXCEPTION
  103.       when others then
  104.       dbms_output.put_line('cannot drop table vdollor_sqlarea!');
  105.       dbms_output.put_line(sqlerrm);
  106.     END;
  107.  
  108.     BEGIN
  109.       execute immediate q'{create table vdollor_sqlarea as (select * from v$sqlarea)}';
  110.     EXCEPTION
  111.       when others then
  112.       dbms_output.put_line('cannot create table vdollor_sqlarea!');
  113.       dbms_output.put_line(sqlerrm);
  114.     END;
  115.   END update_last_tab;

  116. procedure clear_result_tab is
  117.   BEGIN
  118.     execute immediate 'truncate table sql_plan_changed';
  119.   EXCEPTION
  120.     WHEN OTHERS THEN
  121.       dbms_output.put_line('truncate table sql_plan_changed failed!');
  122.       dbms_output.put_line(sqlerrm);
  123.   END clear_result_tab;

  124. END xplan_monitor;
  125. /
如果你想保护自己的劳动成果,可以使用Oracle自带工具加密语句:
    oracle $ wrap iname=xplan_monitor.pkg [oname=xplan_monitor.plb];
    SQL> @xplan_monitor.plb;


2016.07.29 Jackson Chen

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

转载于:http://blog.itpub.net/25521690/viewspace-2122744/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值