Oracle 回滾段undo
Undo的作用
- 資料的回滾
- 一致性讀
- 表的閃回(事務,查詢的閃回..)
- 失敗會話的恢復
回滾rollback操作
SQL> archive log list; ORA-01031: 許可權不足 SQL> conn /as sysdba 已連線。 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日誌序列 45 下一個存檔日誌序列 47 當前日誌序列 47 SQL> create table t1(id int); 表已建立。 SQL> select * from t1; 未選定行 SQL> insert into t1 values('1'); 已建立 1 行。 SQL> insert into t1 values('2'); 已建立 1 行。 SQL> rollback; 回退已完成。 SQL> select * from t1; 未選定行 SQL> desc t1; 名稱 是否為空? 型別 ----------------------------------------- -------- ---------------------------- ID NUMBER(38) SQL> select * from t1; 未選定行 SQL> insert into t1 values(1); 已建立 1 行。 SQL> insert into t1 values(2); 已建立 1 行。 SQL> select * from t1; ID ---------- 1 2 SQL> rollback; 回退已完成。 SQL> select * from t1; 未選定行 SQL> archive log list; 資料庫日誌模式 存檔模式 自動存檔 啟用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日誌序列 45 下一個存檔日誌序列 47 當前日誌序列 47 SQL> shutdown immediate; 資料庫已經關閉。 已經解除安裝資料庫。 ORACLE 例程已經關閉。 SQL> startup mount; ORACLE 例程已經啟動。 Total System Global Area 3307048960 bytes Fixed Size 2180264 bytes Variable Size 1828719448 bytes Database Buffers 1459617792 bytes Redo Buffers 16531456 bytes 資料庫裝載完畢。 SQL> alter database noarchivelog; alter database noarchivelog * 第 1 行出現錯誤: ORA-38774: 無法禁用介質恢復 - 閃回資料庫已啟用 SQL> alter database flashback off; 資料庫已更改。 SQL> SQL> alter database noarchivelog; 資料庫已更改。 SQL> alter database open; 資料庫已更改。 SQL> archive log list; 資料庫日誌模式 非存檔模式 自動存檔 禁用 存檔終點 USE_DB_RECOVERY_FILE_DEST 最早的聯機日誌序列 45 當前日誌序列 47 SQL> select * from t1; 未選定行 SQL> insert into t1 values(1); 已建立 1 行。 SQL> insert into t1 values(2); 已建立 1 行。 SQL> select * from t1; ID ---------- 1 2 SQL> rollback; 回退已完成。 SQL> select * from t1; 未選定行 SQL> insert into t1 values(1); 已建立 1 行。 SQL> insert into t1 values(2); 已建立 1 行。 SQL> commit; 提交完成。 SQL> rollback; 回退已完成。 SQL> select * from t1; ID ---------- 1 2
可見rollback操作和當前資料庫 歸檔模式並沒有關係,只和commit操作有關,一旦commit就無法回滾。
如果沒有指定 rollback 到哪一個儲存點savepoint上,就意味著全部Rollback,而不是隻是rollback一條操作。
關於savepoint的操作見下面的命令:
SQL> drop table t1; 表已刪除。 SQL> select * from t1; select * from t1 * 第 1 行出現錯誤: ORA-00942: 表或檢視不存在 SQL> create table t1(id int); 表已建立。 SQL> insert into t1 values(1); 已建立 1 行。 SQL> savepoint s1; 儲存點已建立。 SQL> insert into t1 values(2); 已建立 1 行。 SQL> insert into t1 values(3); 已建立 1 行。 SQL> rollback to s1; 回退已完成。 SQL> select * from t1; ID ---------- 1
雖然可以rollback到儲存點,但是一旦commit,所有的儲存點就都沒用了。
undo的邏輯結構
回滾段的空間是可以迴圈利用的,就像是分塊的圓盤,這個圓盤可以增加塊,也可以回收塊。
undo的空間使用機制-增長
如圖中所示,塊4填滿後需要繼續向前填充,雖然塊2是inactive的,但是中間隔著一個active的塊1,所以不能向前覆蓋。這個時候空間就必須要增長了,則會加入新的塊5,然後就可以繼續向塊5中寫入undo資訊。
undo的空間使用機制-回收
當塊4塊5塊6連續並且都是inactive的時候,此時空間回收機制,可以將這幾個塊合併成單獨的塊,塊6。
一致性讀
回滾段解決了寫操作不會阻塞讀操作的問題。
一致性讀並非總要去讀回滾段。
實現的一致性讀產生的代價——ORA-01555
ORA-01555: "snapshot too old: rollback segment number string with name "string" too small"
Cause: rollback records needed by a reader for consistent read are overwritten by other writers;
Action: if in Automatic Undo Management mode, increase undo_retention setting.otherwise,use larger rollback segments.
快照太久,回滾段太小,回滾記錄被覆蓋
具體可以參見:ORA-01555 原因與解決
自動管理Undo-AUM
Automatic Undo Management
檢視undo配置資訊:
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
Undo配置引數含義
-DNDO_MANAGEMENT undo的管理模式,分自動和手動
-UNDO_TABLESPACE 當前正在被使用的undo表
-UNDO_RETENTION 規定多長時間內,資料不能被覆蓋。
-----------------------------------------
AUTO 表示undo 為自動管理模式。
900 表示在900秒內,undo上的資料不能被覆蓋。
UNDOTBS1 是當前正在使用的undo表空間。
注意:undo_retention是一個動態調整的引數,同時,Oracle無法保證在這個保留時間內的undo資料不被覆蓋,當undo空間不足時,Oracle將覆蓋即使未過保留期的資料以釋放空間。
強制保留undo_retention時間內的資料
- 設定undo tablespace guarantee屬性
- 設定該屬性之後也可以取消
SQL> alter tablespace undotbs1 retention guarantee;
表空間已更改。
SQL> alter tablespace undotbs1 retention noguarantee;
表空間已更改。
Undo調優
Undo的設定取決於我們實際的生產系統。如何設定undo更合理地為我們工作呢?
Undo表空間的大小:
我們在建立一個undo表空間的使用,就指定了它的大小,這個大小一旦建立是不可變更的。設定過大,是一種浪費,設定過小,例如刪除100萬條記錄,這些刪除的記錄都要臨時存放到undo表空間中,如果undo的大小不能儲存100萬條記錄,那麼就會出問題。
Undo資料的存放時間:
也就是undo_retention 引數所對應的時間,undo上有資料存放時間與undo大小的密切關係。存放時間越長,需要的表空間越大。就像理髮師的數量與理髮師的效率的關係一樣。理髮師效率很高,一秒鐘解決一個客戶,那麼就不需要太多的理髮師傅。
Undo表空間的歷史資訊:
如何合理設定undo表空間的大小和存放時間呢?那麼就需要參考歷史記錄
關於如何設定undo表空間的大小可以參見:
關於如何設定undo表空間的存放時間可以參見:
參考資料:oracle undo 解析
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視訊課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什麼?快去關注下載吧!!!
念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。
我是職場亮哥,YY高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!