本文講解了如何找出引起ORA的SQL要解決這個問題首先我們要找出導致這個問題的SQL再進行處理
在alert文件中我們可能會看到這樣的報錯信息
Wed Aug
:
:
ORA
: unable to extend temp segment by
in tablespace DBA_TEMP
要解決這個問題我們首先要導致這個問題的SQL可能方法有幾種
設置events
alter system set events trace name errorstack level ;
這種方法有一定局限
)它不能獲取已發生的的錯誤信息只能對以後出現錯誤時生成一個trace文件;
)用events不清楚會對數據庫有什麼不好的影響
查詢V$SQL視圖
如select * from v$sql order by direct_writes/executions desc;
這種方法的局限性是
)因為很難知道V$SQL視圖中的SQL執行時間難以確認具體是那個SQL導致錯誤的
)引起問題的SQL極有可能已經被age out了
生成錯誤發生時的awrstatspack報表從報表中的SQL ordered by Reads部分找出SQL
這種方法更不可靠因為
) SQL ordered by Reads讀寫的不一定是臨時表空間
) awr/statspack報表是根據物理讀的總量排序的如果導致問題的SQL執行次數少那也是不會出現在這些報表中的
查詢awr相關視圖
對於G來說這種方法是最可行最准確的
SELECT DISTINCT TO_CHAR(SUBSTR(bsql_text))
FROM sysWRH$_SQLTEXT b
WHERE bsql_id IN
(SELECT sql_id
FROM
(SELECT asql_id
FROM sysWRH$_SQLSTAT a
WHERE aparsing_schema_name NOT IN (SYS)
AND aexecutions_total >
AND adirect_writes_total >
AND aSNAP_ID IN
(SELECT SNAP_ID
FROM sysWRM$_SNAPSHOT
WHERE to_date(:: ::yyyy:mm:dd hh:mi:ss) BETWEEN begin_interval_time AND end_interval_time
)
ORDER BY adirect_writes_total/ aexecutions_total DESC
)
WHERE rownum<=
);
基本上結果中的第一句只要不是insert /*+ append */之類的語句那麼它就極有可能是導致ORA的SQL
如果是i用statspack也可以用類似的SQL從statspack視圖查到需要的結果
From:http://tw.wingwit.com/Article/program/SQL/201311/16228.html