close
 

 Oracle Oracle instance Oracle database 組成

 

 Oracle 軟件存在的地方

cd $ORACLE_HOME

 

 Oracle DB文件存在的地方

cd /u01/app/oracle/oradata/DB名字

 

主要有3類文件

.ctl .dbf .log

 Oracle instance Oracle database

 

 1.DB起來以後,Oracle首先在記憶體裡面劃出一塊空間,這塊空間供Oracle使用,叫做oracle 記憶體

 

 2.啟動一堆Process,把這些記憶體和Process統稱Oracle instance

 RAC技術(多實例)

 

2台服務器,分別安裝Oracle軟件,各啟一個instance

 

2instance都訪問同一個Oracle DB

 

 一個USER要訪問DB,他連接到的是instance,通過instance來訪問DB

 

 假設有100USER要訪問這個DB,我們可以50個用戶訪問instance A50個用戶訪問instance B,達到負載均衡

 

 多個instance對應一個DB,這個技術就是RAC技術,提高DB性能和併發性

 Oracle Memory Structures(記憶體結構)



 
Process Structures (進程結構)

 Oracle有兩大塊:SGAPGA

SGA又稱為系統全局區(System Global Area)或是共享全局區(Share Global Area)

PGA又稱為私有全局區(Private Global Area)或是程序全局區(ProgramGlobal Area)

 

 對我們來說,最重要的是Shared poolDatabasebuffer cacheRedo logbuffer

 

 最容易出問題的是Shared pool  Databasebuffer cache

 

 顯示消息隊列,共享內存和信號量的信息

ipcs

 

 process可以訪問SGA內所有空間,SGA是所有process共享的記憶體空間

 

 Oracle 有一個大的PGA空間,當Oracle 每啟一個process時,就從PGA裡劃出一塊小的給process,對那個process來說,他會把共有信息寫進SGA,把這個process獨有的信息寫進自己的PGA

 

 

 查看是否有連上Oracleprocess和連接

ps -ef|grep ora

 

 USER透過IE連上Web服務器,Web服務器起來以後,會建立到Oracle instance的一堆連接,叫做連接池

Oracle instance針對Web服務器的每個連接,建立相應的Server Process

 

 有幾個session就會啟動幾個Server process

 

 假如這是一個拍賣網站,USER想要搜尋鞋子,Web服務器會從連接池中隨機選擇1個連接,然後Web服務器會產生一條對鞋子信息訪問的SQL語句,透過這個連接送到Oracle instanceOracle instance接到這個SQL語句以後,就會對他進行解析、執行、獲取數據,然後透過連接返給Web服務器,Web服務器接到所有信息以後,就會以Web介面的方式返給USER

 

 如果你站在Oracle DB的上方,你會發現那一堆連接就像一堆高速公路一樣,你會看到大量的SQL語句透過連接送過來,DB繁忙的在處理大量SQL語句,Oracle DB實際上在大量的接收SQL、解析SQL、執行SQL、獲取數據、返回數據,這是DB的日常工作狀態

 Oracle Instance Management(實例管理)

 Controlfiles(ctl):整個DB物理結構信息(例;有多少數據文件,這些文件分別放在哪裡)

     DB當前運行的一些狀態信息(例:哪個數據文件是在線正常的、離線不正常的,哪些日誌文件有什麼問題)

 

 Datafiles(dbf):放置Oracle 實實在在的數據文件(例:Table() )

 

 Redo logfiles(log):存放日誌,對數據文件所做的所有的修改,全部會以日誌的方式記錄,也就是說記錄著數據文件每一個數據塊的變化過程

 

 Shared pool:緩存SQL語句與其對應的執行計畫,減低硬解析(Hard parse)

 

 Databasebuffer cache:緩存dbf文件數據,減少物理IO

 

 Redo logbuffer:緩存重做信息(用於實例恢復)

 

 DatabaseWriter(DBWn):負責把server process修改的數據從buffer cache內存寫回硬盤

 

 LogWriter(LGWR):負責把Redo logbuffer內存寫回硬盤

 

 Checkpoint(CKPT):是週期性執行,把DB一些狀態信息寫到控制文件和數據文件的頭部,每個數據文件的頭部都記錄著這個數據文件的狀態信息,負責更新控制文件和數據文件的頭部,負載比較輕

 

 SystemMonitor(SMON):主內,對DB instance 內部進行清理和維護(例:假如Shared pool用的時間長了,產生很多小塊,這時SMON就會進行整合)

 

 ProcessMonitor(PMON):主外,對server process進行維護(例:有一個USER網路突然斷了,server process可能還一直為那個USER啟動著,PMON就會週期性的啟動,發現某個server process所對應的USER已經斷線了,這時就會對這個server process進行清理,包括把server process進程關掉、所對應的PGA內存空間清理)

 

 Archiver(ARCn):歸檔日誌(例:假如Oracle 3組日誌,Oracle 首先使用第1組日誌,再使用第2組,第3組記滿了之後,返回來用第1組,這時就把第1組給覆蓋了,也就是說最多能保存3日誌,如果我想保留更多日誌,於是就產生歸檔的一個工作模式,當第1組寫滿時,會啟動Archiver,把日誌歸檔到另一個目錄下,另起名字且大小一樣,第2 . 3組也一樣

,在歸檔這個位置保留了Oracle所有的日誌)

 

 SQL語句執行過程

 

 SQL Select語句為例(查詢)

 

 1.USER輸入一條SQL Select語句,語句透過網路到達DB instance

 

 2.DB啟動server process接收SQL語句,Oracle 認識SQL語句,但不能直接執行,要把SQL語句解析成執行計畫,才能執行

 

 3.server process拿著SQL語句首先進到Shared pool,查看在Shared pool中有沒有緩存

