1. 程式人生 > >oracle學習筆記 Oracle日誌原理剖析

oracle學習筆記 Oracle日誌原理剖析



oracle學習筆記  Oracle日誌原理剖析

一)一致性和效能

日誌是所有資料庫的一個很核心的內容很重要
它關係到資料庫的資料的一致性

目前大家在使用的我們可看到的有幾個資料庫
有oracle、sqlserver、mysql、db2還有以前的sybase
這所有的資料庫它們的日誌原理幾乎都一樣

綜觀現在在用的資料庫基本內容上是基本一樣的
都由最基本的關係資料表組成
都用sql基本語法進行各種庫主體資料的操作

基本的不同產生於對這些基本功能的執行上
自己有自己的實現方法和程式碼
高階功能的不同主要產生在對一致性的保護和對效能的提升
對基本功能組合或新增一些額外功能也會產生其它一些屬於自己的高階功能
其實這些各種功能它們的原理也是基本相同的
區別也只在實現方法和程式碼

在資料庫體積來講
小的資料庫在高階功能方面會有所刪減
大的資料庫會有更多隻屬於自己的高階功能

另外一個比較明顯的區別是應環境產生的
資料庫可使用的作業系統型別越多其適應性越強

細看所有功能類似的軟體
功能基本也是類似的
使用過並且熟悉了以後會發現最大的區別只是在外觀
但它們在市場上處於競爭狀態,競爭使用者的使用和資金

日誌和效能沒有多大關係
但是日誌和資料庫的資料的一致性關係非常大

一個軟體其它方面沒有變動的情況下
在提高它的效能的時候
一定會損失掉一部分穩定性

軟硬體都是如此

你盲目的給cpu超頻,就很容易造成系統的崩潰

為了提高硬碟的寫入速度,有人採取減少資料效驗的辦法
如有些格式的音訊視訊檔案為了讓它傳輸的更快而不進行資料效驗
這些檔案在進行了多次網路傳輸後多數都已經損壞了

在網路上為了讓網路視訊播放的更快
在不斷的降低視訊的解析度而視訊越來越模糊

想讓資料庫處理資料的速度更快,相同的環境下也只能降低對資料正確性的保護

但是oracle很少有人提起如何提高它的效能只是講如何優化它
對本人來講想了很長時間也沒想到在它內部怎麼直接提高它的效能
可能因為oralce是個成熟的軟體
內部的各方面組合已經進行了最大的平衡
對一個方面提高效能往往會影響其它方面的效能
所以不能說要它提高效能
能做的只有統觀全域性進行相對當前軟硬體配置的最平衡的優化

對oracle在網路上有一些提高效能的方法
如直接提高硬體的效能,相同硬體的效能肯定是以喪失穩定性為代價的
而且一般效能只能在一定範圍內提升,想更多的提高反而適得其反
舉一個明顯的例子
你可以在分配記憶體的時候把記憶體都分配給oracle
但是這時作業系統就沒有記憶體了,作業系統崩潰oralce也沒法運行了
對oracle軟體方面的效能提升,都集中在所執行的客戶程式的編寫上
主要讓客戶編寫程式時更符合oracle軟體環境
讓客戶程式執行的更快更安全
一個針對優化過的程式效能會遠遠高於不符合oracle執行環境的程式
這就要求程式設計師對oracle基本結構和功能非常的熟悉
以最佳的方式選擇oracle元件及功能的使用
它沒有改變資料庫,只是讓客戶程式最優化的使用oracle資料庫
再次提出直接對oracle提升效能是有風險的
一旦錯誤就會造成資料的丟失,
而且用這個軟體的使用者資料往往都是非常重要的
哪怕丟失一個位元組都有可能造成巨大的損失
所以選擇的時候,還是一致性重要

我們知道對oracle資料庫或者說對任何資料庫來講
我們學習的重點無非就是兩個

第一個就是資料庫的資料的一致性
這個我們要保障特別是對dba
所以我們要研究它而且是我們深入研究的課題

