在Oracle中如何让SELECT查询绕过UNDO
生活随笔
收集整理的這篇文章主要介紹了
在Oracle中如何让SELECT查询绕过UNDO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
是否有想過如何在Oracle中實現臟讀(dirty read),在Oracle官方文檔或者Asktom的時候顯然會提到Oracle是不實現臟讀的, 總是有undo來提供數據塊的前鏡像(before image)以維護一致性Consistent, 通過正常途徑我們幾乎不可能破壞Oracle中查詢的一致性來實現臟讀。 ? 是否真的無計可施? 非也,非也,Oracle作為一個高度復雜而又可控的RDBMS,仍是有很多空子可以鉆的。 ? 我們先來介紹以下的2個隱藏參數: _offline_rollback_segments or _corrupted_rollback_segments 這2個隱藏參數對于熟悉Oracle數據庫異?;謴突蛘呓鉀QORA-600[4XXX]問題有經驗的同學來說肯定不陌生,因為這2個參數是針對Undo存在Corruption訛誤時忽略問題的有力工具,而大家對這2個參數實際起到的作用有多少認識呢? ? 我們可能在以下幾種場景中用到_offline_rollback_segments 和 _corrupted_rollback_segments 這2個隱藏參數:
- 強制打開數據庫(FORCE OPEN DATABASE)
- 控制一致性讀和延遲塊清除(consistent read & delayed block cleanout)
- 強制刪除某個rollback segment回滾段
- 以上2個參數所列出的Undo Segments(撤銷段/回滾段)將不會被在線使用online
- 在UNDO$數據字典基表中將體現為OFFLINE的記錄
- 在實例instance的生命周期中將不會再給新的事務分配使用
- 參數所列出的Undo Segments列表上的活躍事務active transaction將即不被回滾亦不被標記為dead以便SMON去回滾(了解你所不知道的SMON功能(五):Recover Dead transaction)
- 在實例startup啟動并open database的階段仍將讀取_OFFLINE_ROLLBACK_SEGMENTS所列出的Undo segments(撤銷段/回滾段),若訪問這些undo segments出現了問題則將在alert.log和其他TRACE中體現出來,但不影響實際的startup進程
- 若查詢數據塊發現活躍的事務,并ITL指向對應的undo segments則:
- 若讀取undo segments的transaction table事務表發現事務已提交則做數據塊的清除
- 若讀取發現事務仍活動未commit,則生成一個CR塊拷貝
- 若讀取該undo segments存在問題(可能是corrupted訛誤,可能是missed丟失)則產生一個錯誤并寫出到alert.log,查詢將異常終止
- 若DML更新相關的數據塊會導致服務進程為了恢復活躍事務而進入死循環消耗大量CPU,解決方法是通過可以進行的查詢工作重建相關表
- 在實例啟動startup并open database的階段_CORRUPTED_ROLLBACK_SEGMENTS所列出的undo segments(撤銷段/回滾段)將不會被訪問讀取
- 所有指向這些被_CORRUPTED_ROLLBACK_SEGMENTS列出的undo segments的事務都被認為已經提交了commit,和這個undo segments已經被drop時類似
- 這將導致嚴重的邏輯訛誤
- 如果數據字典上有活躍事務那么將更糟糕,數據字典邏輯訛誤會造成數據庫管理問題
- 如果bootstrap自舉核心對象有活躍事務,那么將無法忽略錯誤ORA-00704: bootstrap process failure錯誤,導致無法強制打開數據庫(見拙作Oracle數據恢復:解決ORA-00600:[4000] ORA-00704: bootstrap process failure錯誤一例)
- 衷心地建議用_CORRUPTED_ROLLBACK_SEGMENTS這個參數打開數據庫后導出數據并重建數據庫,這個參數使用的后遺癥可能很頑固
- Oracle公司內部有叫做TXChecker的工具可以檢查問題事務
總結
以上是生活随笔為你收集整理的在Oracle中如何让SELECT查询绕过UNDO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在.NET中编辑器在用伪静态后不能正常使
- 下一篇: JS浏览本地图片