1. 程式人生 > >Oracle學習筆記 Oracle IMU及Redo Private Strands技術

Oracle學習筆記 Oracle IMU及Redo Private Strands技術

Oracle 學習筆記 Oracle IMU及Redo Private Strands技術

這節看一下undo裡面一個新的機制叫IMU機制

先簡單回顧一下oracle的傳統的undo機制以及它所面臨的問題

一)傳統的undo塊

在傳統裡面oracle對待undo表空間和普通表空間它是一視同仁的都一樣的

一個事務開始的時候
在一個相對空閒的undo回滾段的段頭的事務表裡面獲得一個槽位
把事務資訊寫上

有可能

第一、段頭塊發生IO
這個段頭不在記憶體裡面
就需要通過io把它放到記憶體裡面去

第二、新的回滾塊發生IO
又獲得一個undo回滾塊
有可能undo回滾塊不在記憶體裡面
需要發生io

第三、正在使用的回滾塊發生IO
開始修改資料塊
把資訊寫到回滾塊裡

在這個時候oracle可能出現rollback或者一致性讀
要讀資料塊和回滾塊

有可能oracle在cr的時候在構造一致性塊的時候
要讀某個回滾塊的時候,這個回滾塊已被寫到了磁碟上

oracle在對待undo表空間中的block即undo表空間的資料塊的時候
和對待普通的資料檔案的資料塊的時候是一樣的
既然一樣它就有可能被dbwr寫到磁碟上

既然寫到磁碟上了它就成乾淨了
既然乾淨了它就可能被再次使用
被使用被覆蓋以後
下次再使用這個undoblock的時候就需要重新從磁碟調

在傳統的undo的技術裡面
oracle將undo表空間和普通表空間等同的對待
所以存在剛才重新從磁碟調的問題

undo對系統的影響很大
有可能導致資料庫系統的效能變得慢一些
這是傳統的undo技術可能會帶來的問題

二)IMU技術產生原因

oracle根據使用undo塊需從磁碟調取的問題推出一個技術叫IMU技術
IMU(In Memory Undo)

在使用IMU和不使用IMU的結構裡面
undo段以及段頭的事務表都是有的
唯一不同的地方有了IMU buffer

IMU機制和普通機制不同

針對每一個事務
oracle在sharedpool中分配一個IMU buffer
這個buffer用來記回滾資料且只記回滾資料

以前回滾資料在回滾段裡面
我們要使用回滾段的時候需要去buffercache找一個buffer
這個buffer沒有的話需要從磁碟調進來,需要物理io

oracle使不使用IMU主要影響的不是回滾段段頭和事務槽
它們該怎麼用怎麼用,該怎麼獲取還怎麼獲取
唯一不同的地方是回滾塊
原來是當事務需要回滾塊的時候去undo表空間找回滾塊
會發生物理io

現在oracle一個事務開始的時候
在sharedpool裡面分一個IMUbuffer
然後將所有的回滾資訊全部寫到IMUbuffer裡面去
這個IMU buffer是憑空從sharedpool分出來的
不是從undo表空間提出來的塊

對oracle來講只要是使用了imubuffer
當它需要回滾塊的時候不需要讀磁碟
直接從sharedpool裡面分IMUbuffer
然後回滾資訊寫到IMU buffer裡面去

記住imubuffer分配以後
回滾資訊往裡寫的時候也要產生redo
因為回滾資料需要寫redo

但是imubuffer減少了物理io
它直接分配imubuffer

這就是imu技術的一個特點
也就是最核心的東西
一個事務開始以後
當它需要回滾塊的時候
它不是從磁碟調取回滾塊,它直接分配imu buffer,直接往裡寫資料
別的都一樣

三)IMU作用

被修改的資料塊指向imu buffer

這裡修改了三個塊
產生了三個imu node,它們組成imu buffer

將來

第一、我回滾的時候
回滾資料直接從記憶體裡IMU用就可以了

IMU不會寫到磁碟上,始終在記憶體裡面

第二、產生一致性讀的時候
直接用imu buffer就行了

第三、imu node也產生redo
既然產生redo了
例項崩潰以後這些塊也會被恢復出來,也可以例項恢復

sharedpool裡面有imubuffer
一個事務分配一個imubuffer
一個buffer裡面會有很多的node
一個node就相當於一個block

四)Private Redo Strands

這裡有三個imubuffer
就是有三個事務

根據三個事務在sharedpool裡面又分了三個日誌區
日誌區針對每個imu buffer產生的日誌
直接在sharedpool裡面叫Private Redo Strands

