- OCA/OCP認證考試指南全冊(第3版) Oracle Database 12c(1Z0-061,1Z0-062,1Z0-063) (計算機與信息)
- (美)John Watson等
- 1012字
- 2021-03-26 13:10:22
6.3 DML和撤消數據的生成
撤消數據是反轉DML語句結果所需的信息。撤消數據通常被稱為“回滾數據”,不過最好不要使用這種稱呼。在過去的Oracle版本中,術語“回滾數據”與“撤消數據”可以交替使用,但是從9i版本開始,這兩個術語就有所不同:它們的功能相同,但管理方式不同。回滾段的舊機制已過時很久了,所有數據庫應使用自動撤消管理,它使用撤消段來存儲撤消數據。
回滾某個事務意味著使用撤消段中的數據來構造一個與事務發生前相同的數據映像。為了滿足ACID測試的要求,回滾通常是自動完成的,但是,通過給出查詢過去某一時刻數據庫的選項,閃回查詢性能利用了撤消機制的功能。當然,任何用戶都可以交互地使用ROLLBACK命令回滾已經執行但尚未提交的任何DML語句。
ACID測試提出了如下要求:首先,不論是在發生錯誤時自動進行回滾還是根據需要使用ROLLBACK命令進行回滾,Oracle都應當為反轉未結束的事務而保留原有數據。這種回滾是持久的,并且對所有用戶公開。其次,針對一致性要求,Oracle數據庫必須能夠提供一個查詢,這個查詢的結果與該查詢開始時的數據庫保持一致。此時,如果待查詢數據塊在該查詢開始后發生了變化,那么運行這個查詢的服務器進程會進入撤消段并構造這些數據塊的“讀一致”映像。這種回滾是臨時的,并且只對于運行這個查詢的會話是可視的。第三,撤消段也用于事務的隔離性,這可能是撤消數據最復雜的用法。隔離性原則要求任何事務都不能以某種方式依賴于其他未結束的事務。事實上,即使某個多用戶數據庫具有許多同時進行的事務,最終結果也必須像依次執行這些事務一樣。使用撤消數據以及記錄與表鎖定能夠保證事務的隔離性,也就是說不可能存在不兼容的事務。即使并發運行若干事務,隔離性也會要求最終結果必須像連續執行這些事務一樣。
考點:
撤消段的使用與回滾段的使用相矛盾:根據UNDO_MANAGEMENT參數的不同設置,Oracle數據庫要么使用撤消段,要么使用回滾段。
練習6-5 監控和管理撤消數據
本練習將研究數據庫中的撤消配置和使用。可以使用SQL*Plus或SQL Developer。
(1) 以用戶SYSTEM的身份連接到數據庫。
(2) 使用如下查詢,確定數據庫正在使用撤消段還是回滾段:
select value from v$parameter where name='undo_management';
這將返回值AUTO。否則,請發出此命令,然后重新啟動實例:
alter system set undo_management=auto scope =spfile
(3) 使用下面兩個查詢,確定已經創建的撤消表空間,以及正在使用哪一個:
select tablespace_name from dba_tablespaces where contents='UNDO'; select value from v$parameter where name='undo_tablespace';
(4) 確定數據庫中使用的撤消段及其大小:
select tablespace_name, segment_name, segment_id, status from dba_rollback_segs; select usn, rssize from v$rollstat;
注意,段的標識號在兩個視圖中具有不同的列名。
(5) 查看近來數據庫中生成的撤消數據量:
alter session set nls_date_format='dd-mm-yy hh24:mi:ss'; select begin_time, end_time, (undoblks * (select value from v$parameter where name='db_block_size')) undo_bytes from v$undostat;
6.4 監視和管理撤消數據
撤消段的一個主要特性是其被自動管理,不過,我們必須對Oracle管理撤消段進行某些限制。考慮到數據庫中活動的種類與數量,我們需要設置某些實例參數,并針對特定目標調整撤消表空間的大小。
6.4.1 與撤消相關的錯誤條件
管理撤消的原則十分簡單:首先,應當始終存在允許所有事務繼續進行的足夠撤消空間;其次,應當始終存在保證查詢成功的足夠撤消數據。第一個原則要求撤消表空間大到足以應付撤消需求的最壞情況。我們應當為最壞情況(事務工作負荷所生成的有效撤消數據的最大使用)分配足夠的空間。需要注意的是,最壞情況不一定出現在最大并發事務期間。在存在許多小事務的正常運行期間,且這些事務生成的撤消數據總量少于一個月末批量作業所生成的數據時,也可能出現最壞情況。第二個原則要求在撤消表空間內存在額外空間,這些空間能夠存儲讀一致性可能需要的未過期撤消數據。
如果某個事務耗盡了撤消空間,那么這個事務就會由于Oracle錯誤“ORA-30036 unable to extend segment in undo tablespace”而失敗。導致這個問題的語句會被回滾,但是指定事務的剩余部分會保持不變并不被提交。在撤消表空間內為撤消段分配空間的算法表明:當且僅當撤消表空間被活動撤消數據完全填滿時才會引發這個錯誤條件。
考點:
如果DML語句用盡了撤消空間,則將回滾其已成功的部分。事務的其余部分保持完好,且不提交。
如果查詢遇到自從查詢啟動以來更改過的塊,它將訪問撤消段來查找數據的舊版本。在訪問撤消段時,如果所查找的撤消數據已被重寫,則針對一致性讀取的查詢將失敗,并出現廣為人知的Oracle錯誤ORA-1555:“snapshot too old”。
如果對于事務量和查詢長度而言,撤消表空間不夠大,則Oracle將進行選擇:使事務成功而讓查詢失敗,出現ORA-1555錯誤;或者使查詢成功,而讓事務失敗,出現ORA-30036錯誤。默認行為是使事務成功,允許它們重寫未過期的撤消。
6.4.2 用于撤消管理的參數
有四個初始化參數可以控制撤消:
● UNDO_MANAGEMENT
● UNDO_TABLESPACE
● UNDO_ RETENTION(參見“配置撤消數據的保留時間”)
● TEMP_UNDO_ENABLED(參見“臨時撤消數據”)
UNDO_MANAGEMENT參數默認為AUTO,也可以將其設置為MANUAL。也就是說, Oracle根本不會使用撤消段。這樣做是為了實現向后兼容性,如果應用該設置,那么必須完成大量創建和調整回滾段的工作。因此,不要這樣做。Oracle 強烈建議將該參數設置為AUTO,從而啟用撤消段的使用。UNDO_MANAGEMENT參數是靜態的,這意味著如果該參數發生變化,那么變化只有在重新啟動實例之后才會生效。另外兩個參數是動態的,它們可以在實例運行的同時被修改。
如果使用“UNDO_MANAGEMENT=AUTO”,那么必須指定UNDO_TABLESPACE參數。這個參數指定了一個作為撤消表空間(活動撤消表空間)創建的表空間,同時其內部的所有撤消段都會被自動聯機(即供使用)。
6.4.3 調整與監視撤消表空間
撤消表空間應當足夠大,這樣才能存儲最壞情況下并發事務生成的所有撤消數據,這些數據是活動的撤消數據以及運行時間最長的查詢所需的足夠的未過期撤消數據。在更高級的環境中,最好還應當添加允許閃回查詢的空間。這個算法十分簡單:首先計算在最高工作負荷時生成撤消的速度,然后再乘以耗時最長的查詢的時間長度。查詢V$UNDOSTAT視圖可以得到需要知道的所有信息。
雖然撤消數據文件的可自動擴展功能能夠確保事務永遠不會耗盡所有空間,但是Oracle不會僅僅為了實現UNDO_RETENTION目的而對這些數據文件進行擴展,因此查詢仍可能失敗,并給出“snapshot too old”錯誤。無論如何,我們都不應依賴自動擴展性能,撤消表空間在最開始時就應當具有正確的大小。
圖6-5使用SQL *Plus顯示了撤消配置和用法。這些信息也可以在Database Express以圖形格式獲得。要想進入該界面,可以在數據庫主頁上,選擇Storage 下拉菜單中的Undo Management鏈接。

