oracle的回滾和撤銷機制

2021-06-20 14:23:56 字數 4840 閱讀 2655

為了保證資料庫中多個使用者間的讀一致性和能夠回退事務。

一、在乙個簡單的更新語句中,對於回滾段的操作存在多處,在事務開始時,首

先需要在回滾表空間獲得乙個事務槽,分配空間,然後建立前映象,此後事務的

修改才能進行,oracle必須以此來保證事務是可以回滾的。如果使用者提交了事務

,oracle會在日誌檔案記錄提交,並且寫出日誌,同時會在回滾段中把事務標記

為已提交;如果使用者回滾事務,則oracle需要從回滾段中把前映象資料讀取出來

修改資料緩衝區,完成回滾,這個過程本身也要產生redo,所以回退這個操作是

很昂貴的。

二、回滾段儲存的內容

1、對於insert 操作,回滾段只需要記錄插入記錄的rowid,如果回退,只

需要將該記錄根據rowid刪除即可。

2、對於update操作:回滾段只需要記錄被更新欄位的舊值即可,回退時通

過舊值覆蓋新值即可完成回退。

3、對於delete操作,oracle則必須記錄正行的資料,在回退時,oracle通

過乙個反向操作恢復刪除的資料。

三、併發控制和一致性讀

1、一方面oracle通過鎖定機制實現資料庫的併發控制;一方面通過多版本

模型來進行併發資料訪問。通過多版本架構,oracle實現了讀取和寫入的分離,

使得寫入不阻塞讀取,讀取不阻塞修改。這是oracle資料庫區別於其他資料庫的

乙個重要特徵。oracle一方面不允許其他使用者讀取未提交資料,一方面要保證用

戶讀取資料要來自同一時間點。

假設員工scott的薪水為3000那麼:

1)在t1時間,在session1查詢可以得到這個結果

2)在t2時間session2進行更新,將scott的薪水增加3000,並為提交

3)在t3時間session1再次查詢,注意此時,oracle不會允許其他使用者看到未提交資料,所以此時,oracle需要通過回滾段記錄的前映象進行一致讀,將3000恢復出來供給使用者,這是一致性讀的作用。

4)在t4時間,session2提交更改,此時資料修改被永久化;

5)在t5時間,其他使用者再次查詢,將會看到變化後的資料,也就是4000.

oracle內部使用scn作為時鐘,在這裡查詢結果集就是根據scn來進行判斷的,每個資料塊頭部都會記錄乙個提交scn,當資料更改提交後,提交scn同時被修改,這個scn在查詢時可以用來進行一致性讀判斷。

四、在自動undo管理表空間,oracle隨之引入了幾個新的初始化引數

undo_management:用來定義資料塊使用的回滾段是否使用自動管理模式。該引數有兩個選項,auto表示自動管理,manual表示手工管理。

undo_tablespace:用來定義在自動管理模式下,當前例項使用哪個undo表空間。

undo_retention:表示在自動管理模式下,當回滾段變得非啟用之後,回滾段中的資料在被覆蓋前保留的時間,該引數單位是秒。

五、回滾機制的深入研究

1、獲取事務資訊:

v$transaction動態檢視

xidusn:回滾段號

xidslot:事務槽

xidsqn:事務的序列號

ubafil:undo block address filenum

ubablk:uba block number

ubarec:uba record number

v$rollstat動態檢視

usn:回滾段標識

rssize:回滾段預設大小

xacts:活動事務數

writes:回滾段寫入數

shrinks:回滾段收縮次數

extends:回滾段擴充套件次數

gets:獲取回滾段頭次數

waits:回滾段頭等待次數

2、轉儲undo段

在undo段頭的轉儲檔案中,dba指向的就是包含這個事務的前映象的資料塊位址。前十位代表檔案號,後22位代表block號。轉儲檔案中的irb:指的是回滾段中記錄的最近未提交變更開始之處,如果回滾,這是起始的搜尋點。rci:該引數代表的是undo chain(同一事務中的多次修改,根據chain連線關聯)的下乙個偏移量。在x$bh中class欄位中4表示的是段頭,1表示的是資料塊,state為3的就是一致讀構造的前映象。

select b.segment_name ,a.file#,a.dbarfil,a.dbablk,a.class,a.state

from x$bh a,dba_extents b

where b.relative_fno=a.dbarfil

and b.block_id<=a.dbablk

and b.block_id+b.blocks>a.dbablk

and b.owner='scott'

and b.segment_name='emp'

3、轉儲資料塊資訊

itl事務槽指interested transaction list,事務必須獲得乙個itl事務槽才能夠進行資料修改itl內容包括:

xid:事務的id

lck:lock status

xid=undo.segment.number+transaction.table.slot.number+wrap

事務的內部流程

1)首先當乙個事務開始時,需要在回滾段事務表上分配乙個事務槽

2)在資料塊頭部獲取乙個itl事務槽,該事務槽指向回滾段頭的事務槽