imubuffer修改產生的日誌
直接寫到對應的那個Private Redo Strands日誌區裡面去

原來的日誌是在pga裡面產生然後寫到logbuffer裡面去,再寫到redolog裡面

針對imubuffer產生的日誌不是在pga裡面產生的
是在private redo strands針對每個buffer產生一個日誌區

針對imubuffer產生日誌寫到日誌區
最終由lgwr寫到磁碟上

private redo機制是配合imu buffer
這兩個東西都是在sharedpool產生

imu好因為減少物理io,提高了對undo的使用效率

五)IMU最終去處

imu buffer在sharedpool產生的日誌
針對imu專門產生的日誌用lgwr寫到磁碟

imubuffer裡面的資料寫滿的時候
這些資料會被寫到undoblock裡面去
最終它還要被寫到SGA的buffer cache中的undobuffer裡面去
從undobuffer再寫到磁碟上

也就是最終我的undo資料還是要儲存到undo段裡面

undo資料產生在imu裡面
但是imu是個快取,將來資料庫關了快取就沒了
其實最終的undo資料
是由imu寫到buffercache,然後buffercache再寫到undo段裡面去
最終還要寫回磁碟來

從imubuffer往buffercache裡面寫的時候還會繼續產生日誌
寫這個日誌比Private Redo日誌就少多了,它進行了優化和合並

imu和private redo strands兩個機制合起來帶來的好處
第一、事務在獲取undoblock的時候速度變快
第二、在cr讀的時候速度變快
特別是對cr讀,imubuffer這個技術非常的好
imu可以大幅的提高我們cr讀一致性讀的速度

這就是我們為什麼使用imu技術

六)判斷IMU是否啟用

oracle對imu會自動的啟用和關閉

我們使用語句
select * from v$sysstat where name like ‘%IMU%’;
查和imu相關的一些數值

結果

SQL> select * from v$sysstat where name like '%IMU%';

STATISTIC# NAME                                          CLASS      VALUE    STAT_ID
---------- ---------------------------------------- ---------- ---------- ----------
       230 IMU commits                                     128       9564 1914489094
       231 IMU Flushes                                     128      21577 2099506212
       232 IMU contention                                  128         31 2909373607
       233 IMU recursive-transaction flush                 128         19 2591100633
       234 IMU undo retention flush                        128          0 2087226422
       235 IMU ktichg flush                                128          0 1206609541
       236 IMU bind flushes                                128          0 2756376339
       237 IMU mbu flush                                   128          0 3723686946
       238 IMU pool not allocated                          128       2957  659017805
       239 IMU CR rollbacks                                128       1158 2225124543
       240 IMU undo allocation size                        128   43425124  244193920
       241 IMU Redo allocation size                        128   11598436 3945654623
       242 IMU- failed to get a private strand             128       2957 2412863545

13 rows selected.

查出了當前一些和imu相關的一些數值
過段時間再查一次

SQL> select * from v$sysstat where name like '%IMU%';

STATISTIC# NAME                                          CLASS      VALUE    STAT_ID
---------- ---------------------------------------- ---------- ---------- ----------
       230 IMU commits                                     128       9670 1914489094
       231 IMU Flushes                                     128      21717 2099506212
       232 IMU contention                                  128         31 2909373607
       233 IMU recursive-transaction flush                 128         20 2591100633
       234 IMU undo retention flush                        128          0 2087226422
       235 IMU ktichg flush                                128          0 1206609541
       236 IMU bind flushes                                128          0 2756376339
       237 IMU mbu flush                                   128          0 3723686946
       238 IMU pool not allocated                          128       2957  659017805
       239 IMU CR rollbacks                                128       1162 2225124543
       240 IMU undo allocation size                        128   43919548  244193920
       241 IMU Redo allocation size                        128   11745848 3945654623
       242 IMU- failed to get a private strand             128       2957 2412863545

13 rows selected.

如IMU commits和IMU Flushes這兩個統計屬性的VALUE
這兩個值

第一次結果

   230 IMU commits                                     128       9564 1914489094
   231 IMU Flushes                                     128      21577 2099506212

第二次結果

   230 IMU commits                                     128       9670 1914489094
   231 IMU Flushes                                     128      21717 2099506212

比較看出數值正在增加
這樣不停地增加的話說明oracle的imu機制是啟用了

IMU Flushes:
當sharedpool裡面的imubuffer快滿了的時候
它會往buffercache裡面寫,就是imu Flushe

IMU commits:
當事務提交的時候當commit的時候
sharedpool中imu的日誌會往磁碟寫,imu也往buffercache中寫
這叫IMU commit

