第十三章:UNDO段



1、UNDO

         UNDO 段是用於存儲還原數據的特殊段,在發生實例故障的時候,UNDO 段用來對數 據進行恢復。本章內容包括介紹 UNDO 段的工做原理,並進行自動和手工的 UNDO 段的管理數據庫



1.1 UNDO 段的做用

      RDBMS(關係數據庫管理系統)必需要提供一致性的數據,以確保不會丟失數據或致使數據混亂。例如,當用戶去銀行取款時,須要在用戶儲蓄帳戶上減去取款額,而在銀行支出帳戶上增長取款額,以使得收支平衡。當使用關係數據庫處理以上過程時,儲蓄帳戶、支出帳戶分別對應於數據庫表。當用戶提款時,分別會在儲戶表、支出帳戶表上使用 UPDATE 語句執行增減款操做,最終提交事務,以確保收支平衡。服務器

        你們設想一下,假設當在儲蓄帳戶上減去取款額以後,由於機器斷電致使數據庫中止工做,怎麼辦?你可能會想這會致使收支不平衡,不會的,關係數據庫經過事務(Transaction)實現了數據一致性。由於斷電時事務還沒有完成,因此未來在啓動數據庫時系統會自動回退未提交操做,並最終保證數據的一致性。從數據庫的角度看,若是儲蓄帳戶執行了 UPDATE 操做後出現斷電,那麼當從新啓動數據庫時系統會自動執行還原操做,將修改的數據恢復成原有數據。此時你們可能會問,那麼原有數據存放在哪兒呢?當執行 INSERT、UPDATAE、 DELETE 等 DML 操做時,服務器進程會將原有數據(稱爲 UNDO 數據)存放到 UNDO 段中,UNDO 段是專門用於存儲還原數據的段。併發

image

         UNDO 數據也被稱爲回滾(ROLLBACK)數據,它用於確保數據的一致性。當執行 DML 操做(INSERT、UPDATE、DELETE 等)時,操做前的數據被稱爲 UNDO 記錄。例如,當執行「UPDATE emp SETsal=1000WHERE empno=7788」語句時,假定僱員 7788 原有工資爲 800,原有數據 800 就是 UNDO 數據,而且該數據會被存放到還原段中,而新數據 1000 則會存放到 EMP 數據段中。還原段用於在進程更改數據庫中的數據時保存數據的舊值(可能還原的數據)。它按數據被修改以前的原樣存儲數據的位置及數據自己(如圖 9-1 所示)。許多併發事務處理能夠寫入一個 UNDO 段。oracle

    UNDO 段有以下幾個用途,如圖 9-2 所示。app

    1)事務處理回退

       當某事務處理修改表中某行時,被修改的列的舊值(要還原的數據)將存儲在 UNDO 段中,新數據被存入到數據段中。若是將該事務處理回退,即執行 ROLLBACK 命令,則 Oracle 服務器經過將還原段中的值寫回到該行來恢復原始值。例如用戶 A 在執行了語句「UPDATE emp SET sal=1000 WHERE empno=7733」後發現應該修改 7868 號僱員的工資而丌是 7733 號僱員的工資,那麼經過執行「ROLLBACK」語句能夠取消事務,此時系統將回滾段中的 UNDO 數據 800 從 UNDO 段中又寫回數據段中。性能

   2)事務處理恢復

        事務恢復是由 ORACLE SERVER 自動完成的。若是實例在事務處理正在進行時失敗(INSTANCEFAILURE) ,那麼 Oracle 服務器須要在數據庫再次打開時回退全部未提交的事務。這種回退操做是事務處理恢復的一部分。之因此有可能恢復事務處理,緣由在於對還原段所作的更改一樣受重作日誌文件的保護。spa

image


3)讀一致性

        當用戶檢索數據庫數據時,Oracle 老是使提用戶只能看到被提交過的數據(讀取提交)或者特定時間點的數據(SELECT 語句時間點),這樣能夠確保數據的一致性。讀一致性是由 ORALCE 提供的,而且該特徵是經過 UNDO 記錄來實現有。還原段中的舊值(要回退的數據)用於保證數據的讀一致性。Oracle 服務器保證一條語句所看到的數據來自一致的時間,即便其它事務處理修改了該數據。例如,當 Oracle 服務器開始執行 SELECT 語句時,首先肯定當前系統更改號(SCN),並確保這個 SCN以前未提交的任何修改不會被這條語句處理。若是在此次查詢開始時某行有未提交的數據更改,Oracle 服務器會從還原段檢索這些更改的舊值,並顯示該舊值,如:3d

圖 9-3 所示:日誌

image






