Undo是干嘛用的?
在介紹undo之前先說一下另外一個東西 transaction ,翻譯成交易或事務。我們在進行一個事務的過程中需要申請許多資源,一個復雜的事務也需要很多步來完成。那么一個復雜的事務是只有兩個結果,要么成功,要么失?。ㄏ喈斢趶膩頉]發(fā)生過)。
一個很典型的列子,銀行轉賬,其實其需要兩步操作,第一步先將你賬戶上的錢減去,第二步把被轉賬戶的錢加上,(先減后加,出了問題銀行不吃虧。呵呵!)這樣就是一個完整的事務。如果執(zhí)行了一半,你的錢減了,被轉賬戶的錢沒加上,這個時候事務就要回滾,回滾到原始狀態(tài)。也就是在轉賬之前,需要先記錄你和被轉賬戶上的金額。這就樣能保證,一旦事務失敗就回滾到事務的發(fā)生之前的狀態(tài)。
為那保證一個事務的原始性和完整性,就引這入undo 的概念。Undo就是用來記錄保存事務操作過程中的數(shù)據(jù),如果事務發(fā)生錯誤,可以之前的數(shù)據(jù)進行填補。
Undo Segment 還原段:
從來面的視圖,我們就可以很清晰的看出,我們要對表(table)中的一個數(shù)據(jù)進行修改,在修改之前,先把老的映像(old image)放到undo 上面。然后再在table中放入new image 。假如過程失敗,我們還可以把undo 上的old image 再拿回來放在原先的位置,從而使這件事兒看起來像沒發(fā)生過一樣。 www.
Undo segment 是保存在表空間上的。Undo 大小是固定的,既然是固定的也就是有限的。如果保存的記錄非常多,那么它就會被占滿,新記錄的數(shù)據(jù)會覆蓋掉最早的數(shù)據(jù)。所以用一個圓形的盤片能更加形象的表示。數(shù)據(jù)從一個位置開始寫入,當寫滿一圈后,最新的數(shù)據(jù)就會覆蓋最早寫入的數(shù)據(jù)。
undo可以做哪些事兒?
Transaction rollback 事務反轉, Transaction recovery 事務恢復。事務反轉與事務恢復的效果是一樣的。事務反轉是人主動去做的,人在操作的過程中反悔了,相當于我在寫文檔時按個ctrl+z 。事務恢復是機器自動完成的,比如在事務進行過程中簡拼突然斷電了,下次重啟服務之后,系統(tǒng)自動回滾。
Read consistency 讀一執(zhí)行。讀一致性對于多用戶操作是非常重要的。如果你在多人開發(fā)中使用過版本控制工具(git\cvs\svn)的話,下面的概念你將很容易理解。
Oracle 讀一致性概念
我知道oracle允許可以由多個用戶對數(shù)據(jù)庫進行操作,當你執(zhí)行一個查詢幾百萬條記錄的操作時,這個過程可能需要幾分鐘。在這個過程中其它用戶對你查詢的數(shù)據(jù)時行了修改。這里就要保證你查詢的結果是被修改之前的。 www.
這里明確一個概念,事務的開始,在我們執(zhí)行一條(更新、修改、刪除)語句時;事務的結束,必須執(zhí)行提交動作(執(zhí)行commit 或 rollback 命令)
我們從上面的流程圖來理解一下oracle是如何保證讀一致性的。
當我們執(zhí)行一個事務的時候,oracle會分配一個SCN編號,這個編號是遞增的。下一個事務的編號一定比當前事務的編號大。上圖中執(zhí)行第一個事務分配的編號為10023,在這個事務執(zhí)行的過程中,另一事務對SCN 編號為10008和10021的數(shù)據(jù)塊進行了修改。用來替換的數(shù)據(jù)塊SCN編號為10024 ,而被替換掉的數(shù)據(jù)塊會被保存到undo 上面。當?shù)谝粋€事務執(zhí)行到被修改過的數(shù)據(jù)塊時,發(fā)現(xiàn)10024比10023大,這個時候就會到undo segment上找比自己SCN號小的數(shù)據(jù)塊進行讀,于是發(fā)找到了SCN號為10008和10021兩個塊。這樣就有效的保證了讀一致性。
當然,會有一種特殊情況,也就是undo segment 太小,最多放100條數(shù)據(jù),可一下子來了120條數(shù)據(jù),那么最先寫入的20條數(shù)據(jù)被最后寫入的20條數(shù)據(jù)覆蓋。這個時候就會報錯,這也是為什么要對數(shù)據(jù)據(jù)進行調優(yōu)的原因。
Redo or Undo
www.
什么是Redo
Redo記錄transaction logs,分為online和archived。以恢復為目的。
比如,機器停電,那么在重起之后需要online redo logs去恢復系統(tǒng)到失敗點。
比如,磁盤壞了,需要用archived redo logs和online redo logs區(qū)恢復數(shù)據(jù)。
什么是Undo
Redo 是為了重新實現(xiàn)你的操作,而Undo相反,是為了撤銷你做的操作。Undo更像常使用的ctrl+z ,撤銷到上一步的狀態(tài)。而Redo 是也就會記錄undo 的操作。
當我們插入一條數(shù)據(jù)時,首先這個動作會被記錄到redo log 中,操作也會被記錄到到undo ,undo本身的動作也會做為一條數(shù)據(jù)被記錄到redo log ,插入一條數(shù)據(jù),索引(indexes)會發(fā)生變化,索引的變化也會做一條數(shù)據(jù)被記錄到redo log 。Redo 記錄著一個操作所有相關的信息,這樣才能完整的保證場景的重現(xiàn)。
需要說明的是在上面的圖表中,不管是undo 還是redo都是寫在內存里的,一旦斷電,所有信息將會消失。只有寫到磁盤上的信息才不會因為斷電而消失。是redo log 的信息先寫到磁盤上的,因為它的信息最全面,可以完整的保證場景重現(xiàn)。我們可以通過各種機制控制redo 寫磁盤,比如每隔3秒寫一次,或redo log文件大于1MB寫一次。
如何配置使用undo ?
www.
要想使用undo 首先需要創(chuàng)建undo表空間。我們可以創(chuàng)建多個undo表空間,但只能有一個undo表空間是處于使用狀態(tài)。
查看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 當前正在被使用的undo表
-UNDO_RETENTION 規(guī)定多長時間內,數(shù)據(jù)不能被覆蓋。
-----------------------------------------
AUTO 表示undo 為自動管理模式。
900 表示在900秒內,undo上的數(shù)據(jù)不能被覆蓋。
UNDOTBS1 是當前正在使用的undo表空間。
創(chuàng)建undo表空間,與創(chuàng)建一般的表空間類似,命令如下:
SQL> create undo tablespace myundotbs
2 datafile '/ora10/product/oradata/ora10/myundotbs1.dbf' size 10M;
www.
Tablespace created.
查看新創(chuàng)建的undo表空間
SQL> select tablespace_name,contents from dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------------------------------------ ------------------
SYSTEM PERMANENT
UNDOTBS1 UNDO //老的undo表空間
SYSAUX PERMANENT
TEMP TEMPORARY
USERS PERMANENT
PAUL PERMANENT
MYUNDOTBS UNDO // 新創(chuàng)建的undo表空間
SQL> show parameter undo 再次查看當前使用的表空間
NAME TYPE VALUE
------------------------------------ ----------------------------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
www.
切換undo表空間:
SQL> alter system set undo_tablespace=myundotbs;
System altered.
SQL> show parameter undo 再次查看當前使用的表空間
NAME TYPE VALUE
------------------------------------ ----------------------------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string MYUNDOTBS //已經切換的了undo表空間
www.
刪除undo表空間:
SQL> drop tablespace myundotbs;
Tablespace dropped.
Drop一個undo表空間后,在磁盤上還是存在的,我們需要通過操作系統(tǒng)層面用rm命令將文件刪除。
思考:
表空間的切換、刪除命令非常簡單,但這里我們需要思考一下實際切換場景。當我們執(zhí)行一個事務時,事務執(zhí)行了一半還沒有提交,這個時候進行切換undo表空間是否可以成功? 理論上undo表空間正在使用中,是不允許切換的。但實際上undo表空間在使用中是可以切換的,但切換之后立刻刪除,系統(tǒng)會提示錯誤。把事務提交后再刪除,系統(tǒng)依然提示錯誤。這里只有將替換掉的undo表空間切換到使用狀態(tài),再切換到廢棄狀態(tài)才能被刪除。上面的情況,有興趣有同學可以驗證一下。
Undo調優(yōu)
www.
Undo的設置取決于我們實際的生產系統(tǒng)。如何設置undo更合理地為我們工作呢?
Undo表空間的大小:
我們在創(chuàng)建一個undo表空間的使用,就指定了它的大小,這個大小一旦創(chuàng)建是不可變更的。設置過大,是一種浪費,設置過小,例如刪除100萬條記錄,這些刪除的記錄都要臨時存放到undo表空間中,如果undo的大小不能存儲100萬條記錄,那么就會出問題。
Undo數(shù)據(jù)的存放時間:
也就是undo_retention 參數(shù)所對應的時間,undo上有數(shù)據(jù)存放時間與undo大小的密切關系。存放時間越長,需要的表空間越大。就像理發(fā)師的數(shù)量與理發(fā)師的效率的關系一樣。理發(fā)師效率很高,一秒鐘解決一個客戶,那么就不需要太多的理發(fā)師傅。
Undo表空間的歷史信息:
如何合理設置undo表空間的大小和存放時間呢?那么就需要參考歷史記錄
這個數(shù)據(jù)每隔10分鐘采集一次,結束時間減去開始時間,在這段時間內使用了多少個undo數(shù)據(jù)塊。
計算每秒鐘使用數(shù)據(jù)塊的多少?
求最大值:
SQL> select max(undoblks / ((end_time-begin_time)*24*3600)) from v$undostat;
MAX(UNDOBLKS/((END_TIME-BEGIN_TIME)*24*3600))
---------------------------------------------
14.15833333
www.
求平均值:
SQL> select sum(undoblks)/sum((end_time - begin_time)*24*3600) from v$undostat;
SUM(UNDOBLKS)/SUM((END_TIME-BEGIN_TIME)*24*3600)
------------------------------------------------
4.122282389
|
|
來自: 會飛的蘑菇 > 《數(shù)據(jù)庫》