UNDO相關問題總結(一)

2021-07-24 02:30:29 字數 3100 閱讀 7163

第乙個主題  介紹undo表空間不足的問題

undo表空間不足的問題,基本可劃分兩類

針對這兩個情況的處理方法如下(僅供參考):

1.通過下面語句查詢當前例項undo空間的使用情況(active、unexpired型別段的佔比)

select b.tablespace_name,

nvl(used_undo,0) "used_undo(m)",

total_undo "total_undo(m)",

trunc(nvl(used_undo,0) / total_undo * 100, 2) || '%' used_pct

from (select nvl(sum(bytes / 1024 / 1024), 0) used_undo, tablespace_name

from dba_undo_extents

where status in ( 'active','unexpired')

group by tablespace_name) a,

(select tablespace_name, sum(bytes / 1024 / 1024) total_undo

from dba_data_files

where tablespace_name in

(select value

from v$spparameter

where name = 'undo_tablespace'

and (sid = (select instance_name from v$instance) or

sid = '*'))

group by tablespace_name) b

where a.tablespace_name (+)= b.tablespace_name

/2.進一步檢視active、unexpired段的具體使用情況

select tablespace_name,status,sum(bytes/1024/1024/1024) gb from dba_undo_extents group by tablespace_name,status;

3.如果是active段使用過高導致undo段無法擴充套件,則可以根據以下方法解決:

a.臨時新增資料檔案到undo表空間,暫緩問題

b.問題暫時緩解以後,需尋找問題的根本原因,分析當前session中undo段的使用情況,通過以下語句查詢:

--檢視系統中會話使用的回滾段 

select r.name rbs,

nvl(s.username, 'none') oracle_user,

s.osuser client_user,

p.username unix_user,

s.sid,

s.serial#,

p.spid unix_pid,

s.machine

,s.program

,s.module,

t.used_ublk * to_number(x.value) / 1024 / 1024 as undo_mb ,

to_char(s.logon_time, 'mm/dd/yy hh24:mi:ss') as login_time,

to_char(sysdate - (s.last_call_et) / 86400, 'mm/dd/yy hh24:mi:ss') as last_txn,

t.start_time transaction_starttime

from v$process      p,

v$rollname    r,

v$session     s,

v$transaction t,

v$parameter x   

where s.taddr = t.addr   

and s.paddr = p.addr   

and r.usn = t.xidusn(+)   

and x.name = 'db_block_size'   

order by undo_mb desc

/c.如果發現某個session大量使用undo,分析session連線資訊和執行的語句(使用者、應用主機,模組等等),最後調整應用

備註:session執行當前執行的可能不會占用undo段,這種情況下,需要查詢session當前事務中歷史執行的所有sql,可以關聯查詢v$open_cursor,v$active_session_history等檢視。

4.如果是unexpired型別的段使用過高,這種情況下,不會出現undo表空間無法擴充套件,oracle會將unexpired型別的段強制使用來確保dml操作得以繼續執行。但是這種情況下oracle需要搜尋最早的expired段,同時需要將expired段進行一些特殊處理,會導致整個操作過程速度下降,在大量併發dml操作下,由於裙帶效應,會導致整個資料庫執行緩慢,活動session數上公升

分析方法:

檢查v$undostat中的unxpblkreucnt: number of unexpired undo blocks reused by transactions,這個數值大於0,說明事務由於需要undo空間而從unexpired undo segment中重用空間的次數

處理方法:

a.臨時新增資料檔案到undo表空間,暫緩問題

b.問題暫時緩解以後,需尋找問題的根本原因,即什麼原因導致unexpired型別段使用過高。可能導致這類問題的原因如下:

undo表空間大小設定不合理

undo_retention引數設定的過期時間過長

undo_retention設定合理,但是由於oracle自動調整的原因,導致

expired型別段過高(通過查詢v$undostat中的tuned_undoretention)。這種情況下考慮禁用自動調整(_undo_autotune引數)

其它oracle bug導致

注意:關於通過切換例項使用的undo表空間方法來解決這類問題,不在此文討論範圍。

至此,兩類導致undo表空間不足的問題介紹完畢;下乙個主題介紹單個session占用過高的undo(但是未導致undo空間不足),導致資料庫效能急劇下降的問題。

UNDO相關問題總結(二)

這一次主題為單個session占用大量undo,導致資料庫效能急劇下降的問題總結。關於 問題現象 問題原因 引申現象 資料庫中出現大量latch undo global data 或者 wait for a undo record 相關的等待,但在當前例項中查詢每個session的undo使用情況時...

UNDO自我理解總結

場景 當在更新資料的時候,發現更新的值寫錯了,這時就需要將已經更新的地方恢復到原始資料。基本概念 在更新的過程中,oracle會將原始的資料都放入到undo裡,這樣當以上情況發生後,就可以從undo中拿到原本的資料了。undo是在oracle 11g被提出的,由undo tablespace進行管理...

CocoaPods相關問題總結

關於pod install 和 pod update 第一次為專案新增依賴或者每一次修改podfile後使用pod install。當你執行pod install,它只會解決那些沒有在podfile.lock檔案中列出來的pods的依賴。對於沒有在podfile.lock中列出的pods,會去匹配p...