1.2 自動 UNDO 空間管理

          在 Oracle9i 之前,管理 UNDO 數據須要 DBA 創建專門的還原段,但這種方法至關複雜;爲了簡化UNDO 數據的管理,從 Oracle9i 開始,管理 UNDO 數據有兩種方法,一種是自動管理模式,經過 UNDO 表空間能夠自動管理 UNDO 數據,另一種是手工管理方式,即便用 UNDO 段管理 UNDO 數據。顧名思義,UNDO 表空間是指之門存放 UNDO 數據的表空間,而且只能存放回滾段而不能存放其它的數據段。當使用UNDO 表空間時,Oracle 會自動在該表空間上創建還原段,以供事務操做使用。UNDO 表空間上的還原段,按照這樣的方式命名:_SYSSMUn$,好比:_SYSSMU10$、_SYSSMU11$ 等。code

     若是使用自動管理模式,則必需要將初始化參數 UNDO_MANAGEMENT 設置爲 AUTO。這樣,當啓動Oracle 服務器以後,Oracle 會使用 UNDO 表空間自動管理 UNDO 數據,而且 Oracle 自動選擇第一個可用 的 UNDO 表 空 間 存放 UNDO 數 據 。 在 有多 個 UNDO 表 空 間 時, 可 以 通 過 設 置 初 始 化 參數UNDO_TABLESPACE 選擇使用的 UNDO 表空間。可是若是沒有 UNDO 表空間可用,則 Oracle 會使用SYSTEM 還原段存放 UNDO 記錄。



1.2.1 UNDO 空間管理參數

        


自動管理模式相關的初始化參數和意義以下。

       1)UNDO_MANAGEMENT

       該參數用於指定數據庫 UNDO 數據的管理模式。該參數能夠設置爲 AUTOMANUAL 這兩個值中的任一個值,而且必須在初始化參數文件中設置。UNDO_MANAGEMENT 不能在數據庫啓動後進行動態更改。

  •       AUTO 模式能夠將數據庫設置爲自動還原管理,並須要 UNDO 表空間。
  •      在 MANUAL 模式(缺省值)下,能夠根據須要在數據庫中建立和管理還原段,這不之前的 Oracle 服務器版本中的操做相同。若是數據庫中叧有一個 UNDO 表空間,而且將 UNDO_MANAGEMENT 設置爲 AUTO,則 UNDO_TABLESPACE 參數是可選的;Oracle 服務器將自勱選擇 UNDO 表空間的。

  2)UNDO_TABLESPACE

        該參數用於指定在自動管理模式下要使用的 UNDO 表空間。此參數能夠在初始化文件中設置,或使用ALTER SYSTEM 命令來勱態改變。語句以下: ALTER SYSTEM SET UNDO_tablespace=UNDOTBS;

3)UNDO_SUPPRESS_ERRORS

    使用 UNDO_SUPPRESS_ERRORS,用戶能夠避免在自動還原管理模式下執行手勱還原管理模式操做(例如,ALTERROLLBACK SEGMENTONLINE)時出現錯誤。經過設置這個參數,用戶能夠在將全部應用程序和腳本 轉 換 成 自 動 還 原 管 理 模 式 前 使 用 還 原 表 空 間 功 能 。 例 如 , 如 果 有 一 個 使 用 SETTRANSACTION  USEROLLBACK SEGMENT 語句 的 應用 程 序,則 可 以 向該 應用 程 序添 加 語 句 ALTER SESSION SET
UNDO_SUPPRESS_ERRORS=true 以免 ORA-30019 錯誤。ORA-30019:在自動還原模式下執行了非法的回退段。

4)UNDO_RETENTION

     該參數用於指定保留 UNDO 數據的時間,以便提供讀一致性,默認值爲 900s。若是執行查詢的時間很長,盡 可 能 保 留 更 多 的 還 原 數 據 , 但 是 需 要 UNDO 表 空 間 的 數 據 文 件 也 越 大 。 以 秒 爲 單 位 定 義 的UNDO_RETENTION 參數能夠在初始化文件中設置,或使用 ALTER SYSTEM 命令來動態態修改。

  本地撤消模式

     本地撤消模式意味着每一個容器都有本身的撤銷表空間。在此模式下,Oracle 數據庫會自動爲 CDB 中的每一個容器建立一個撤消表空間。對於 Oracle RAC CDB,在本地撤消模式下,每一個 PDB 的每一個實例都有一個活動的撤消表空間。

   本地撤消模式爲每一個容器提供了更高的隔離,並提升了某些操做的效率,例如拔出容器或在容器上執行時間點恢復。此外,須要支持某些操做的本地撤消模式,例如從新定位 PDB 或克隆處於開放讀/寫模式的 PDB。當 CDB 處於本地撤消模式時,如下狀況適用:

  •  對當前容器具備適當權限的任何用戶均可覺得容器建立撤消表空間。有關所需權限的信息,請參見 Oracle 數據庫 SQL 語言參考。
  •     撤消表空間在靜態數據字典視圖和 CDB 中每一個容器中的動態性能(V $)視圖中均可


