Oracle undo保留時間的幾個相關引數

Demonson發表於2018-08-03

參考文件:
https://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams265.htm#REFRN10225
https://docs.oracle.com/cd/E11882_01/server.112/e40402/initparams264.htm#REFRN10224
MOS 文件 ID 1526122.1
MOS 文件 ID 846079.1

適用版本:10.1.0.5以上
相關引數:

_highthreshold_undoretention,_smu_debug_mode,_undo_autotune,undo_management,undo_retention,undo_tablespace
undo主要功能:
undo segement 回滾段主要工作是為了構造讀一致性,事物回滾,資料庫恢復,閃回查詢

正文:
這裡主要介紹幾個引數的設定
_highthreshold_undoretention —- 單位 秒,預設值 4294967294 。允許undo_retention 設定的最大值,當修改undo_retention的值超過改引數值,相關報錯 ORA-55567,ORA-55568,ORA-55569

_smu_debug_mode —undo除錯引數,通過設定特定值可以啟動特殊作用,如 4, 33445542

_undo_autotune — 預設 true 開啟。自動調整回滾段的保留時間。

undo_retention — 單位 秒,預設900秒,undo段儘可能的保留時間

undo_management —undo段管理方式,預設auto 自動使用undot ablespace 管理。MANUAL 利用 rollback segment管理

undo_tablespace —- 指定undo使用的表空間

SYS@  >select  a.inst_id, a.ksppinm  "Parameter",
  2               b.ksppstvl "Session Value",
             c.ksppstvl "Instance Value"
  4        from x$ksppi a, x$ksppcv b, x$ksppsv c
  5       where a.indx = b.indx and a.indx = c.indx
  6         and a.inst_id=b.inst_id and b.inst_id=c.inst_id
       and a.ksppinm in ('_undo_autotune', '_smu_debug_mode',
  8                           '_highthreshold_undoretention',
                'undo_tablespace','undo_retention','undo_management')
 10  order by 2;

Instance # Parameter                           Session Value             Instance Value
---------- ----------------------------------- ------------------------- -------------------------
         1 _highthreshold_undoretention        4294967294                4294967294
         1 _smu_debug_mode                     0                         0
         1 _undo_autotune                      TRUE                      TRUE
         1 undo_management                     AUTO                      AUTO
         1 undo_retention                      900                       900
         1 undo_tablespace                     UNDOTBS1                  UNDOTBS1

6 rows selected.

實際undo段的保留時間,undo段覆蓋與否,絕大數情況是由表空間的使用情況結合相關引數來決定的。(除非對undo tablespace 設定了retention guarantee 特性,強制保留undo segment達到保留時間值,不然不會覆蓋,哪怕表空間不足也是。隱患太大,不太考慮)

PS:undo段的保留時間只是讓已提交事務的 undo segment 標記為 UNEXPIRED(未過期),我們其實知道不管是UNEXPIRED 還是 EXPIRED 狀態的 undo segment 都是可能會被覆蓋的。只是優先覆蓋EXPIRED ,如果空間不足一樣覆蓋UNEXPIRED

以下情況都是 undo tablespace 是NOGUARANTEE
引數組合情況一:
在預設情況下,及_undo_autotune=true 時候及undo tablespace 的autoextend =yes 自動擴充套件
_smu_debug_mode =0
_undo_autotune =true
undo_retention =900 (這個值可自行修改)

開啟自動調整時實際的保留時間以試圖V$UNDOSTAT中的欄位 TUNED_UNDORETENTION 值為準,且>=undo_retention值

SELECT TO_CHAR(BEGIN_TIME, 'YYYY-MM-DD HH24:MI:SS') BEGIN_TIME,TUNED_UNDORETENTION FROM V$UNDOSTAT;

2018-07-08 01:59:26                1412
2018-07-08 01:49:26                 900
2018-07-08 01:39:26                1413
2018-07-08 01:29:26                 900
2018-07-08 01:19:26                1417
2018-07-08 01:09:26                2021
2018-07-08 00:59:26                1421
2018-07-08 00:49:26                 900
2018-07-08 00:39:26                1422
2018-07-08 00:29:26                 900
2018-07-08 00:19:26                1427
2018-07-08 00:09:26                 900
2018-07-07 23:59:26                1430
2018-07-07 23:49:26                 900
2018-07-07 23:39:26                1432
2018-07-07 23:29:26                 900
2018-07-07 23:19:26                1436

情況二:

相對於情況一,如果只是 undo tablespace 非自動擴充套件
這時oracle根據undo表空間大小與使用情況自動調整最大可能的保留時間,及忽略undo_retention的值

情況三:
undo tablespace 自動擴充套件
_smu_debug_mode = 33445542
_undo_autotune =true
undo_retention =900 (這個值可自行修改)

這時oracle自動調整的
TUNED_UNDORETENTION = (undo_retention值 or 執行時間最長的 SQL 的執行時間)

情況四
undo tablespace 自動擴充套件
_undo_autotune =false
undo_retention =900 (這個值可自行修改)

這時oracle 自動調整關閉
TUNED_UNDORETENTION = undo_retention

情況五:
對於lob 欄位
lob 欄位 undo 不是利用undo tablespace,而是利用自己儲存空間。 例如 BasicFiles lob欄位指定了 retention引數 則繼承 undo_retention引數的值。
lob情況特殊,還有其他一些限制 參考 mos文件846079.1

相關文章