程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> 【ORACLE】redo和undo_改變向量

【ORACLE】redo和undo_改變向量

編輯:Oracle教程

【ORACLE】redo和undo_改變向量


redo和undo

1.1 oracle 9i 任務執行過程

--DML 更新數據操作:

1.創建一個改變向量(保存改變之前的數據)描述undo數據塊的改變;

2.創建改變向量(保存改變之後的數據),描述數據塊的改變;

3.合並兩個改變向量為日志記錄,寫入日志緩沖區

4.創建undo記錄插入undo表空間;

5. 改變數據塊的數據;

 

所以任務報告為:

--任務報告

1. 創建undo塊(數據文件2)的改變向量(方法為記錄undo記錄的內容)

2. 創建table數據塊的改變向量

3a 合並兩個改變向量,創建改變記錄

3b 將改變記錄復制到日志緩沖區

4 應用undo塊改變向量(undo記錄的redo change vector,創建undo記錄)

5 應用table塊改變向量

 

1.2 oracle 9i日志緩沖區瓶頸

所有會話進程向同一個日志緩沖區復制改變向量。

引入redo allocation latch: 用戶進程嘗試請求redo latch來在日志緩沖區保留部分空間;

存在問題:大量進程爭用redo allocation latch, 消耗CPU資源,’自旋’ CPU的進程循環爭用redo latch;

概況為一個進程的每一次變更,一條記錄,一次log buffer 內存分配

1.3 oracle 10g 引入 private redo buffer 和IMU

--priate redo log buffer

Oracle 10g引入的。

每個進程有私有的日志緩沖區,一個事務中每次變更都寫入這個進程的私有的日志緩沖區中;讓事務提交後,這個進程獲取一此公共的log buffer即可。

私用用redo allocation latch 保護,公共的用redo copy latch保護;

 

--IMU:In-Memory-Undo

Oracle 10g引入。

每個進程的私有日志緩沖區的一部分。進程將undo 重做日志寫入IMU;

IMU 采用IMU latch來保護。最後IMU的記錄和priavate redo log buffer日志記錄合並。寫入公共的redo log buffer;

 

1.4 oracle10g任務處理順序

--DML 更新數據操作:

1. 創建一個改變向量描述undo數據塊的改變;

2. 創建改變向量,描述數據塊的改變;

3 undo改變向量存入IMU日志緩沖區

Table改變向量存儲private log buffer

6. 將IMU 記錄和Pirvate log buffer記錄合並成一條改變記錄,結束事務

7.講重做改變記錄復制到日志緩沖區,並改變這個塊。

 

--IMU

IMU池有lacth保護,池個數=transation/10

當124KB空間使用滿了,回退到oracle9i的機制

 

--oracle數據塊的存儲信息

Tab 0 row 4 @0x1d3f

//表示第一個塊,記錄5,實際的存儲地址為@0x1d3f

Col 0:[2] c1 0a

//第一列,為兩個字符的空間,內容為c10a;

Lb: 0x2

//鎖信息

1.5 redo change vactor(重做改變向量)

1.5.1描述table數據塊改變改變向量

Kdo op code: urp row

//更新行片

Hdba: ox**** bdba:ox****

//hdba段頭塊的地址(段地址)

bdba: 塊地址

Itli:2

//目前事務使用第二個事務槽

Tabn0 slot 4

//表示更新第一張表,第五行數據

Ncol: 4 nnew:1 size:4

//要更新的記錄有4列,更細其中1列,長度增加4;

Col 2 [10 ] 59 59 ….

//更細的為第二列,增加之後長度為10個字符

 

1.5.2 描述數據塊undo動作的undo記錄及undo數據塊最終變化的重做改變向量

不同於數據庫改變向量之處

Ncol: 4 nnew:1 size:-4

//undo的時候,長度減少4

Col 2 [6] 78 78..

//原始數據第二行為 6個字符

 

--undo塊的重做改變向量,描述undo記錄的重做改變向量,所以和undo記錄的最終值相同。

Dba(數據塊地址):ox00..

//undo表空間為數據文件2

記錄和undo的記錄一樣;

1.6 事務的ACDI

1原子性:a進程處理一個事務的中間(改變表1行4的數據),

B 進程訪問(表1行4):通過undo記錄來訪問舊數據。

2 一致性:進程看到的數據為:老狀態,新狀態,沒有中間狀態

3 隔離性(獨立性):

默認為:提交讀;

 

如a進程,B進程同時修改同一個數據塊。

4 持續性:待續;

 

--改變記錄頭:change recode header

Op:11.5 表示table redo改變向量

Op:5.2 表示事務的開始,

OP:5.1 表示undo改變向量

OP:5.4 事務結束

 

--讀一致性

(1)數據塊需要包含指向undo記錄的指針。事務a更新數據,事務b根據指針讀取undo記錄的原始數據。

(2)事務a1更新一行數據,事務a2更新另外一行數據,則產生兩條undo記錄,所以數據塊(比如包含一個表)要包含2個undo記錄的指針,才能保證事務b查詢整個表的結果為正常。

(3)oracle在每個數據塊內部只允許存放有限的指針(每個隊員一個改變塊的事務),ITL entries位置

(4)如果事務a對於數據塊(一張表)做了兩次更新:事務b根據ITL表的entry2找到undo記錄2,對事務b隱藏了事務a更新2操作。Undo記錄2裡面有指針指向ITL表entry1的指針;事務b通過undo記錄2 找到 ITL entry1 , 通過ITL entry1 找到undo記錄1;

這個事務b讀的表的數據,就屏蔽了事務a對於兩行的更改;

(5)事務b的內存中生成表的拷貝,然後將事務a的兩個undo記錄復制應用到拷貝上。

(5)讀一致性,針對一個表及這個表的所有undo記錄的指針鏈表

 

--回滾

(1)回滾是一個事務的歷史,需要一個事務所有undo記錄的正確排序的指針鏈表(比如對一行的一列,進行兩次操作,產生兩台Undo記錄);

(2)回滾和讀一致性的區別:讀一致性的是讀內存的數據緩存,讀完之後,迅速捨棄。

回滾是獲得當前數據塊,並且應用undo記錄來還原

當前塊,表示要寫入到磁盤上的版本;

因為是當前塊,所有改變要產生redo;

(3)如果undo記錄已經被回滾使用,則undo有個標記 user undo applied標記;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved