Undo的作用
- 數(shù)據(jù)的回滾
- 一致性讀
- 表的閃回(事務(wù),查詢的閃回..)
- 失敗會話的恢復(fù)
回滾rollback操作
SQL> archive log list;
ORA-01031: 權(quán)限不足
SQL> conn /as sysdba
已連接。
SQL> archive log list;
數(shù)據(jù)庫日志模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯(lián)機(jī)日志序列 45
下一個存檔日志序列 47
當(dāng)前日志序列 47
SQL> create table t1(id int);
表已創(chuàng)建。
SQL> select * from t1;
未選定行
SQL> insert into t1 values('1');
已創(chuàng)建 1 行。
SQL> insert into t1 values('2');
已創(chuàng)建 1 行。
SQL> rollback;
回退已完成。
SQL> select * from t1;
未選定行
SQL> desc t1;
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
SQL> select * from t1;
未選定行
SQL> insert into t1 values(1);
已創(chuàng)建 1 行。
SQL> insert into t1 values(2);
已創(chuàng)建 1 行。
SQL> select * from t1;
ID
----------
1
2
SQL> rollback;
回退已完成。
SQL> select * from t1;
未選定行
SQL> archive log list;
數(shù)據(jù)庫日志模式 存檔模式
自動存檔 啟用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯(lián)機(jī)日志序列 45
下一個存檔日志序列 47
當(dāng)前日志序列 47
SQL> shutdown immediate;
數(shù)據(jù)庫已經(jīng)關(guān)閉。
已經(jīng)卸載數(shù)據(jù)庫。
ORACLE 例程已經(jīng)關(guān)閉。
SQL> startup mount;
ORACLE 例程已經(jīng)啟動。
Total System Global Area 3307048960 bytes
Fixed Size 2180264 bytes
Variable Size 1828719448 bytes
Database Buffers 1459617792 bytes
Redo Buffers 16531456 bytes
數(shù)據(jù)庫裝載完畢。
SQL> alter database noarchivelog;
alter database noarchivelog
*
第 1 行出現(xiàn)錯誤:
ORA-38774: 無法禁用介質(zhì)恢復(fù) - 閃回數(shù)據(jù)庫已啟用
SQL> alter database flashback off;
數(shù)據(jù)庫已更改。
SQL>
SQL> alter database noarchivelog;
數(shù)據(jù)庫已更改。
SQL> alter database open;
數(shù)據(jù)庫已更改。
SQL> archive log list;
數(shù)據(jù)庫日志模式 非存檔模式
自動存檔 禁用
存檔終點 USE_DB_RECOVERY_FILE_DEST
最早的聯(lián)機(jī)日志序列 45
當(dāng)前日志序列 47
SQL> select * from t1;
未選定行
SQL> insert into t1 values(1);
已創(chuàng)建 1 行。
SQL> insert into t1 values(2);
已創(chuàng)建 1 行。
SQL> select * from t1;
ID
----------
1
2
SQL> rollback;
回退已完成。
SQL> select * from t1;
未選定行
SQL> insert into t1 values(1);
已創(chuàng)建 1 行。
SQL> insert into t1 values(2);
已創(chuàng)建 1 行。
SQL> commit;
提交完成。
SQL> rollback;
回退已完成。
SQL> select * from t1;
ID
----------
1
2
可見rollback操作和當(dāng)前數(shù)據(jù)庫 歸檔模式并沒有關(guān)系,只和commit操作有關(guān),一旦commit就無法回滾。
如果沒有指定 rollback 到哪一個保存點savepoint上,就意味著全部Rollback,而不是只是rollback一條操作。
關(guān)于savepoint的操作見下面的命令:
SQL> drop table t1;
表已刪除。
SQL> select * from t1;
select * from t1
*
第 1 行出現(xiàn)錯誤:
ORA-00942: 表或視圖不存在
SQL> create table t1(id int);
表已創(chuàng)建。
SQL> insert into t1 values(1);
已創(chuàng)建 1 行。
SQL> savepoint s1;
保存點已創(chuàng)建。
SQL> insert into t1 values(2);
已創(chuàng)建 1 行。
SQL> insert into t1 values(3);
已創(chuàng)建 1 行。
SQL> rollback to s1;
回退已完成。
SQL> select * from t1;
ID
----------
1
雖然可以rollback到保存點,但是一旦commit,所有的保存點就都沒用了。
undo的邏輯結(jié)構(gòu)
回滾段的空間是可以循環(huán)利用的,就像是分塊的圓盤,這個圓盤可以增加塊,也可以回收塊。
undo的空間使用機(jī)制-增長
如圖中所示,塊4填滿后需要繼續(xù)向前填充,雖然塊2是inactive的,但是中間隔著一個active的塊1,所以不能向前覆蓋。這個時候空間就必須要增長了,則會加入新的塊5,然后就可以繼續(xù)向塊5中寫入undo信息。
undo的空間使用機(jī)制-回收
當(dāng)塊4塊5塊6連續(xù)并且都是inactive的時候,此時空間回收機(jī)制,可以將這幾個塊合并成單獨的塊,塊6。
一致性讀
回滾段解決了寫操作不會阻塞讀操作的問題。
一致性讀并非總要去讀回滾段。
實現(xiàn)的一致性讀產(chǎn)生的代價——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配置參數(shù)含義
-DNDO_MANAGEMENT undo的管理模式,分自動和手動
-UNDO_TABLESPACE 當(dāng)前正在被使用的undo表
-UNDO_RETENTION 規(guī)定多長時間內(nèi),數(shù)據(jù)不能被覆蓋。
-----------------------------------------
AUTO 表示undo 為自動管理模式。
900 表示在900秒內(nèi),undo上的數(shù)據(jù)不能被覆蓋。
UNDOTBS1 是當(dāng)前正在使用的undo表空間。
注意:undo_retention是一個動態(tài)調(diào)整的參數(shù),同時,Oracle無法保證在這個保留時間內(nèi)的undo數(shù)據(jù)不被覆蓋,當(dāng)undo空間不足時,Oracle將覆蓋即使未過保留期的數(shù)據(jù)以釋放空間。
強(qiáng)制保留undo_retention時間內(nèi)的數(shù)據(jù)
- 設(shè)置undo tablespace guarantee屬性
- 設(shè)置該屬性之后也可以取消
SQL> alter tablespace undotbs1 retention guarantee;
表空間已更改。
SQL> alter tablespace undotbs1 retention noguarantee;
表空間已更改。
Undo調(diào)優(yōu)
Undo的設(shè)置取決于我們實際的生產(chǎn)系統(tǒng)。如何設(shè)置undo更合理地為我們工作呢?
Undo表空間的大小:
我們在創(chuàng)建一個undo表空間的使用,就指定了它的大小,這個大小一旦創(chuàng)建是不可變更的。設(shè)置過大,是一種浪費,設(shè)置過小,例如刪除100萬條記錄,這些刪除的記錄都要臨時存放到undo表空間中,如果undo的大小不能存儲100萬條記錄,那么就會出問題。
Undo數(shù)據(jù)的存放時間:
也就是undo_retention 參數(shù)所對應(yīng)的時間,undo上有數(shù)據(jù)存放時間與undo大小的密切關(guān)系。存放時間越長,需要的表空間越大。就像理發(fā)師的數(shù)量與理發(fā)師的效率的關(guān)系一樣。理發(fā)師效率很高,一秒鐘解決一個客戶,那么就不需要太多的理發(fā)師傅。
Undo表空間的歷史信息:
如何合理設(shè)置undo表空間的大小和存放時間呢?那么就需要參考?xì)v史記錄
關(guān)于如何設(shè)置undo表空間的大小可以參見:
【技術(shù)分享】如何確定或調(diào)整undo表空間的大小
關(guān)于如何設(shè)置undo表空間的存放時間可以參見:
undo_retention:確定最優(yōu)的撤銷保留時間
參考資料:oracle undo 解析
記得幫我點贊哦!
精心整理了計算機(jī)各個方向的從入門、進(jìn)階、實戰(zhàn)的視頻課程和電子書,按照目錄合理分類,總能找到你需要的學(xué)習(xí)資料,還在等什么?快去關(guān)注下載吧?。?!
念念不忘,必有回響,小伙伴們幫我點個贊吧,非常感謝。
我是職場亮哥,YY高級軟件工程師、四年工作經(jīng)驗,拒絕咸魚爭當(dāng)龍頭的斜杠程序員。
聽我說,進(jìn)步多,程序人生一把梭
如果有幸能幫到你,請幫我點個【贊】,給個關(guān)注,如果能順帶評論給個鼓勵,將不勝感激。
職場亮哥文章列表:更多文章
本人所有文章、回答都與版權(quán)保護(hù)平臺有合作,著作權(quán)歸職場亮哥所有,未經(jīng)授權(quán),轉(zhuǎn)載必究!
|