共享撤消模式

       共享撤消模式意味着單實例 CDB 有一個活動的撤消表空間。對於 Oracle RAC CDB,每一個實例都有一個活動的撤消表空間。

當 CDB 處於共享撤消模式時,如下狀況適用:

  •     只有具備相應權限且當前容器爲 CDB 根的普通用戶才能建立撤消表空間。
  •    當前容器不是 CDB 根時,嘗試建立撤消表空間失敗並返回錯誤。
  •   當前容器是 CDB 根時,撤消表空間在靜態數據字典視圖和動態性能(V $)視圖中可見。當前容器是 PDB,應用程序根目錄或應用程序 PDB 時,撤消表空間僅在動態性能視圖中可見。
· SELECT PROPERTY_NAME, PROPERTY_VALUE
· FROM DATABASE_PROPERTIES
· WHERE PROPERTY_NAME = 'LOCAL_UNDO_ENABLED';






1.2.2UNDO 空間管理


一、建立 undo 表空間:

CREATE UNDO TABLESPACE undotbs_02
 DATAFILE '/u01/app/oracle/undo0201.dbf' SIZE 2M REUSE AUTOEXTEND ON;

二、alter undo tablespace

ALTER TABLESPACE undotbs_01
 ADD DATAFILE '/u01/oracle/oracle/undo0201.dbf ' AUTOEXTEND ON NEXT 1M   MAXSIZE UNLIMITED;

三、switch undo tablespace

ALTER SYSTEM SET UNDO_TABLESPACE = undotbs_01;

四、drop undo tablespace

DROP TABLESPACE undotbs_01;




1.2.3 管理臨時 undo


        臨時撤消記錄存在數據庫的臨時表空間中,所以不會記錄在重作日誌中。啓用臨時撤消後,臨時表空間使用的某些段會存儲臨時撤消,這些段稱爲臨時撤消段。啓用臨時撤消後,可能須要增長臨時表空間的大小以考慮撤消記錄。

    啓用臨時撤消可帶來如下好處:

  •      臨時撤消能夠減小撤消表空間中存儲的撤消量。撤消表空間中的較少撤消可讓撤消保留期的記錄的到達更實際的要求。
  • 臨時撤消會減少重作日誌的大小。性能獲得改善,由於重作日誌中寫入的數據較少,而解析重作日誌記錄的組件(如 LogMiner)性能更好,由於要解析的重作數據較少。
  • 臨時撤消使用 Oracle Active Data Guard 選項對物理備用數據庫中的臨時表啓用數據操做語言(DML) 操做。可是,必須在主數據庫上發出建立臨時表的數據定義語言(DDL)操做。

        您能夠爲特定會話或整個系統啓用臨時撤消。使用 ALTER SESSION 語句爲會話啓用臨時撤消時,會話會建立臨時撤消,而不會影響其餘會話。使用 ALTER SYSTEM 語句爲系統啓用臨時撤消時,全部現有會話和新會話都會建立臨時撤消。當會話第一次使用臨時對象時,TEMP_UNDO_ENABLED 將爲會話的其他部分設置初始化參數的當前值。所以,若是爲會話啓用了臨時撤消,而且會話使用臨時對象,則沒法爲會話禁用臨時撤消。一樣,若是爲會話禁用臨時撤消而且會話使用臨時對象,則沒法爲會話啓用臨時撤銷。

注意:僅當數據庫的兼容級別爲 12.0.0 或更高時,才能啓用臨時撤消。

  • 要爲會話啓用臨時撤消,請運行如下 SQL 語
    ALTER SESSION SET TEMPUNDOENABLED = true;
  • 要禁用會話的臨時撤消,請運行如下 SQL 語句:
    ALTER SESSION SET TEMP_UNDO_ENABLED = FALSE;
  • 要爲系統啓用臨時撤消,請運行如下 SQL 語句:
    ALTER SYSTEM SET TEMP_UNDO_ENABLED = TRUE;

爲系統啓用臨時撤消後,會話可使用該 ALTER SESSION 語句禁用臨時撤

  • 要禁用系統的臨時撤消,請運行如下 SQL 語句:
ALTER SYSTEM SET TEMP_UNDO_ENABLED = FALSE;





1.2.4 相關視圖:


image

image























==============================================================

相關文章
相關標籤/搜索