程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle 8i中回滾段使用和ORA-1555

Oracle 8i中回滾段使用和ORA-1555

編輯:Oracle數據庫基礎

回滾段中保存的回滾數據有2個作用:一致讀和回滾。回滾段是由連續block組成的區間extent組成.回滾段有順序的循環的使用這些區間。當當前區間寫滿的時候,oracle移向下一個區間. 如一個回滾段有4個區間A,B,C,D;當區間C被寫滿的時候,oracle將寫區間D,而當D寫滿的時候,Oracle將嘗試重新寫區間A.這樣循環的有順序的使用區間。

事務必須將回滾信息寫到回滾段中;事務的當前新產生的回滾信息寫在該回滾段的位置叫做回滾段的head. 而在該回滾段上最早發生的尚未提交的事務最早產生的回滾信息所在位置叫做回滾段的tail. 當前區間寫滿的時候,Oracle移動head到下一個區間.

8i時每個事務只能使用一個回滾段。Oracle會根據回滾段workload,平均將事務分配給各個回滾段。在回滾段使用上的一些規則

1.一個事務只能使用一個回滾段。

2. 多個事務可以共用一個區間。但Active的事務不能共用一個block.

3. 回滾段的current extent寫滿的時候,回滾段的Head不能夠移動到回滾段tail所在的區間。

4. 區間總是被有順序的循環的時候;當head移動的時候,不會跳躍區間;只能移動到下一個區間。

5. 如果head不能夠使用下一個區間(如tail在下一個區間),將會分配一個新的區間extent,並將新區間extent插入到這個循環使用的extent圈中。這叫做回滾段的擴展。

ORA-1555 snapshot too old主要是在一致讀和延遲塊清除delay block cleanout的時候產生;

[參考]一致讀的步驟

1. Read the Data Block.

2. Read the Row Header.

3. Check the Lock Byte to determine whether theres an ITL entry.

4. Read the ITL entry to determine the Transaction ID (Xid).

5. Read the Transaction Table using the Transaction ID. If the transaction has been committed and has a System Commit Number less than the querys System Change Number, update the status of the block (block cleanout) and start over at step 1.

第5步細分

---IF 在Transaction Table 中根據Transaction ID 找到transaction

-----------IF transaction 已經commit

----------------------IF query scn>commit scn

------------------------------------則接受該塊,進行clean out,返回1

------------------------ELSEIF query scn

-------------------------------------則進行一致性讀,從第6步向後執行

------------ELSEIF transaction 沒有commit

------------------------也進行一致性讀,從第6步向後執行

---ELSEIF 在Transaction Table 中沒有找到transaction(undo header中的transaction slot被覆蓋了,也說明事務已經提交,因為只有提交後所在的transaction slot才能被覆蓋。這樣query scn則去比較control scn。在該回滾段上control scn以前的transaction都已經被提交,也就是事務表中所能找到的最小的commit scn了)

------------IF query scn

-----------------------則無法知道query scn和commit scn得大小關系,出現ORA-01555錯誤

------------IF query scn>control scn

-----------------------則query scn肯定>commit scn

------------------------------------則接受該塊,進行clean out,並將block 中ITL標記上“U”,表示“upper bound commit” ,並返回1

6. Read the last undo block (Uba).

7. Compare the block transaction ID with the transaction table transaction ID. If the Transaction ID in the undo block doesnt equal the Transaction ID from the Transaction Table, then issue ORA-1555, Snapshot Too Old. 表示回滾段中回滾信息被覆蓋,無法為一致讀提供必需的before image。

8. If the Transaction IDs are identical, make a copy of the data block in memory. Starting with the head undo entry, apply the changes to the copIEd data block.

9. If the tail undo entry (the actual first undo entry in the chain, or the last in the chain going backwards!) indicates another data block address, read the indicated undo block into memory and repeat steps 7 and 8 until the undo entrIEs dont contain a value for the data block address.

10. When theres no previous data block address, the transaction has been completely undone.

11. If the undo entry contains:

a. a pointer to a previous transaction undo block address, read the Transaction ID in the previous transaction undo block header and read the appropriate Transaction Table entry. Return to step 5.

b. an ITL record, restore the ITL record to the data block. Return to step 4.

出現1555的時候,首先判斷是哪個原因導致,可以設置event;如果因為transaction slot被覆蓋導致,則增加回滾段數目;如果因為回滾信息被覆蓋,則增加回滾大大小。1555錯誤比較復雜,通常需要考慮很多問題。

event = 1555 trace name processstate forever, level 10

That will give you a process state dump for any process that gets an ORA-1555 error. The dump will show you which block the process was trying to rollback to its snapshot SCN. If its a rollback segment header block, then you have your proof. see more from http://www.ixora.com.au/q+a/undo.htm

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved