oracle資料庫CPU特別高的解決方法

風靈使發表於2018-10-11

system表空間100%,導致資料庫無法訪問

系統表空間正常情況下只存放了資料字典之類的東西,所以佔用的空間一般在500M以下。如果你的系統表空間佔用比較多的空間,可能有以下幾方面的原因:1)沒有為使用者明確指定預設表空間,導致system系統表空間作為使用者預設表空間2)開啟了審計,請檢查此表的大小AUD$

你可以執行以下查詢來檢查一下系統表空間哪些表比較大:

SQL> select * from (select SEGMENT_NAME,sum(bytes)/1024/1024 sx 
from dba_segments
where tablespace_name='SYSTEM' group by segment_name)
where sx>100 order by sx desc;  

檢視該表紀錄數

select count(*) sum from AUD$; 

解決方法大概可分為以下幾種:一、為system表空間另外新增一個資料檔案。

alter tablespace system add datafile 'D:\oracleXE\oradata\XE\system_01.dbf' resize 1024M;

二、更改system表空間的資料檔案SYSTEM.dbf分配空間。

alter database datafile 'D:\oracleXE\oradata\XE\system_01.dbf' autoextend on;  
alter database datafile 'D:\oracleXE\oradata\XE\system_01.dbf' resize 1024M;

三、truncateAUD$表並關閉審計功能(我是使用的這種,效果立竿見影,不過如果不關閉此功能, 需要定期清理此表):

SQL> alter system set audit_trail=none scope=spfile;             
SQL>showdown immediate;             
SQL>startup;

四、將AUD$預設表空間由system移出。

如何用sql 語句查詢出oracle的cpu使用率

select * from (select sql_text,sql_id,cpu_time from v$sql order by cpu_time desc) where rownum<=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,executionsfrom (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_textfrom (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_textfrom (select sql_text,buffer_gets,   dense_rank() 
over     (order by buffer_gets desc) buffer_gets_rank   from v$sql)
where buffer_gets_rank<=5;

1,使用Linux系統top命令查出佔用cpu最高的程式

2,在sqlplus中執行如下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

其中&pid 是使用top 檢視系統中程式佔用CPU極高的PID找到SQL語句進行相應的調整優化

3,分析找到的sql語句,如檢視sql執行計劃。

######查詢結果集輸出到一個檔案裡面 
set trimspool on    
set linesize 120    
set pagesize 2000    
set newpage 1    
set heading off    
set term off    
spool d:\slow_info.txt    

select sql_text,executionsfrom (select sql_text,executions,   rank() over    (order by executions desc) exec_rank   
from v$sql)where exec_rank <=5;    
spool off

查出問題的sql會話sid,並進行封殺操作

select sid, serial#, sql_text, executions 
from v$sql join v$session 
on v$sql.sql_id = v$session.sql_id
where cpu_time > 20000;
##########查出問題的SQL執行殺程式操作:執行以下語句殺死
alter system kill session 'sid,serial#';

相關文章