只要這兩個值存在增加,說明oracle在使用imu技術

在rac和stream裡面imu是被禁止的,被自動禁掉了
目前為止
imu技術沒有被oracle大張旗鼓的去宣揚,說明它帶來的效能還是有限的
總之大家只要知道這個技術就行了

這兩個技術
Oracle IMU機制
Oracle private redo strands機制
合起來使用
帶來最大的好處是:oracle構造cr塊的速度明顯變快

七)什麼是新技術

這節課老師講了一個oracle中出現的新技術
不管它新不新它是一個技術
在這裡描述一下計算機新技術

技術這個詞對我們來說是非常熟悉的,在生活工作中很多方面經常地碰到
對這個詞有很多種解釋,不一而同

其實把技術這個詞拆開,就可以知道它的含義

技:是人在勞動中改造事務或製造事務的一系列行為
術:是系統化了的實現目的的方法
技術就是一種行為方法

它的基礎是積累過的知識,表現出來是有目的的行為,用來作用於事物,最終產生出一個結果
技術是否可用或它實現的程度及影響的好壞以結果為標準

技術是在勞動實踐中人們總結或創造出來的,並最終將它使用到實踐中
它有它產生的基礎和作用的範圍
更換了作用基礎或超出了能力範圍,它會失去作用,更可能的是產生壞的作用。

每個技術都由人來執行,人不同,能力和掌握程度有差別
影響到技術可否執行和執行的程度和執行的效率

處理同一件事可能有很多不同的技術
都同樣是人們的總結,但包含的行為和方法會有所區別

技術是用來滿足某種需要並逐漸形成的
用來節約勞動力和產生更高階的產品

同一個實現目標,會有高階的和低階的實現方式
就是技術本身有高階和低階之分

一個高階技術
往往建立在很多的低階技術的累積和組合之上
或者它處理的事物較高階,在一個層級較高的地方

每個技術要形成都有一個在不斷實踐中的沉積過程
起因往往是解決一個片面的問題
技術有高低之分,作用有好壞之別

技術沒有萬能的
在使用時仔細認真的推衍,一般都會產生錯誤
都會有不好的結果和碰到很多它解決不了的事情

一個技術只能說它能做到什麼,而絕大部分是它做不到的

而新技術是在已有技術上產生出來的
目的同樣也是為了解決一個具體的問題
內容有的有創新而大部分只能說是對原來的技術進行了一些重組
新技術同樣有高低之分,作用也有好壞之分

計算機中包含的已有技術很多
有一個產生新技術的很好的溫床
新技術自然的前仆後繼地產生

其中最好的技術是對計算機本身全面的瞭解後
總結了前人的成就
權衡過使用中的各種消耗
而又儘量避免對計算機系統的損毀
並經過無數的實踐
一步步的積累沉澱產生的

而一般情況下這種好的新技術是很難產生的

在計算機中常發生這種情況
一個所謂新技術出現後
在使用了一段時間後
發現這個技術早已經有了

一個新技術出現一般的情況是這樣的

在它解決一個片面問題時,不想已破壞了其它方面的穩定
或者問題從根本上並沒有解決
或者一個技術從頭至尾只是個設想,紙上談兵,連一個實現的結果都沒有就推出了
當然這種虛構的技術什麼也做不了

一個再成功的計算機技術
對計算機也只有片面的提升,並且只解決了片面的問題

一個不太好的新技術
從表面看也許沒有毛病,它宣稱解決了一件事情
並且往往在執行時也許達到了某個目標
但最常同時發生的事是影響了計算機的其它方面或帶來了破壞

有人覺得計算機是萬能的,什麼都可以解決
有些問題沒有解決只是沒有相關的技術

事實並非如此
計算機從硬體來講本身它是有限的

有有限的儲存空間、有限的功能、有限的效能

從軟體來說也是有限的

有限的數字範圍、有限的指令個數、有限的程式長度

所以這些有限的資源不是什麼事都可以解決
而是絕大部分事它做不了

比如計算機中的資源耗盡的問題從來就沒有人解決了
包括記憶體耗盡、儲存耗盡、cpu耗盡基本不能解決
所有的解決辦法都是儘可能的緩解

一個技術是不是一個有用的好的技術
需等待這個技術在實踐中沉積
看它最終停在什麼位置
有可能被埋沒,有可能消失了
最好的結果它停在了人們的視線中
這樣一個新技術就產生了

做一個自己認為的新技術並不難
而做一個被人們接受的新技術是個很困難的事,它是計算機人員的一個夢想

2017年8月28日
文字:韻箏