Oracle Database 10g新特性-回滾監視

pxbibm發表於2015-07-29
回滾監視為使用者提供對回滾操作時間的準確評估.

我們還在這地方嗎?還要多長時間?

聽起來熟悉嗎?這些問題可能是您在前往孩子們最喜愛的主題公園的路上,從汽車後座上提出來的,並且經常是不斷地、越來越頻繁地提出來。您不想告訴他們還確切需要多長時間嗎 — 或者更簡單些,您自己知道答案嗎?

 

同樣,在回滾長期執行的事務時,經常會有些使用者不停地詢問相同的問題。這些問題是合理的,因為該事務進行了鎖定,正常的處理經常受到回滾程式的影響。

 

在 Oracle 9i Database 及更低的版本中,您可以執行查詢
SELECT USED_UREC
FROM V$TRANSACTION;
該語句返回由當前事務所使用的重做記錄的數量,而如果重複地執行該語句,將會顯示連續減少的數值,因為回滾程式在其處理過程中會釋放重做記錄。隨後您可以透過對一段間隔進行快照來計算其速率,然後推斷出評估結束時間的結果。

 

雖然在檢視 V$TRANSACTION 中有一個名為 START_TIME 的列,但該列只顯示整個事務的起始時間(也就是在回滾執行之前)。因此,除了推斷,您沒有辦法知道回滾實際上是在什麼時間執行的。

 

事務回滾的擴充套件統計資訊

 

Oracle Database 10g 中,這種操作很簡單。當事務回滾時,事件被記錄在檢視 V$SESSION_LONGOPS 中,該檢視顯示長期執行的事務。用於回滾,如果程式耗時超過六秒,則記錄出現在該檢視中。在回滾執行以後,您可能會隱藏所檢視的監視螢幕並執行以下的查詢:
select time_remaining
from v$session_longops
where sid = <<em>sid of the session doing the rollback>;
既然您意識到這個檢視 V$SESSION_LONGOPS 的重要性,就讓我們來看它必須提供的其他資訊。該檢視在 Oracle Database 10g 的預覽版中提供,但沒有捕獲關於回滾事務的資訊。為了以一種易讀的方式顯示所有的列,我們將使用由 Tom Kyte 在 SQL 語句

 

另一部分重要的新資訊是正在被回滾的 SQL 語句的識別符號。在早先,SQL_ADDRESS 和 SQL_HASH_VALUE 用於獲取正在被回滾的 SQL 語句。新的列 SQL_ID 對應於檢視 V$SQL 的 SQL_ID,如下所示:
SELECT SQL_TEXT
FROM V$SQL
WHERE SQL_ID = <<em>value of SQL_ID from V$SESSION_LONGOPS>;
該查詢返回所回滾的語句,因此提供了額外的校驗以及 SQL 語句的地址和雜湊值。

 

並行例項恢復

 

如果 DML 操作是並行操作,則列 QCSID 顯示並行查詢伺服器會話的 SID。在並行回滾事件中,如例項恢復以及隨後的故障事務恢復期間,經常用到該資訊經常。

 

例如,假設在大型的更新期間,例項異常關閉。當例項啟動時,發生故障的事務被回滾。如果啟用了用於並行恢復的初始化引數值,則回滾並行地而不是序列地發生,如同它發生在常規事務回滾中一樣。下一步的任務是評估回滾程式的完成時間。

 

檢視 V$FAST_START_TRANSACTIONS 顯示為回滾故障事務所產生的事務。類似的檢視 V$FAST_START_SERVERS 顯示對回滾進行處理的並行查詢伺服器的數量。這兩個檢視都在以前的版本中提供,但顯示事務識別符號的新列 XID 使得聯接更方便了。在 Oracle9i Database 以及更低的版本中,您必須透過三列(USN — 重做段號,SLT — 重做段中的儲存區號,SEQ — 序列號)來聯接檢視。其父集顯示在 PARENTUSN、PARENTSLT 和 PARENTSEQ 中。在 Oracle Database 10g 中,您只需將其聯接到 XID 列,其父 XID 由直觀的名稱表示:PXID。

 

最有用的資訊部分來自於 V$FAST_START_TRANSACTIONS 檢視中的列 RCVSERVERS。如果發生並行回滾,則該列中顯示並行查詢伺服器的數量。您可以檢視該列,瞭解啟動了多少並行查詢程式:
select rcvservers from v$fast_start_transactions;
如果輸出是 1,則事務正在由 SMON 程式進行序列回滾 — 顯然這是完成工作的一種不充分的方法。您可以將初始化引數 RECOVERY_PARALLELISM 的值改為除 0 或 1 以外的值,重新啟動例項進行並行回滾。隨後您可以執行 ALTER SYSTEM SET FAST_START_PARALLEL_ROLLBACK = HIGH,按 CPU 數量的 4 倍建立並行伺服器。

 

如果上述查詢的輸出顯示不是 1,則正在進行並行回滾。您可以查詢同一檢視 (V$FAST_START_TRANSACTIONS) 來獲得父事務和子事務(父事務 id — PXID,而子事務 id — XID)。XID 還可用於聯接此檢視與 V$FAST_START_SERVERS,以獲得其他詳細資訊。

 

結論

 

總之,當在 Oracle Database 10g 中回滾長期執行的事務時 — 無論是並行例項恢復會話還是使用者執行的回滾語句 — 您所需做的一切就是檢視檢視 V$SESSION_LONGOPS 並評估還需要多少時間。

 

現在,如果能預測到達主題公園的時間就好了!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12798004/viewspace-1755312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章