1. 程式人生 > 實用技巧 >Oracle 回滾段undo

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表空間的大小

關於如何設定undo表空間的存放時間可以參見:

undo_retention:確定最優的撤銷保留時間

參考資料:oracle undo 解析


記得幫我點贊哦!

精心整理了計算機各個方向的從入門、進階、實戰的視訊課程和電子書,按照目錄合理分類,總能找到你需要的學習資料,還在等什麼?快去關注下載吧!!!

念念不忘,必有迴響,小夥伴們幫我點個贊吧,非常感謝。

我是職場亮哥,YY高階軟體工程師、四年工作經驗,拒絕鹹魚爭當龍頭的斜槓程式設計師。

聽我說,進步多,程式人生一把梭

如果有幸能幫到你,請幫我點個【贊】,給個關注,如果能順帶評論給個鼓勵,將不勝感激。

職場亮哥文章列表:更多文章

本人所有文章、回答都與版權保護平臺有合作,著作權歸職場亮哥所有,未經授權,轉載必究!