在回滾長期運行的事務時經常會有些用戶不停地詢問相同的問題這些問題是合理的因為該事務進行了鎖定正常的處理經常受到回滾進程的影響
在 Oracle i Database 及更低的版本中您可以執行查詢
SELECT USED_UREC
FROM V$TRANSACTION
該語句返回由當前事務所使用的重做記錄的數量而如果重復地執行該語句將會顯示連續減少的數值因為回滾進程在其處理過程中會釋放重做記錄隨後您可以通過對一段間隔進行快照來計算其速率然後推斷出評估結束時間的結果
雖然在視圖 V$TRANSACTION 中有一個名為 START_TIME 的列但該列只顯示整個事務的起始時間(也就是在回滾執行之前)因此除了推斷您沒有辦法知道回滾實際上是在什麼時間執行的
事務回滾的擴展統計信息
在 Oracle Database g 中這種操作很簡單當事務回滾時事件被記錄在視圖 V$SESSION_LONGOPS 中該視圖顯示長期運行的事務用於回滾如果進程耗時超過六秒則記錄出現在該視圖中在回滾執行以後您可能會隱藏所查看的監視屏幕並執行以下的查詢
select time_remaining
from v$session_longops
where sid = <sid of the session doing the rollback>
既然您意識到這個視圖 V$SESSION_LONGOPS 的重要性就讓我們來看它必須提供的其他信息該視圖在 Oracle Database g 的預覽版中提供但沒有捕獲關於回滾事務的信息為了以一種易讀的方式顯示所有的列我們將使用由 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 顯示有關當前視圖內容的時間這將用於加強您對結果的解釋
SQL語句
另一部分重要的新信息是正在被回滾的 SQL 語句的標識符在早先SQL_ADDRESS 和 SQL_HASH_VALUE 用於獲取正在被回滾的 SQL 語句新的列 SQL_ID 對應於視圖 V$SQL 的 SQL_ID如下所示
SELECT SQL_TEXT
FROM V$SQL
WHERE SQL_ID = <value of SQL_ID from V$SESSION_LONGOPS>;
該查詢返回所回滾的語句因此提供了額外的校驗以及 SQL 語句的地址和散列值
並行實例恢復
如果 DML 操作是並行操作則列 QCSID 顯示並行查詢服務器會話的 SID在並行回滾事件中如實例恢復以及隨後的故障事務恢復期間經常用到該信息經常
例如假設在大型的更新期間實例異常關閉當實例啟動時發生故障的事務被回滾如果啟用了用於並行恢復的初始化參數值則回滾並行地而不是串行地發生如同它發生在常規事務回滾中一樣下一步的任務是評估回滾進程的完成時間
視圖 V$FAST_START_TRANSACTIONS 顯示為回滾故障事務所產生的事務類似的視圖 V$FAST_START_SERVERS 顯示對回滾進行處理的並行查詢服務器的數量這兩個視圖都在以前的版本中提供但顯示事務標識符的新列 XID 使得聯接更方便了在 Oraclei Database 以及更低的版本中您必須通過三列(USN — 重做段號SLT — 重做段中的存儲區號SEQ — 序列號)來聯接視圖其父集顯示在 PARENTUSNPARENTSLT 和 PARENTSEQ 中在 Oracle Database g 中您只需將其聯接到 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 Database g 中回滾長期運行的事務時 — 無論是並行實例恢復會話還是用戶執行的回滾語句 — 您所需做的一切就是查看視圖 V$SESSION_LONGOPS 並評估還需要多少時間
From:http://tw.wingwit.com/Article/program/Oracle/201311/18740.html