大家聽完老師整個體系的課以後
大家會對資料庫的一致性應該說有非常深的瞭解
不會出現一些因為誤操作而產生的資料的一致性的問題
這個老師相信肯定沒有問題

另外就是我們讓oracle執行的更快
這是我們學習的第二個目標

這兩個目標如果都很熟的話
別人一提資料庫的一致性的話你有一整套的理論體系來支撐你
優化的時候也有一整套的理論體系和相關的一些實踐來支撐你
這說明你oralce學的不錯了

所以說學oracle不要看我們學了這麼多的內容
最終還是糾結到兩大塊
第一是一致性
第二就是資料庫的效能

oracle日誌只是和一致性有關係和效能沒有什麼關係

講到這個地方給大家強調一下,接下來學日誌的時候就有相關的側重點了
oracle的資料庫的一致性從某種意義來講重要性要遠遠的高於oracle的效能
資料庫可以慢一些,但是資料的一致性一定不能出問題
這是個原則性問題

我們從一開始講到最後一節課的時候
中間都會穿插著一些關於資料庫一致性問題
我們講oracle任何一個知識環節的時候都會涉及到它
特別從日誌開始講了以後
以後資料庫的一致性問題會持續的給大家灌輸給大家去講

二)oracle日誌的原理

講了日誌的原理以後大家就知道oracle為什麼需要日誌了

oracle資料庫啟動後
有一堆dbf檔案對應記憶體中的buffercache
記憶體中還有logbuffer對應磁碟中的redolog日誌

客戶的sql語句進入資料庫以後要執行
而對oracle資料庫來講是有非常多的連線過來
每個連線會有大量的sql語句
就是資料庫在同一時間點會有大量的sql語句在執行

sql語句有查詢的有增加的有刪除的有修改的
這就是我們常說的增刪改查
我們先不關心這些

1)史記講解法

buffercache裡面有一堆的buffer

我們這麼來理解oracle日誌產生的過程
假設在buffercache上站著一個人
它能夠看到buffercache裡面所有的buffer
而且這個人眼睛非常的快

我們來看buffercache的狀態
對buffercache來講大量的sql語句執行
在一個時間點其中的一個buffercache中的buffer塊給改了
在下個時間點另一個buffercache塊給改了
這兩個時間點差了幾毫秒或幾微秒
在另外時間點其它的buffer塊給改了

就是說在一個時間段內buffercache裡面有大量的buffer被修改
然後這個人就拿著一個本在記錄
嚴格的按照時間來記錄buffer的一個改變過程

比如在一個時間段
一個buffer給改了,它馬上看到了,看到以後,馬上在日記本里面記下來
記下來這個buffer在那個時間點發生了什麼改變
剛記完以後又一個buffer給改了
馬上在日誌裡面在本里面記上在這個時間點那個buffer發生什麼樣的改變

也就是這個人
以極快的速度嚴格的按照時間順序來記錄buffer的一個改變歷程
這些日誌會記錄到logbuffer裡面去

最後logbuffer會通過LGWR這個程序寫到磁碟上的redolog裡面去

先寫第一個redolog
第一個redolog寫滿以後再寫第二個然後再寫第三個

好我們再來回顧一下

日誌的記錄過程,日誌的產生的過程就這麼認為

在buffercache上面有一個人
拿著一個小本
這個人眼睛非常快,記錄的非常快
它能夠看到buffercache裡面所有的buffer
這個人就嚴格的按照時間順序來記錄buffercache裡面的所有的buffer的一個改變過程

也就是說
我們的日誌記錄的是buffer的改變,並且按照時間順序記錄的
這個人就幹這麼一件事情
在記錄buffer改變的時候
它不關心是哪個會話上來哪個sql語句修改的誰
它只關心哪個buffer改變了
所以說日誌裡面記錄的就是buffer裡嚴格的按照時間順序記錄的buffer的整個改變過程

這個人我們可以叫史學家
我們知道歷史上有叫史學家的角色
它天天跟在皇上的身邊
皇上的一言一行、一舉一動每一個決策他都會記錄下來
這個史學家是用來約束皇上的
他嚴格的、實事求是的去記
它並不去帶著任何個人感情色彩
皇上做著的任何一件事情記錄下來
皇上的整個的一個人生按照時間的軌跡去記錄

