通过shell脚本定位性能sql和生成报告

oracle的sql monitor是一个很有用的工具集。但是通过sql命令和反复去调用dbms_tune来传入参数等等操作感觉挺费事的。
可以通过如下的脚本来定位sql monitor中的性能sql,发现一些潜在的性能问题。
这个脚本可以定位正在sql monitor监控范围内的sql语句。

MONITOR_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID
set pages 100
set linesize 200
col status format a20
col username format a15
col module format a20
col program format a25
col sql_id format a20
col sql_text format a20
select sql_id,STATUS  ,  USERNAME  ,  MODULE ,   PROGRAM, substr(SQL_TEXT,0,20) sql_text from v\\$sql_monitor where username =upper('$1') group by sql_id,STATUS  ,  USERNAME  ,  MODULE ,   PROGRAM, substr(SQL_TEXT,0,20); 
exit; 
END` 

if [ -z "$MONITOR_OWNER" ]; then 
 echo "no object exists, please check again" 
 exit 0 
else 
 echo '*******************************************'
 echo " $MONITOR_OWNER    " 
 echo '*******************************************'
fi 

脚本运行结果如下,可以显示sql_id和状态,还有简单的sql语句。
尤其可以重点关注那些正在执行的语句。
SQL_ID               STATUS               USERNAME        MODULE               PROGRAM                   SQL_TEXT              
-------------------- -------------------- --------------- -------------------- ------------------------- --------------------  
7u9gsk798bvrp        DONE (ALL ROWS)      TEST_USER         JDBC Thin Client     JDBC Thin Client          SELECT   AA.DATA_GRO
cjqdgd14xjwjm        DONE (ALL ROWS)      TEST_USER         JDBC Thin Client     JDBC Thin Client          SELECT TO_CHAR (SUBS
2zymmn3s4xn1k        DONE (ALL ROWS)      TEST_USER         JDBC Thin Client     JDBC Thin Client          SELECT      nrg."Cyc
1hg2wcuapy3y3        EXECUTING            TEST_USER         JDBC Thin Client     JDBC Thin Client          select d1_run_reque 

如果要生成sql monitor报告。
可以采用如下的脚本
MONITOR_OWNER=`sqlplus -silent $DB_CONN_STR@$SH_DB_SID
set pages 100
set linesize 200
col status format a20
col username format a15
col module format a20
col program format a25
col sql_id format a20
col sql_text format a20
select sql_id,STATUS  ,  USERNAME  ,  MODULE ,   PROGRAM, substr(SQL_TEXT,0,20) sql_text from v\\$sql_monitor where sql_id='$1' group by sql_id,STATUS  ,  USERNAME  ,  MODULE ,   PROGRAM, substr(SQL_TEXT,0,20) ; 
exit; 
END` 

if [ -z "$MONITOR_OWNER" ]; then 
 echo "no object exists, please check again" 
 exit 0 
else 
 echo '*******************************************'
 echo " $MONITOR_OWNER    " 
 echo '*******************************************'
fi 

sqlplus -silent $DB_CONN_STR@$SH_DB_SID
set long 99999
set pages 0
set linesize 200
col status format a20
col username format a30
col module format a20
col program format a20
col sql_id format a20
col sql_text format a50
col comm format a200
set long 999999
SELECT dbms_sqltune.report_sql_monitor(
sql_id => '$1',
report_level => 'ALL',
type=>'TEXT'
) comm 
FROM dual;  

EOF

如果要查看html格式的,直接替换上述标黄的部分为HTML即可。
生成的报告可读性很好,可以很容易看到瓶颈倒底在哪儿

SQL Monitoring Report

SQL Text

xxxxxxxxxxxxxx

Global Information: DONE (ALL ROWS)


Instance ID : 1
Buffer Gets IO Requests Database Time Wait Activity

.

90637

.

.

1632

.

.

11s

.

.

.

100%
Session : xxxxxxxx (4940:57969)
SQL ID : cjqdgd14xjwjm
SQL Execution ID : 16783859
Execution Started : 07/17/2014 14:48:09
First Refresh Time : 07/17/2014 14:48:15
Last Refresh Time : 07/17/2014 14:48:20
Duration : 11s
Module/Action : JDBC Thin Client/-
Service : SYS$USERS
Program : JDBC Thin Client
PL/SQL Entry Ids : 2455820,1
PL/SQL Ids (Obj/Sub) : 2455820,1
Fetch Calls : 2

Binds

Name Position Type Value
:B2 1 NUMBER 10308170
:B1 2 NUMBER 6

SQL Plan Monitoring Details (Plan Hash Value=1125972187)

Id Operation Name Estimated
Rows
Cost Active Period 
(11s)
Execs Rows Memory
(Max)
Temp 
(Max)
IO Requests CPU Activity Wait Activity

.

0 SELECT STATEMENT
.


.


.

.

.

1 1
.


.


.


.


.

1 . SORT ORDER BY
.

6 67758

.

.

1 1 2.0KB
.


.


.


.

2 .. COUNT STOPKEY
.


.


.

.

.

1 1
.


.


.


.


.

3 ... VIEW xxxxxxxxxxxxx 577K 59898

.

.

1 1
.


.


.


.


.

4 .... SORT UNIQUE STOPKEY
.

577K 59898

.

.

1 1 2.0KB
.


.


.


.

5 ..... UNION-ALL
.


.


.

.

.

.

1 1
.


.


.


.

时间: 2024-10-23 19:56:41

通过shell脚本定位性能sql和生成报告的相关文章

Linux/Unix shell 脚本中调用SQL,RMAN脚本

        Linux/Unix shell脚本中调用或执行SQL,RMAN 等为自动化作业以及多次反复执行提供了极大的便利,因此通过Linux/Unix shell来完成Oracle的相关工作,也是DBA必不可少的技能之一.本文针对Linux/Unix shell脚本调用sql, rman 脚本给出了相关示例.   一.由shell脚本调用sql,rman脚本 1.shell脚本调用sql脚本 #首先编辑sql文件 oracle@SZDB:~> more dept.sql connect

OraRep OSPRep v0.4.7发布 shell脚本的PL/SQL代码片段

OraRep是一个嵌入在shell脚本的PL/SQLhttp://www.aliyun.com/zixun/aggregation/17348.html">代码片段,用于已知的数据库实例中创建一个格式良好的HTML报告,为你提供实例概述,和性能优化的一些提示信息.它已经通过Oracle 8.1.7.9.0.1 和 9.2的测试.OSPRep提供额外的插件,用于更详细特殊问题的报告,它可以随意地用图表创建一个单独的页面进行可视化的结果. OraRep OSPRep v0.4.7版本主要是进行

Shell脚本中执行sql语句操作mysql的5种方法_linux shell

对于自动化运维,诸如备份恢复之类的,DBA经常需要将SQL语句封装到shell脚本.本文描述了在Linux环境下mysql数据库中,shell脚本下调用sql语句的几种方法,供大家参考.对于脚本输出的结果美化,需要进一步完善和调整.以下为具体的示例及其方法. 1.将SQL语句直接嵌入到shell脚本文件中 复制代码 代码如下: --演示环境  [root@SZDB ~]# more /etc/issue  CentOS release 5.9 (Final)  Kernel \r on an \

Shell脚本实现获取网页快照并生成缩略图_linux shell

获取网页快照并生成缩略图可分两步进行: 1.获取网页快照 2.生成缩略图 获取网页快照 这里我们用 phantomjs 来实现.关于 phantomjs 的详细用法可参考官方网站.http://phantomjs.org/ 1.安装 我的环境是CentOS6.5,安装时直接下载 tarball 然后解压即可. 复制代码 代码如下: # wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-i686.t

Linux/Unix shell 脚本跨服务器跨实例执行SQL

      在DB运维的过程中,难免碰到需要跨多个服务器以及多个Oracle实例查询数据库的情形.比如我们需要查看当前所有生产环境数据库上open_cursor参数的值以便考虑是否需要增加.而需要查看的数据库服务器上有多个实例,同时又存在多个数据库服务器,这样子下来,几十个DB,上百个的情形一个个查,那得把人给累死.那就像点办法撒,写个shell脚本,轮巡所有服务器及服务器上的所有实例.见本文的描述.      关于shell脚本中如何调用SQL,可以参考下列链接:           Linu

关于shell中的pl/sql脚本错误排查与分析

今天有个同事问我一个问题,他说运行shell脚本的时候抛出了ORA 错误,但是对于错误的原因没有思路,想让我帮他看看. 我查看了下,脚本的结构比较清晰. 脚本是有一个shell脚本,一个sql文件组成,shell脚本作为基本的流程控制,sql文件中是pl/sql脚本. 大体明白了shell脚本的部分,没有做过多的追究,就开始了解pl/sql脚本的内容了. 首先在pl/sql中声明了大量的procedure,类似shell中的function,大概有10多个procedure 然后在最后使用一个类

用shell脚本在mysql表中批量插入数据的方法_linux shell

很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

linux 下shell脚本调用 (小白求教)

问题描述 linux 下shell脚本调用 (小白求教) Shell脚本怎么实现调用一个可执行文件并在脚本中执行该文件中的命令? (可执行文件打开后是命令行模式) 解决方案 啥意思?脚本里调用脚本?直接以廖本名调用啊 解决方案二: 这个是不是类似,在shell命令行窗口中打开另外一个命令行? 解决方案三: 用fork,system等,可以获取它的管道输出等 解决方案四: 文件中的命令? 没明白什么意思? 解决方案五: 可以尝试使用source函数................. 解决方案六:

linux 下RMAN备份shell脚本

       RMAN备份对于Oracle数据库的备份与恢复简单易用,成本低廉.对于使用非catalog方式而言,将RMAN脚本嵌入到shell脚本,然后再通过crontab来实现中小型数据库数据库备份无疑是首选.本文提供了一个简单易用的基于linux shell下的RMAN备份脚本供参考.大家可根据自己的需要进行适当调整.   RMAN备份相关方面的知识较多,可以参考:    RMAN 概述及其体系结构    RMAN 配置.监控与管理    RMAN 备份详解    RMAN 还原与恢复