使用shell脚本查看数据库负载情况(81天)

平时在查看数据库的问题时,会有种迷茫的感觉,如果没有任何人反馈问题,基本上没有主动查找问题的方向,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 <<EOF
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 <<EOF 
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%

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

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

一次数据库响应慢的问题诊断(r6笔记第39天)

今天接到开发一个同事的电话,说前端系统那边反馈有一个查询很慢,初步怀疑是有一些并发或者锁之类的问题导致的。 接到问题之后,自己还是带着一些的紧迫感来处理的。 首...

2725
来自专栏杨建荣的学习笔记

海量数据切分抽取的实践场景(r11笔记第43天)

如果一个大表要抽取数据导出成csv文件,我们有什么策略,如何改进。 一、问题背景 今天开发的同学找到我,他们需要做一个数据统计分析,需要我提供一些支持,把一...

3436
来自专栏杨建荣的学习笔记

使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)

对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里。彼此还是独立的schema,倒也是相安...

2754
来自专栏用户画像

网上书店管理系统数据库 sql sever

1.数据库各数据对象的设计与实现:表、约束、完整性体现、查询、视图,要求用合理的数据体现。

1083
来自专栏杨建荣的学习笔记

MySQL中的Online DDL(第一篇)(r11笔记第3天)

记得有一天快下班的时候,一位开发同事找到我说,需要对一个表做变更,数据量据说有上千万,而当时是使用的MySQL版本是5.5,这可如何是好,对于在线业务要求高的情...

3419
来自专栏Spark学习技巧

浪尖,请问如何确定hive分桶数?

顺便打个广告,更多优质文章和问题答疑及视频教程请点击原文链接,加入浪尖知识星球-Spark技术学院获取。

2115
来自专栏idba

死锁案例之三

一 前言 死锁其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发朋友都会在工作过程中遇见。关于死锁我会持续写一个系列的案例分析,希望能...

612
来自专栏杨建荣的学习笔记

关于奇怪的并行进程分析(二) (r6笔记第46天)

前几天的并行问题自己分析了下,也算有了一些进展,但是目前还没有找到让人信服的理由,有些读者也比较关心这个问题,所以第二篇中会把自己的分析过程写出来,第三篇中应该...

2593
来自专栏james大数据架构

聚合索引(clustered index) / 非聚合索引(nonclustered index)

以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.. 呵呵 很难有人答得好.. 各位在我收集每个人擅长的东西时,大部分都把SQL...

4635
来自专栏Jerry的SAP技术分享

SAP CRM Survey调查问卷的存储模型

数据库表CRM_SVY_DB_SVS,通过如下的函数CRM_SVY_DB_SVS_CREATE插入:

1573

扫码关注云+社区