圖6-5 撤消配置和活動
圖中的第一條語句把會話的日期顯示格式設置為顯示小時、分鐘和秒數。接著SQL *Plus SHOW命令顯示4個實例參數的設置,這些參數的名稱都包含字符串undo。這4個參數都設置為其默認值:禁用臨時撤消,撤消管理為自動(使用撤消段,而不是過時的回滾段),保留目標是900秒,撤消表空間是UNDOTBS1,它是在使用DBCA創建數據庫時創建的表空間。對V$UNDOSTAT視圖的查詢顯示在10分鐘的時間內捕獲的撤消活動。在所顯示的半小時內,撤消生成的峰值是一個10分鐘時間段內捕獲281 117塊,生成了908個事務。最長的查詢是1393秒。最后,查詢DBA_DATA_FILES顯示,撤消表空間的數據文件是540 800塊,大約4GB,這假定數據庫使用默認的塊尺寸8KB來創建。
進行一些簡單的算術計算,說明生成撤消的峰值速率為約500塊/秒,所以如果最長的查詢約1000秒(比較接近UNDO_RETENTION設置),就需要約500 000塊的撤消表空間,才能確保撤消總是可以保留與最長查詢相同的時間。這個數據庫的撤消配置能很好地匹配工作負載。
V$UNDOSTAT視圖總是稱為撤消顧問,因為它允許為給定的工作負載預測撤消數據可以保留的時長。Database Express很好地表達了這個信息,如圖6-6所示。

