使用shell脚本查看数据库负载情况

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

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

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

目录
相关文章
|
2月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
116 1
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
132 68
|
9天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
32 11
|
1月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
71 2
6种方法打造出色的Shell脚本
|
1月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
65 1
|
1月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
63 2
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
63 6
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
SQL 关系型数据库 MySQL
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
84 12