oracle運維積累

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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章