這是我們講通過史學家的一個例子
來講日誌的產生過程

講完以後就是用一句話來概括
oracle的日誌是嚴格的按照buffercache裡面的buffer的改變的時間去記錄的

首先日誌記錄的是buffer的改變,第二它嚴格的按照時間去記錄的
我們用兩句話可能更好一些
第一日誌記錄的是buffer,日誌是以buffer為單位來記錄的
第二是按照buffer它改變的時間順序來記錄的

也就是這個史學家在上面不停的看哪個buffer改了馬上記
先這麼認為就可以了

這就是日誌
我們後面講的時候慢慢就理解一些oracle記錄日誌的一些記錄方式
這對以後學習非常的有幫助

這是我們通過 史記講解法 來講解

2)日誌記錄方式

我們知道日誌記錄方式是以buffer來記錄的
它到底怎麼記錄的呢

比如buffercache裡面的一個buffer改變了
記錄buffer的改變有很多種方式
oralce要記錄這個buffer的改變

第一、記錄buffer的地址也就是磁碟中資料塊的地址

第二、時間點,哪個時間改變的

第三、對這個資料塊做了什麼改變
如資料塊改變是做了insert改變還是做了delete改變
還有insert插入的資料是什麼
做了delete刪除的資料是什麼

對資料塊的改變無非就是增加資料和刪除資料
另外修改資料對buffer來講就是刪除一行資料然後再插入一行資料
是把這一行先delete然後再insert然後組成一個update

比如我們執行了一個delete的sql語句
它刪除了一萬行
這一萬行在一千個塊裡面
這時我們就可以大體粗略的認為oracle產生了一千條日誌
因為針對每一塊都產生一條日誌
這就是日誌產生的方式

日誌裡面有資料塊的地址、改變的時間、還有是怎麼改變的
怎麼改變就是增刪

還有隻改了一行資料但是產生了幾十k的日誌
這很有可能
所以oracle的日誌的產生的量還是很大的
以後我們還會去研究:
oracle的日誌到底產生的量是多大
oracle日誌的產生會不會產生效能問題

日誌對效能的影響
在oracle的等待事件wait events會有涉及
日誌對效能一般沒有影響
對oracle資料庫的修改會產生大量的日誌
這個日誌需要從logbuffer到redolog
到redolog就涉及到IO
有IO就可能有效能問題

這是日誌記錄方式
也講了oracle日誌工作會產生大量的日誌

三)實際日誌產生過程

實際的日誌產生的過程裡面會有一些效能的問題

老師在課程中畫了不少圖
他的圖很隨意但是應該說是有含義比較有意義
學生本人沒有把他的圖也畫下來是因為只想用文字來記述課程

記憶體有sharedpool,
buffercache、logbuffer對應磁碟上的dbf和redolog

oracle例項連線很多客戶會話
每一個會話都分到一個一小塊記憶體,這塊記憶體叫PGA
客戶會話oracle用server process處理,每個serverprocess都會產生一個PGA
都有可能修改buffercache中的一個buffer

server process會將磁碟block塊讀到buffer裡面去
會從記憶體buffer裡面讀資料到cpu裡面去
也會修改buffer的資料
所有的這些訪問都是serverprocess來做的
當然髒資料塊寫回的時候是使用的DBWR程序

serverprocess每修改一次buffer的時候它會自己產生日誌
先寫到自己的PGA裡面去
當寫到一定的程度的時候,它再從PGA寫到logbuffer裡面去
第二個serverprocess也一樣
當它修改某個buffer的時候它也會產生日誌
也會從PGA寫到logbuffer裡面去

實際的日誌產生的過程
是serverprocess修改buffer產生日誌寫到自己的PGA裡面去
在某些觸發的條件下
會把日誌寫到logbuffer裡面去

logbuffer最終又通過程序LGWR寫到磁碟的redolog裡面去

這就是實際的日誌產生的過程


2016年10月27日
                                                                                                      文字:韻箏