TOP
首先查看系統資源佔用信息,TOP看一下
ps -mp 4318 -o THREAD,tid,time
再通過ps命令查看這個程序的線程信息,tid代碼線程ID,time代表這個線程的已運行時間
由上面TOP可知進程ID爲15669
printf “%x\n” 4329
10e9n
有了線程ID的16進制後,再在jstack中查看進程堆棧信息(之所有拿到TID信息,主要是爲了查找方便
jstack 4318 |grep 10e9n
1.top 查到pid 28555
2.ps aux|grep 28555 確定到是tomcat的進程
3.顯示線程列表 ps -mp 28555 -o THREAD,tid,time 查到tid 28802
4. printf "%x\n" 28802 將線程id,tid進行16進制轉換
5.jstack pid |grep tid -A 30 顯示堆棧信息 jstack 28555 |grep 28802 -A 30
iostat -dxm 3 查看io
iotop -oP 只顯示有I/O行爲的進程
pidstat -d 1 展示I/O統計,每秒更新一次
查看什麼sql佔用高
select sql_text
from v$process pr,v$session ss,v$sqlarea sl
where pr.addr=ss.PADDR
and ss.SQL_HASH_VALUE=sl.HASH_VALUE
and pr.spid=1606;
查看這些佔用CPU資源很高的Oracle進程究竟是在做什麼操作
select sql_text,spid,v$session.program,process from
v$sqlarea,v$session,v$process
where v$sqlarea.address=v$session.sql_address
1.查詢表空間使用率
select a.tablespace_name, total, free,(total-free) as usage from
(select tablespace_name, sum(bytes)/1024/1024 as total from dba_data_files group by tablespace_name) a,
(select tablespace_name, sum(bytes)/1024/1024 as free from dba_free_space group by tablespace_name) b
where a.tablespace_name = b.tablespace_name;
2.查看總消耗時間最多的前10條SQL語句
select * from (select v.sql_id,v.child_number,v.sql_text,v.elapsed_time,v.cpu_time,v.disk_reads,rank() over(order by v.elapsed_time desc) elapsed_rank from v$sql v) a where elapsed_rank <= 10;
3.查看CPU消耗時間最多的前10條SQL語句
select * from (select v.sql_id,v.child_number,v.sql_text,v.elapsed_time,v.cpu_time,v.disk_reads,rank() over(order by v.cpu_time desc) elapsed_rank from v$sql v) a where elapsed_rank <= 10;
4.查看消耗磁盤讀取最多的前10條SQL語句
select *
from (select v.sql_id,
v.child_number,
v.sql_text,
v.elapsed_time,
v.cpu_time,
v.disk_reads,
rank() over(order by v.disk_reads desc) elapsed_rank
from v$sql v) a
where elapsed_rank <= 10;
5. IOps和IO吞吐量 (oracle 11g)
select sum(decode(name,'physical read IO requests',value,'physical write IO requests',value,0)) as iops,
sum(decode(name,'physical read bytes',value,'physical write bytes',value,0)) / 1024 / 1024 as mbps from v$sysstat
where name in ('physical read IO requests','physical write IO requests','physical read bytes','physical read total bytes',
'physical write bytes','physical write total bytes','physical read total IO requests','physical write total IO requests');
6.內存使用情況
SGA / PGA 使用情況
-- pctused: 使用率
select name,total,round(total-free,2) used, round(free,2) free,round((total-free)/total*100,2) pctused from
(select 'SGA' name,(select sum(value/1024/1024) from v$sga) total,
(select sum(bytes/1024/1024) from v$sgastat where name='free memory')free from dual)
union
select name,total,round(used,2)used,round(total-used,2)free,round(used/total*100,2)pctused from (
select 'PGA' name,(select value/1024/1024 total from v$pgastat where name='aggregate PGA target parameter')total,
(select value/1024/1024 used from v$pgastat where name='total PGA allocated')used from dual);
根據佔用cpu高的進程號來查詢者個進程執行的sql語句:
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address)
IN (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '&pid'))
ORDER BY piece ASC;
例:查詢31968進程對應的sql語言:
SELECT sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address)
IN (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr FROM v$process c WHERE c.spid = '31968'))
ORDER BY piece ASC;
通過pid查看程序執行對應的sql:
select sql_text
from v$process pr,v$session ss,v$sqlarea sl
where pr.addr=ss.PADDR
and ss.SQL_HASH_VALUE=sl.HASH_VALUE
and pr.spid=10840;
查看當前正在執行的SQL:
select a.program, b.spid, c.sql_text,c.SQL_ID
from v$session a, v$process b, v$sqlarea c
where a.paddr = b.addr
and a.sql_hash_value = c.hash_value
and a.username is not null;
1,查看CPU佔用高的進程號
2,根據進程號查看該進程在做什麼
select sql_text,spid,v$session.program,process
from v$sqlarea,v$session,v$process
where v$sqlarea.address=v$session.sql_address
and v$sqlarea.hash_value=v$session.sql_hash_value
and v$session.paddr=v$process.addr
and v$process.spid in(PID);
3,看看數據庫的等待事件都有些什麼
select sid,event,p1,p1text from v$session_wait;
看看等待事件由什麼進程造成的
select spid from v$process where addr in(select paddr from v$session where sid in(84,102,101));
利用一下腳本可以由已知session的SID來獲得SQL語句
select sql_text
from v$sql_text a
where a.hash_value=(
select sql_hash_value
from v$session b
where b.SID=’&sid’)
order by piect ASC;
查看當前會話sql_id
select sql_id ,username,status,event from v$session;
根據sql_id查看sql語句
select sql_text from v$sql where sql_id='cx7sxk891r782';
ORACLE查詢當前執行效率低的sql
--CPU高的SQL
select sql_text from v$sql order by cpu_time desc where rownum <10
--邏輯讀多的SQL:
select * from (select buffer_gets, sql_text from v$sqlarea where buffer_gets > 500000 order by buffer_gets desc) where rownum<=30;
--執行次數多的SQL :
select sql_text,executions from
(select sql_text,executions from v$sqlarea order by executions desc)
where rownum<10;
--讀硬盤多的SQL :
select sql_text,disk_reads from (select sql_text,disk_reads from v$sqlarea order by disk_reads desc)
where rownum<21;
select *
from (
select sql_text,sql_id,cpu_time
from v$sql
order by cpu_time desc)
where ownum<=10
order by rownum asc;
select *
from (
select sql_text,sql_id,cpu_time
from v$sqlarea
order by cpu_time desc)
where rownum<=10
order by rownum asc;
--這2個語句效果基本一樣,一個從v$sql視圖查詢一個從v$sqlarea視圖查詢。
--列出使用頻率最高的5個查詢:
select sql_text,executions
from (select sql_text,executions,
rank() over
(order by executions desc) exec_rank
from v$sql)
where exec_rank <=5;
--消耗磁盤讀取最多的sql top5:
select disk_reads,sql_text
from (select sql_text,disk_reads,
dense_rank() over
(order by disk_reads desc) disk_reads_rank
from v$sql)
where disk_reads_rank <=5;
--找出需要大量緩衝讀取(邏輯讀)操作的查詢:
select buffer_gets,sql_text
from (select sql_text,buffer_gets,
dense_rank() over
(order by buffer_gets desc) buffer_gets_rank
from v$sql)
where buffer_gets_rank<=5;
select count(*) from v$process --當前的連接數
select value from v$parameter where name = 'processes'; --數據庫允許的最大連接數
*修改最大連接數:
alter system set processes = 300 scope = spfile
shutdown immediate
startup
查看連接消耗情況
默認情況下,oracle記錄了機器名(hostname),而沒有記錄ip。所以,只能知道每個機器消耗了多少連接(弊端:如果hostname重名時,視作一臺機器)。
查詢:客戶端設備標識、客戶端程序、oracle用戶名、消耗的連接數量
select b.MACHINE, b.PROGRAM, b.USERNAME, count(*) from v$process a, v$session b
where a.ADDR = b.PADDR and b.USERNAME is not null
group by b.MACHINE, b.PROGRAM, b.USERNAME
order by count(*) desc