相关说明:
ps aux
命令结果的第三列即是进程的CPU使用率
命令结果的第四列即是进程的内存使用率
这两列可以作为进程高系统资源消耗的依据
Oracle动态性能视图v$process的spid即是系统的进程PID信息
同时联查v$session,即可得到SQL_ID和PREV_SQL_ID
脚本间隔5秒搂取一次对应系统资源消耗的SQLID
根据SQLID可以进一步查询出对应的SQL文本和等待事件之类的信息
依据内存消耗搂取SQLID的最终SHELL脚本:
# 内存使用比例大于1%,间隔5秒
su - oracle
while true
do
echo -e "$(date +%F-%T)\nMEM:\tPREV_SQL_ID SQL_ID\n------- ------------- -------------"
ps aux|grep -Ev '^USER|ora_'|grep '^oracle'|awk '{if($4>1) print $4","$2","}'|sort|while read line
do
MEM=$(echo -e "$line"|awk -F',' '{print $1}')
PID=$(echo -e "$line"|awk -F',' '{print $2}')
echo -ne "$MEM\t"
echo -e "set pagesize 0 feedback off heading off
select b.PREV_SQL_ID, b.SQL_ID
from v\$session b
where b.paddr = (SELECT addr
FROM v\$process c
WHERE c.spid = $PID);
"|sqlplus -s / as sysdba|sort|uniq|grep -v '^$'
done
echo -e '\n'
sleep 5
done
依据CPU消耗搂取SQLID的最终SHELL脚本:
# CPU使用比例大于1%,间隔5秒
su - oracle
while true
do
echo -e "$(date +%F-%T)\nCPU:\tPREV_SQL_ID SQL_ID\n------- ------------- -------------"
ps aux|grep -Ev '^USER|ora_'|grep '^oracle'|awk '{if($3>1) print $3","$2","}'|sort|while read line
do
CPU=$(echo -e "$line"|awk -F',' '{print $1}')
PID=$(echo -e "$line"|awk -F',' '{print $2}')
echo -ne "$CPU\t"
echo -e "set pagesize 0 feedback off heading off
select b.PREV_SQL_ID, b.SQL_ID
from v\$session b
where b.paddr = (SELECT addr
FROM v\$process c
WHERE c.spid = $PID);
"|sqlplus -s / as sysdba|sort|uniq|grep -v '^$'
done
echo -e '\n'
sleep 5
done
[TOC]