undo表空間的作用及ora 01555

2022-04-08 18:24:17 字數 2893 閱讀 9541

undo表空間的作用及ora-01555

下面我們通過dml操作,由淺入深的解讀undo表空間的作用及ora-01555錯誤的產生:

一、當我們發出dml語句,update t set col = 『b』 where col = 『a』;oracle內部是怎麼執行的呢:

1、     在shared pool內進行解析,生成執行計畫(具體請先了解oracle記憶體結構中共享池);

2、     通過執行計畫找到col=』a』資料的位置,例如此資料存在10號資料檔案54號資料塊內;

3、     程序在buffer cache(詳細請先了解oracle記憶體結構中buffer cache)中找到空閒的undo塊,如果沒有,則到undo表空間中找到乙個可以使用的undo塊,並呼叫到buffer cache中,假設次undo表空間為11號資料檔案,此undo塊為24號資料塊;

4、     將改變前的值,也就是a放入到undo塊中;

5、     由於undo資料塊發生變化,所以產生重做記錄,假設重做記錄行號為120; 行號

事務id

file#

block#

rowcolumn

value

120t1

1124

10col

a6、     從buffer cache中找到54號資料檔案,如果沒有發現,從10號資料檔案中呼叫;

7、     將b寫入到54號資料塊中,由於資料塊發生了變化,所以產生重做記錄,行號為121; 行號

事務id

file#

block#

rowcolumn

value

121t1

1054

10col

b8、     控制權返回給使用者,在sql*plus中會顯示游標下移;

9、     當使用者發出commit命令時,會觸發lgwr程序,將120和121兩條重做日誌從logbuffer中寫入到聯機日誌檔案中,同時將54號資料塊和24號undo塊的頭部所記錄的事務狀態標記設定為已經提交;

10、    此時54號資料塊和24號資料塊並不一定被dbwn寫入到10號和11號資料檔案中(存在於記憶體中),此時稱之為髒塊,只有當髒塊達到一定程度才會觸發dbwn將髒塊寫入到資料檔案中;  

二、undo的作用:

提供一致性度(consistentread)、回滾事務(rollback transaction)、例項恢復(instance recovery);

1、consistent read:

什麼是consistent read?

例子:t表中含有1000條資料,select * from t需要15分鐘,目前為9:00,使用者a發出select * from t語句,9:10時,使用者b將第1000條記錄delete掉,並且提交,那麼9:15時a使用者讀取多少條記錄?

如果返回999行,說明發生了髒讀,但是資料庫是不允許發生髒讀的,所以提供了一種consistent read,及返回1000行,那麼consistent read是怎樣的過程呢?

首先使用者a發出檢索命令後呢,通過sharedpool的解析已經知道所要檢索的資料位於哪些資料檔案的資料塊中,在讀之前,使用者a程序將記錄下9:00時的scn號,比如此時的scn號位scn9:00,9:00之前的scn號一定是小於等於scn9:00,在檢索資料塊是要比較資料塊頭部itl槽的scn號,如果小於等於scn9:00,說明資料塊沒有發生過改變,可以直接讀取,如果大於scn9:00則說明資料塊已經發生了改變,於是借助undo,應為undo還保留了改變前的值,此過程就叫做一致性度;

那麼是怎麼找到這個undo的呢?

是因為資料塊的itl槽除了記錄scn號外還記錄和undo的位址,我們可以根據這個位址找到undo塊,從而構建出修改前資料塊的內容,這樣的資料塊叫做cr塊。

假如9:11分,使用者c又插入了兩條記錄(並且假設表t的initrans為1,也就是乙個itl槽),那麼又會怎麼樣呢?

oracle在記錄undo的時候,不僅記錄改變前的資料,還記錄了改變前資料塊頭部的itl資訊,因此在9:10分是b使用者在刪除時(位於n資料塊,此時n資料塊頭部itl為[undo_block0/scn8:50]),提交後資料塊itl資訊為undo_block1/scn9:10,undo塊及undo_block1裡面除了修改前資料還儲存undo_block0/scn8:50,9:11分c使用者在n資料塊中做insert操作,那麼n資料塊的頭部itl資訊為undo_block2/scn9:11,undo_block2除了記錄更改前的資訊外還記錄undo_block1/scn9:10,使用者在9:15的時候檢索資料發現n資料塊的scn號大於scn9:00,讀取undo_block2,但是發現undo_block2種資訊scn9:10也大於scn9:00,所以就查詢undo_block1,發現undo_block1中資訊scn8:50小於scn9:00可以讀取,構建出修改前資料塊內容,完畢;

undo表空間只要是事務結束後就可能被覆蓋,假如在9:14的時候undo_block1被覆蓋了,那麼9:15分會怎麼樣呢?

ora-01555錯誤。snapshot too old,此時ora-01555的錯誤經過上面的分析,已經詳細的闡明;

2、rollback transaction:

當使用者發出rolback命令是,oracle會利用itl槽中記錄的undo塊的資訊,找到原來的值,寫到資料塊中。

3、instance recovery

例項恢**生的時刻,資料庫啟動以後(startup),不需要dba干預,資料庫自行解決。

例項恢復分為兩種,前滾和後滾。

前滾(roll forward)也稱cache recovery,利用redo日誌,注意不是archive log。dbwr把rodo log files中的所有的內容讀到記憶體中分析並全部寫到資料檔案中。

後滾(roll back)也稱transaction recovery,利用undo,將寫在資料檔案中的資料但是還沒有提交的或者來不及回滾的刪除掉。

ORACLE的undo表空間操作

1.檢視undo表空間 select file id,file name,tablespace name,sum bytes 1024 1024 total mb,autoextensible from dba data files group by file name,file id,tables...

如何確定或調整undo表空間的大小

oracle的undo資料就是事務中那些被更改,但是沒有被提交的資料。undo資料可以用來提供事務回滾,恢復事務或讀一致性等特性。undo表空間就是用來儲存undo資料的。undo表空間的大小取決於以下三方面的因素 1.oracle初始化引數undo retention 2.每秒產生的undo資料塊...

Oracle UNDO 表空間的作用

一.表空間的概念 oracle資料庫被劃分成稱作為表空間 1 的邏輯區域 形成oracle資料庫的邏輯結構。乙個oracle資料庫能夠有乙個或多個表空間,而乙個表空間則對應著乙個或多個物理的資料庫檔案。表空間是oracle資料庫恢復的最小單位,容納著許多資料庫實體,如表 檢視 索引 聚簇 回退段和臨...