3)在修改資料之前,需要記錄前映象資訊,這個資訊以undo record的形式儲存在回滾段中,回滾段頭事務槽指向該記錄。

4)鎖定修改行,修改行鎖定位指向itl事務槽。

5)資料修改可以進行。

4、塊清除(block cleanouts)

在事務需要修改資料時,必須分配itl事務槽,必須鎖定該行,必須分

配回滾段事務槽和回滾空間記錄前映象。當事務提交時,oracle需要將回滾段上

的事務表資訊標記為非活動,以便空間可以重用;那麼還有itl事務資訊和鎖定信

息需要清除,以記錄提交。由於oracle在資料塊上儲存了itl和鎖定等事務資訊,

所以oracle必須在事務提交之後清除這些事務資料,這就是塊清除。塊清除主要

清除的資料有行級鎖、itl資訊(包括提交標誌、scn等)。如果提交時修改過的

資料塊仍然在buffer cache之中,那麼oracle可以清除itl資訊,這叫做快速塊清

除,如果事務提交時修改過的資料塊已經被寫回到資料檔案上,oracle會等到下

次訪問該block時再來清除itl鎖定資訊,這就是延遲塊清除。

5、產生ora-01555錯誤的原因

1)由於回滾段是迴圈使用的,當事務提交以後,該事務占用的回滾事務表被標記為非活動,回滾段空間可以被覆蓋重用。那麼當乙個查詢需要使用被覆蓋的回滾段構造前映象實現一致讀,此時就會出現oracle著名的ora-01555錯誤

2)因為延遲塊清除。當乙個查詢觸發延遲快清除時,oracle需要去查詢回滾段獲得該事務的提交scn,如果事務的前映象資訊已經被覆蓋,並且查詢scn也小於回滾段中記錄的最小scn,那麼oracle將無法判斷查詢scn和事務提交scn的大小,此時就會出現延遲塊清除導致的ora-01555錯誤。

3)使用sqlldr直接載入資料時。

alter tablespace tablespace_name retention guarantee;

oracle提供乙個內部事件(10203事件)可以用來跟蹤資料庫的塊清除操作,10203事件可以通過以下命令設定,設定後需要重新啟動資料庫該引數才能生效

alter system set event="10203 trace name context forever" scope=spfile;

alter database datafile '.....' offline drop;

六、回滾段的空間過大

1)通過查詢試圖v$dba_data_file和v$dba_temp_files確定臨時表空間和undo表空間的大小

2)新建乙個undo表空間

create undo tablespace tablespace_name;

3)切換undo表空間

alter system set undo_tablespace=undotbs2 scope=both;

4)等待原表空間所有undo segment offline;

5)刪除原undo表空間

drop tablespace undotbs1 including contents;

七、特殊情況的恢復

在很多情況下,特別是在使用隱含引數強制開啟資料庫之後,可能會在ora-006004194錯誤,在alert檔案中,記錄主要錯誤日誌,出現此種錯誤時,最好的辦法是通過備份進行恢復,如果沒有備份,那麼可以通過特殊的初始化引數進行強制啟動,

1)從當前的日誌檔案中找到對應的aum(auto undo management)下的回滾段名稱。

2)修改init.ora引數檔案,使用oracle隱含引數_corrupted_rollback_segments將回滾段標記為損壞,oracle會跳過對於這些回滾段的相關操作,強制啟動資料庫。

3)使用init.ora引數檔案啟動資料庫

startup pfile=initconner.ora

4)重新建立新的undo表空間,刪除出現問題的表空間,修改引數檔案,由引數檔案生成新的spfile,重新啟動資料庫。

create undo tablespace undotbs1 datafile '.......' size 10m;

alter system set undo_tablespace=undotbs1 scope=both;

drop tablespace undotbs2;

修改引數檔案,變更undo表空間,並取消_corrupted_rollback_segments設定。

有引數檔案建立spfile;

開啟資料庫即可;

學習筆記 Oracle回滾 撤銷

撤銷資料是反轉dml語句結果所需的資訊。撤銷資料通常被稱為 回滾資料 在過去的oracle版本中,回滾資料 和 撤銷資料 可以交替使用,但從9i版本開始,這兩個術語有所不同 功能相同,但管理方式不同。只要某個事務修改了資料,那麼更新前的原有資料就會被寫入乙個回滾段或撤銷段。回滾段在11g版本中依然存...

git撤銷與回滾

1 檔案修改了,沒有進行add操作 git checkout filename git checkout 2 對不想提交的檔案進行了git add操作 git status git reset head 3 修改的檔案已被git commit,但想再次修改不再產生新的commit git commi...

mysql回滾命令 關於MySQL回滾機制

在事務中,每個正確的原子操作都會被順序執行,直到遇到錯誤的原子操作,此時事務會將之前的操作進行回滾。回滾的意思是如果之前是插入操作,那麼會執行刪 除插入的記錄,如果之前是update操作,也會執行update操作將之前的記錄還原 因此,正確的原子操作是真正被執行過的。是物理執行。在當前事務中確實能看...