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表空間的大小
關于如何設定undo表空間的存放時間可以參見:
undo_retention:確定最優的撤銷保留時間
參考資料:oracle undo 決議
記得幫我點贊哦!
精心整理了計算機各個方向的從入門、進階、實戰的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什么?快去關注下載吧!!!

念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝,
我是職場亮哥,YY高級軟體工程師、四年作業經驗,拒絕咸魚爭當龍頭的斜杠程式員,
聽我說,進步多,程式人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激,
職場亮哥文章串列:更多文章

本人所有文章、回答都與著作權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1152.html
標籤:Oracle
上一篇:做一名合格的DBA
下一篇:Oracle小練兵之映像租賃系統
