在Oracle中這種操作很簡單當事務回滾時事件被記錄在視圖 V$SESSION_LONGOPS 中該視圖顯示長期運行的事務用於回滾如果進程耗時超過六秒則記錄出現在該視圖中在回滾執行以後您可能會隱藏所查看的監視屏幕並執行以下的查詢
select time_remaining
from v$session_longops
where sid = ;
既然您意識到這個視圖 V$SESSION_LONGOPS 的重要性就讓我們來看它必須提供的其他信息該視圖在 Oracle數據庫的預覽版中提供但沒有捕獲關於回滾事務的信息為了以一種易讀的方式顯示所有的列我們將使用由 Tom Kyte 在 中所描述的 PRINT_TABLE 函數此過程簡單地以表格方式而不是常用的行方式來顯示列
SQL> set serveroutput on size
SQL> exec print_table(select * from v$session_longops where sid = )
SID :
SERIAL# :
OPNAME:Transaction Rollback
TARGET:
TARGET_DESC :xid:xec
SOFAR :
TOTALWORK :
UNITS :Blocks
START_TIME:dec ::
LAST_UPDATE_TIME :dec ::
TIME_REMAINING:
ELAPSED_SECONDS :
CONTEXT :
MESSAGE :Transaction Rollback:xid:xec :
out of Blocks done
USERNAME SYS
SQL_ADDRESS :BED
SQL_HASH_VALUE:
SQL_ID:wcamyanr
QCSID :
注意此處顯示對行的所有更改即使刪除並重新插入行時也是如此VERSION_OPERATION 列顯示對該行執行的操作 (Insert/Update/Delete)完成這些操作不需要歷史表或額外的列
讓我們仔細檢查這些列中的每一列在會話中可能會有超過多個長期運行操作 — 特別是因為視圖中包含以前的會話中所有長期運行操作的歷史列 OPNAME 顯示該記錄用於事務回滾這為我們指出了正確的方向列 TIME_REMAINING 顯示所評估的剩余時間秒數這在前面已經描述過而列 ELAPSED_SECONDS 顯示到目前為止所消耗的時間
那麼該表如何提供對剩余時間的評估呢?可以在列 TOTALWORK 中找到線索該列顯示要完成的工作總量還有 SOFAR 顯示到目前為止已經完成了多少工作工作的單位顯示在列 UNITS 中在本例中以數據塊為單位;因此到目前為止已經回滾了 個數據塊中共計 個數據塊此操作到目前為止已消耗了秒因此剩余數據塊將消耗
* ( / () ) ; 秒
但您不必利用這種方法來獲得該數值它已經清楚地顯示出來了最後列 LAST_UPDATE_TIME 顯示有關當前視圖內容的時間這將用於加強您對結果的解釋
回滾段的問題及解決方法
問題一事務要求的回滾段空間不夠表現為表空間用滿回滾段擴展到達參數MAXEXTENTS的值
解決方法向回滾段表空間添加文件或使已有的文件變大;增加MAXEXTENTS的值
問題二讀一致性錯誤(ORA SNAPSHOT TOO OLD)
解決方法增加MINEXTENTS的值增加區的大小設置一個高的OPTIMAL值
SQL 語句
另一部分重要的新信息是正在被回滾的 SQL 語句的標識符在早先SQL_ADDRESS 和 SQL_HASH_VALUE 用於獲取正在被回滾的 SQL 語句新的列 SQL_ID 對應於視圖 V$SQL 的 SQL_ID如下所示
SELECT SQL_TEXT
FROM V$SQL
WHERE SQL_ID = ;
該查詢返回所回滾的語句因此提供了額外的校驗以及 SQL 語句的地址和散列值
並行實例恢復
如果 DML 操作是並行操作則列 QCSID 顯示並行查詢服務器會話的 SID在並行回滾事件中如實例恢復以及隨後的故障事務恢復期間經常用到該信息經常
例如假設在大型的更新期間實例異常關閉當實例啟動時發生故障的事務被回滾如果啟用了用於並行恢復的初始化參數值則回滾並行地而不是串行地發生如同它發生在常規事務回滾中一樣下一步的任務是評估回滾進程的完成時間
視圖 V$FAST_START_TRANSACTIONS 顯示為回滾故障事務所產生的事務類似的視圖 V$FAST_START_SERVERS 顯示對回滾進行處理的並行查詢服務器的數量這兩個視圖都在以前的版本中提供但顯示事務標識符的新列 XID 使得聯接更方便了在 Oracle數據庫中您只需將其聯接到 XID 列其父 XID 由直觀的名稱表示PXID
最有用的信息部分來自於 V$FAST_START_TRANSACTIONS 視圖中的列 RCVSERVERS如果發生並行回滾則該列中顯示並行查詢服務器的數量您可以查看該列了解啟動了多少並行查詢進程
select rcvservers from v$fast_start_transactions;
如果輸出是 則事務正在由 SMON 進程進行串行回滾 — 顯然這是完成工作的一種不充分的方法您可以將初始化參數 RECOVERY_PARALLELISM 的值改為除 或 以外的值重新啟動實例進行並行回滾隨後您可以執行 ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH按 CPU 數量的 倍創建並行服務器
如果上述查詢的輸出顯示不是 則正在進行並行回滾您可以查詢同一視圖 (V$FAST_START_TRANSACTIONS) 來獲得父事務和子事務(父事務 id — PXID而子事務 id — XID)XID 還可用於聯接此視圖與 V$FAST_START_SERVERS以獲得其他詳細信息
結論
總之當在 Oracle數據庫中回滾長期運行的事務時 — 無論是並行實例恢復會話還是用戶執行的回滾語句 — 您所需做的一切就是查看視圖 V$SESSION_LONGOPS 並評估還需要多少時間
From:http://tw.wingwit.com/Article/program/Oracle/201311/16786.html