圖6-6 Database Express中的撤消配置
撤消顧問窗口中的曲線表示,如果撤消表空間是5GB,就能把撤消數據存儲1500~4000秒(根據活動的情況)。較大或較小的尺寸會增加或減少撤消數據的保留時間。
6.4.4 臨時撤消
臨時撤消段用于存儲在全局臨時表上執行DML所生成的撤消數據。全局臨時表的定義可以對所有會話(全局)可見,但其中的行是插入它們的會話所私有的。行的保留時間是到執行COMMIT為止,或者會話中斷為止(臨時)。
全局臨時表常常對開發人員有用。它們提供了一個存儲位置,可存儲對中間結果集有用的數據,而無須考慮在不再需要這些數據時清理它們的問題,也無須確保會話不干擾(甚至查看)其他會話創建的數據。從數據庫的角度看,全局臨時表很容易管理。在創建(和刪除)段時,它們自動存在于一個臨時的表空間中。
臨時表的性能通常優于永久表,原因有兩個:
● I/O是直接的。會話讀寫其臨時段時,無需通過緩沖區緩存,也不涉及數據庫寫入器。
● 在全局臨時表上不生成重做數據。沒有必要生成重做數據。重做的目的是使修改變成永久的數據,而全局臨時表不存儲永久數據。
撤消數據由DML在臨時表上執行時生成。這是必須的,因為要應用通常的事務規則。它在生成重做數據之后完成,因為即使表可能是一個臨時段,撤消段也不是。在早期的版本中,這會帶來兩個問題:
● 性能下降,因為撤消段輸入/輸出(I/O)通過緩沖區緩存進行,會生成相關聯的重做數據。
● 不可能在只讀數據庫中對臨時表執行事務;該表不可能存在于讀寫表空間中,但撤消段可能。
版本12c有一個功能,允許在臨時表空間中創建臨時撤消段。這可以顯著提高在臨時表上執行事務的性能,且不破壞事務的完整性,這還意味著,事務可以在只讀數據庫上執行,例如Data Guard物理備用數據庫。
6.4.5 創建和管理撤消表空間
就數據文件管理而言,撤消表空間與其他任何表空間沒有差別:它可以添加文件,調整文件大小,使文件聯機和脫機,也可以移動或重命名文件。但無法指定任何有關存儲的選項:無法指定自動段空間管理,無法指定統一的區間大小。要創建撤消表空間,需要使用關鍵字UNDO:
CREATE UNDO TABLESPACE tablespace_name DATAFILE datafile_name SIZE size [ M | G | T ] [ RETENTION NOGUARANTEE | GUARANTEE ] ;
默認方式下,此表空間并不確保撤消保留。可以在創建表空間時指定該特性,也可以在后期設置:
ALTER TABLESPACE tablespace_name retention [ GUARANTEE | NOGUARANTEE ] ;
考點:
如果創建時不在 datafile 子句中指定自動擴展特性,那么,不會將撤消表空間的數據文件設置為自動擴展。但是,如果使用DBCA(Database Configuration Assistant)創建了數據庫,則將啟用撤消表空間的自動擴展(使用無限制的最大大小)特性。與任何數據文件一樣,可以隨時啟用或禁用自動擴展。
除了自動創建的撤消段之外,無法在撤消表空間中創建段。開始時,將有一個在撤消表空間中創建的10個撤消段組成的池。如果并發事務數超過10個,將創建更多的段。Oracle將監視并發事務率,并且根據需要調整段數。
一般而言,無論數據庫中有多少個撤消表空間,每次都僅使用一個。此表空間中的撤消段將處于“聯機”狀態(表示可供使用),而其他任何表空間中的段將處于“脫機”狀態,表示不使用它們。如果更改了撤消表空間,那么,舊撤消表空間中的所有撤消段將脫機,而新撤消表空間中的所有撤消段將聯機。以下兩種情況除外:
● 在RAC(Real Application Cluster)數據庫中,打開數據庫的每個實例都必須有自己的撤消表空間。可以針對每個實例將UNDO_TABLESPACE參數設置為不同值來加以控制。每個實例都使相應的撤消段聯機。
● 如果通過更改UNDO_TABLESPACE參數來更改撤消表空間,那么,在事務完成前,任何以前指定的在更改時支持事務的表空間中的段一直處于聯機狀態。
練習6-6 使用撤消表空間
本練習要創建一個撤消表空間,并使用它。下面是要執行的步驟:
(1) 以SYSTEM的用戶身份用SQL *Plus連接實例。
(2) 創建一個撤消表空間:
create undo tablespace undo2 datafile 'a_path_and_filename'
size 100m;
對于數據文件的路徑和名稱,可使用適合自己環境的任何值。
(3) 運行如下查詢,為數據庫中的每個表空間返回一行:
select tablespace_name, contents, retention from dba_tablespaces
注意新的表空間有內容UNDO,表示它只能用于撤消段,保留時長是NOGUARANTEE。
(4) 運行如下查詢,為數據庫中的每個回滾或撤消段返回一行:
select tablespace_name, segment_name, status from dba_rollback_segs;
注意在新的撤消表空間中會自動創建10個撤消段,但它們都是脫機的。
(5) 調整實例,以使用新的撤消表空間。使用SCOPE子句確保該修改不是永久的:
alter system set undo_tablespace=undo2 scope=memory
(6) 重新運行第4步的查詢。新表空間中的撤消段會變成聯機狀態,以前活動的撤消表空間變成脫機狀態。
(7) 進行整理:把undo_tablespace參數設置回其初始值,再刪除新的撤消表空間。記住使用子句INCLUDING CONTENTS AND DATAFILES。
- 2019年出版專業職業資格考試《出版專業理論與實務(中級)》歷年真題與模擬試題詳解
- 駕考通關必做1280題
- 社會工作者職業水平考試考點精講·真題自測:社會工作法規與政策(2014中級)
- 房地產估價師《房地產開發經營與管理》歷年真題與模擬試題詳解
- 化妝師資格考試教程
- 社會工作實務:中級
- 準職業人導向訓練教程(二):職業能力與職業素質提升
- 注冊消防工程師考試重點、難點和考點三位一體闖關一本通
- 2019年全國導游人員資格考試輔導教材-山西導游基礎知識
- 2019年全國導游人員資格考試輔導教材-廣西導游基礎知識
- 啟視未來:2018—2019新東方留學指南美國本科
- 2020年青海省社區工作者公開招聘考試《行政職業能力》專項題庫【真題精選+章節題庫+模擬試題】
- 公共營養師(國家職業資格三級)過關必做習題集(含歷年真題)
- 《國際漢語教師證書》考試應試指南
- 企業法律顧問《民商與經濟法律知識》歷年真題與模擬試題詳解