▌ 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
▌2個instance都訪問同一個Oracle DB
▌ 一個USER要訪問DB,他連接到的是instance,通過instance來訪問DB
▌ 假設有100個USER要訪問這個DB,我們可以50個用戶訪問instance A,50個用戶訪問instance B,達到負載均衡
▌ 多個instance對應一個DB,這個技術就是RAC技術,提高DB性能和併發性
Oracle Memory Structures(記憶體結構)
Process Structures (進程結構)
▌ Oracle有兩大塊:SGA和PGA
SGA又稱為系統全局區(System Global Area)或是共享全局區(Share Global Area)
PGA又稱為私有全局區(Private Global Area)或是程序全局區(ProgramGlobal Area)
▌ 對我們來說,最重要的是Shared pool、Databasebuffer cache、Redo logbuffer
▌ 最容易出問題的是Shared pool 和Databasebuffer cache
▌ 顯示消息隊列,共享內存和信號量的信息
ipcs
▌ process可以訪問SGA內所有空間,SGA是所有process共享的記憶體空間
▌ Oracle 有一個大的PGA空間,當Oracle 每啟一個process時,就從PGA裡劃出一塊小的給process,對那個process來說,他會把共有信息寫進SGA,把這個process獨有的信息寫進自己的PGA裡

▌ 查看是否有連上Oracle的process和連接
ps -ef|grep ora
▌ USER透過IE連上Web服務器,Web服務器起來以後,會建立到Oracle instance的一堆連接,叫做連接池
Oracle instance針對Web服務器的每個連接,建立相應的Server Process
▌ 有幾個session就會啟動幾個Server process
▌ 假如這是一個拍賣網站,USER想要搜尋鞋子,Web服務器會從連接池中隨機選擇1個連接,然後Web服務器會產生一條對鞋子信息訪問的SQL語句,透過這個連接送到Oracle instance,Oracle 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 process到dbf去找數據,從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(進程):
Memory(內存):
Swap:
|
IO:(現在的Linux版本塊的大小為1024bytes)
系統:
CPU(以百分比表示):
|
▌監測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 process在buffer cache內存裡對著表(table)進行修改,產生日誌server process把日誌寫進Redo logbuffer裡,由LogWriter(LGWR)負責把Redo logbuffer內存寫回硬盤
5.修改完後內存裡數據就和硬盤的數據不一樣,就交給DatabaseWriter(DBWn)把數據從內存寫回硬盤
▌ server process只負責讀取數據,並不負責把數據從內存寫回硬盤,DBWn和LGWR負責,因為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,就可以再次使用了
▌所有資源作為教學用,無任何商業用途!!
歡迎轉載,但務必註明出處!!