Shared pool有緩存

server process會在Shared pool中找到這條SQL語句,以及所對應的執行計畫,然後再去執行,減少了一個解析的步驟

Shared pool沒緩存

server process會進行一系列的操作,把SQL語句解析成執行計畫,然後才執行

 

 4.解析完成後,server process首先到buffer cache,找這個表所對應的數據在buffer cache有沒有

buffer cache有緩存

server process直接訪問buffer cache,把需要的數據取出,返給USER

buffer cache沒緩存

server processdbf去找數據,從dbf把數據取出,先讀到buffer cache裡面,才返給USER

 

Logic I/O     邏輯讀(L)

server process執行SQL語句時,buffer cache裡有要讀的那行數據,這種讀叫做邏輯讀,又稱內存讀

Physical I/O物理讀(P)

server process執行SQL語句時,在buffer cache找不到要讀的那行數據,server process到磁盤上去讀,叫做物理讀,又稱磁盤讀

 

我們希望邏輯讀要遠比物理讀的數量還多,進而提升訪問速度

  

IO命中率 =  ,命中率越高越好,但是命中率低肯定有問題,命中率高不一定沒有問題,假如邏輯讀10W,物理讀1W,如果這樣算命中率的話,命中率是不是也很高,但是物理讀過高,發生整體服務器過慢的問題

 

顯示目前的虛擬記憶體用量(1秒列出1共列10)

vmstat 1 10

  

Procs(進程):

r

運行隊列中進程數量

b

等待IO的進程數量

 

Memory(內存):

swpd

使用虛擬內存大小

free

可用內存大小

buff

用作緩衝的內存大小

cache

用作緩存的內存大小

 

Swap

si

每秒從交換區寫到內存的大小

so

每秒寫入交換區的內存大小

 

IO:(現在的Linux版本塊的大小為1024bytes

bi

每秒讀取的塊數

bo

每秒寫入的塊數

 

系統:

in

 每秒中斷數,包括時鐘中斷。

cs

每秒上下文切換數。

 

CPU(以百分比表示):

us

用戶進程執行時間(user time)

sy

系統進程執行時間(system time)

id

空閒時間(包括IO等待時間)

wa

 等待IO時間

 監測IO狀態,查看整理服務器IO是否繁忙(1秒列出1共列10)

iostat 1 10

 

 

tps

該設備每秒的傳輸次數(Indicate the number of transfers per second that were issued to the device.)。“一次傳輸”意思是“一次I/O請求”。多個邏輯請求可能會被合併為“一次I/O請求”。“一次傳輸”請求的大小是未知的。

kB_read/s

每秒物理讀取的塊數

kB_wrtn/s

每秒物理寫入的塊數

kB_read

讀取的總數據量

kB_wrtn

寫入的總數量數據量,以上單位都為Kilobytes

 SQL Udate語句為例(修改更新)

 

 1.2.3.都和Select語句一樣

 

 4.把要修改的表讀入buffer cache裡,server processbuffer cache內存裡對著表(table)進行修改,產生日誌server process把日誌寫進Redo logbuffer裡,由LogWriter(LGWR)負責把Redo logbuffer內存寫回硬盤

 

 5.修改完後內存裡數據就和硬盤的數據不一樣,就交給DatabaseWriter(DBWn)把數據從內存寫回硬盤

 

 server process只負責讀取數據,並不負責把數據從內存寫回硬盤,DBWnLGWR負責,因為server process是直接對USER服務的,如果server process慢的話,USER就會感到速度慢,我們就希望server process去做最有意義的工作,對一些後臺能夠做的事情,就交給後臺來做,得到一個最好的用戶體驗,USER並不關心你什麼時候寫回硬盤,只關心我修改某個數據,數據修改好了,快速的得到結果,所以Oracle background process 的概念

Buffer cache數據情況

Pinned

已連接

server process對內存裡的數據塊讀寫的瞬間,速度非常快

Clean

乾淨

一開始數據塊從dbf讀到內存,兩個數據是一致的

 Free orunused

空閒或未使用

空塊

 Dirty

server process將內存裡的數據塊進行修改了,那內存數據和硬盤數據就不一致了,不一致的話就需要寫回硬盤,寫回去後兩個數據又變成一致的

 

 當我要把數據讀進內存時優先選擇 Free orunused,用完了再使用Clean,如果內存裡全部是Dirty,而我還要使用內存時,就會觸發DBWR,把內存裡的數據寫回硬盤,寫回後就變成Clean,就可以再次使用了

 

 

所有資源作為教學用,無任何商業用途!!

 

    歡迎轉載,但務必註明出處!!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 arkai 的頭像
    arkai

    Game & Web Design

    arkai 發表在 痞客邦 留言(0) 人氣()