原创 Oracle 作者:jeanron100 时间:2014-05-23 08:56:26  8912  2

平时在查看数据库的问题时,会有种迷茫的感觉,如果没有任何人反馈问题,基本上没有主动查找问题的方向,awr,ash都是在得知问题发生的时间段或者一些时间戳来从历史记录中查找相关的信息,个人整理了如下的脚本,能够显示当天的时间段内数据库的负载信息,能够很好掌握数据库的忙闲情况。

来看一个简单的例子,比如我要查看早上6点到中午12点数据库的负载情况

脚本 showdbtime.sh 显示的是在制定的时间段内的 数据库负载的一个综合值。比如6点到7点个小时(60分钟),dbtime如果是120分钟,那么显示的负载就是200%

BEGIN_TIME                                       END_TIME                                  ELAPSED_TIME       DBTIME      WORKLOAD_PER 
----------------------------------- ----------------------------------- ------------- ---------- -------------------- 
201 ** 21-MAY-14 06.07.33.893 PM    201 ** 21-MAY-14 07.07.33.893 PM             60          120            200%

脚本内容如下:

sqlplus -s $DB_CONN_STR@$SH_DB_SID <

set linesize 200 
col begin_time format a35 
col end_time format a35 
col elapsed_time format 99999999.999 
col workload_per format a20 
SELECT 
begin_time,end_time, 
elapsed_time, 
dbtime, 
trunc(dbtime/decode(elapsed_time,0,1,elapsed_time),2)*100||'%' workload_per 
from 

select 
B.SNAP_ID||' ** '||B.END_INTERVAL_TIME begin_time, 
E.SNAP_ID||' ** '||E.END_INTERVAL_TIME end_time, 
EXTRACT(DAY FROM E.END_INTERVAL_TIME - B.END_INTERVAL_TIME) * 1440 + 
EXTRACT(HOUR FROM E.END_INTERVAL_TIME - B.END_INTERVAL_TIME)* 60 + 
EXTRACT(MINUTE FROM E.END_INTERVAL_TIME -B.END_INTERVAL_TIME) + 
EXTRACT(SECOND FROM E.END_INTERVAL_TIME -B.END_INTERVAL_TIME) / 60  elapsed_time, 
db_time.dbtime 
FROM DBA_HIST_SNAPSHOT B, DBA_HIST_SNAPSHOT E, 
                        ( 
                        SELECT b.snap_id begin_snap, e.snap_id end_snap , 
                        round((sum(e.value) - 
                        sum(b.value)) / 1000000 /60,2) dbtime 
                        FROM DBA_HIST_SYS_TIME_MODEL e, DBA_HIST_SYS_TIME_MODEL b, 
                                        ( 
                                        select min(snap_id)  begin_snap,max(snap_id)  end_snap from DBA_HIST_SNAPSHOT where begin_interval_time > sysdate -1 
                                        and EXTRACT(HOUR FROM END_INTERVAL_TIME) between $1 and $2 
                                        ) temp_snap 
                        WHERE 
                         e.STAT_NAME = 'DB time' 
                         and b.snap_id=temp_snap.begin_snap 
                        and e.snap_id =temp_snap.end_snap 
                        AND b.STAT_NAME = 'DB time' 
                        group by e.snap_id,b.snap_id 
                        ) db_time 
WHERE b.begin_interval_time > sysdate -1 
and EXTRACT(HOUR FROM e.END_INTERVAL_TIME) between $1  and $2 
and b.snap_id=db_time.begin_snap 
and e.snap_id=db_time.end_snap 

/

EOF 
exit

在此基础上如果要查看每个小时的数据库负载情况,可以略做一些改进。

脚本showdbtimerpt.sh

sqlplus -s $DB_CONN_STR@$SH_DB_SID < prompt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
set head off 
set pages0 
set feedback off 
set serveroutput on 
spool showdbtimerpt_tmp.sh 
begin 
for i in $1..$2 loop 
dbms_output.put_line('ksh showdbtime  '||i||' '||(i+1)); 
end loop; 
end; 

spool off;

EOF 
clear 
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
echo BEGIN_TIME------------------------- END_TIME--------------------------- ELAPSED_TIME- BTIME----- WORKLOAD_PER-------- 
echo ----------------------------------- ----------------------------------- ------------- ---------- -------------------- 
ksh showdbtimerpt_tmp.sh 
rm showdbtimerpt_tmp.sh 
exit

运行结果类似下面的样子。

BEGIN_TIME                                       END_TIME                                  ELAPSED_TIME       DBTIME      WORKLOAD_PER 
----------------------------------- ----------------------------------- ------------- ---------- -------------------- 
201 ** 21-MAY-14 06.07.33.893 PM    201 ** 21-MAY-14 07.07.33.893 PM             60          120            200%

201 ** 21-MAY-14 07.07.33.893 PM    201 ** 21-MAY-14 08.07.33.893 PM             60          150            250%

201 ** 21-MAY-14 08.07.33.893 PM    201 ** 21-MAY-14 09.07.33.893 PM             60          240            400%

201 ** 21-MAY-14 09.07.33.893 PM    201 ** 21-MAY-14 10.07.33.893 PM             60          60              100%

201 ** 21-MAY-14 10.07.33.893 PM    201 ** 21-MAY-14 11.07.33.893 PM             60          120            200%

可以生成每个时间段的负载报表,这样就一目了然了。可以有针对性的根据负载进行相关的性能抓取。

最新文章

  1. NAT穿透解决方案介绍
  2. notepad++ 行末尾添加指定字符
  3. Linux 性能监控、测试、优化工具
  4. angularJS中如何写控制器
  5. kill,killall,top,free,vmstat,iostat,watch命令
  6. vs2012-vs2013编译出来的程序不能在xp上运行解决方法
  7. delphi webbrowser 经常使用的演示样本
  8. PHP新手之学习类与对象(3)
  9. 你必须知道的EntityFramework 6.x和EntityFramework Core变更追踪状态
  10. 欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法
  11. 使用Node.js搭建数据爬虫crawler
  12. lr介绍
  13. with as 加上 materialize hint 生成实质临时表
  14. flask SQLALchemy外键及约束
  15. flashfxp 数据socket错误 连接已超时 filezilla
  16. Android笔记(五):广播接收者(Broadcast Receiver)
  17. console输出选择器的问题
  18. ubuntu mysql 远程连接问题解决方法
  19. linux初始
  20. Python 之 向上取整、向下取整以及四舍五入函数

热门文章

  1. enumerate用法总结
  2. 攻略前端面试官(三):JS的原型和原型链
  3. AES-加密解密工具类
  4. django----cookie与session 和 中间件
  5. MySql全文检索使用详解
  6. 简单介绍托管执行和 CLI
  7. Android 列表对话框 setItems
  8. Jsonp的js实现,跨域请求,同源策略机制
  9. 好用的Markdown编辑器安利-Typora
  10. WebAPI接口测试数据库操作