一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

oracle undo解析

 會飛的蘑菇 2014-05-12
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

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    一区二区三区在线不卡免费| 国产丝袜极品黑色高跟鞋| 夜夜躁狠狠躁日日躁视频黑人| 最好看的人妻中文字幕| 黄色污污在线免费观看| 老司机精品视频免费入口| 欧美做爰猛烈叫床大尺度| 亚洲女同一区二区另类| 日本道播放一区二区三区| 亚洲一区二区三区日韩91| 日本人妻的诱惑在线观看| 日本高清二区视频久二区| 亚洲精品偷拍一区二区三区| 老司机精品视频在线免费看| 好吊日成人免费视频公开| 日本中文字幕在线精品| 欧美熟妇一区二区在线| 东京热电东京热一区二区三区| 亚洲精品成人福利在线| 91久久精品国产一区蜜臀| 麻豆亚州无矿码专区视频| 国产成人免费激情视频| 国产欧美亚洲精品自拍| 成人精品网一区二区三区| 日本一二三区不卡免费| 日韩精品一区二区三区四区| 精品欧美日韩一区二区三区| 九九热精品视频免费观看| 中文字日产幕码三区国产| 欧美黄色成人真人视频| 国产精品国产亚洲区久久| 免费在线观看激情小视频| 中文字幕人妻一区二区免费| 日韩欧美中文字幕av| 99久久国产亚洲综合精品| 亚洲夫妻性生活免费视频| 美国欧洲日本韩国二本道| 欧美日韩综合在线精品| 一区二区三区亚洲天堂| 在线观看日韩欧美综合黄片| 免费特黄一级一区二区三区|