歡迎光臨
每天分享高質量文章

乾貨分享 | 史上最全Oracle體系結構整理

本文對Oracle體系結構做了詳細的整理彙總,供大家參考學習。

 

一、Oracle組成


 

oracle分兩塊,oracle資料庫軟體和oracle資料庫。oracle資料庫軟體位置透過以下命令可以找到:

 

[oracle@redhat4 ~]$ cd $ORACLE_HOME[oracle@redhat4 db_1]$ pwd/u01/app/oracle/product/10.2.0/db_1[oracle@redhat4 db_1]$ lsassistants   has               listener.log  oracore           root.shbin          hs                log           oraInst.loc       root.sh.oldcdata        install           md            ord               slaxcfgtoollogs  install.platform  mesg          oui               sqljclone        inventory         mgw           owm               sqlnet.logconfig       javavm            network       perl              sqlpluscrs          jdbc              nls           plsql             srvmcss          jdk               oc4j          precomp           startup.logctx          jlib              odbc          racg              sysmandbs          jre               olap          rdbms             uixdemo         ldap              OPatch        redhat4_jiagulun  wwgdiagnostics  lib               opmn          relnotes          xdk

 

最後ls命令列出了資料庫軟體的內容。

 

oracle資料庫的位置

 

[oracle@redhat4 db_1]$ cd $ORACLE_BASE[oracle@redhat4 oracle]$ pwd/u01/app/oracle[oracle@redhat4 oracle]$ cd oradata/jiagulun[oracle@redhat4 jiagulun]$ lscontrol01.ctl  example01.dbf  redo03.log    temp01.dbfcontrol02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbfcontrol03.ctl  redo02.log     system01.dbf  users01.dbf

 

ls命令顯示了資料庫的內容。

 

oracle資料庫軟體的檔案和oracle資料庫的檔案可以分開儲存到兩個地方。

 

我們最常使用的幾乎全部的在生產環境裡面的存放結構是:oracle資料庫軟體存放在伺服器本地硬碟上而oracle資料庫存放在儲存上。

 

oracle資料庫講的就是/u01/app/oracle/oradata/jiagulun目錄下的檔案。這些檔案就組成了oracle資料庫。有三類檔案,ctl檔案、log檔案以及dbf檔案。

 

二、Oracle實體


 

oracle資料庫是實實在在儲存在硬碟上的三類檔案。oracle資料庫可以啟動起來,oracle啟動起來以後,首先在記憶體劃出一塊空間出來,供oracle使用,這塊記憶體叫oracle記憶體。第二件事情,啟動一堆行程,我們把記憶體和行程統稱oracle實體。

 

oracle資料庫啟動起來以後會產生一個oracle實體。oracle資料庫關閉後就沒有oracle實體了。oracle實體是oracle資料庫記憶體和行程的總稱。

 

實體和資料庫一般情況是一個資料庫對應一個實體 1:1的關係。當然也有一些特殊情況,一個資料庫可以對應多個實體,如兩個實體對應一個資料庫,一般沒有單數,現在生產環境用的比較多的是兩個實體對應一個資料庫,也有四個實體對應一個資料庫,也有八個實體對應一個資料庫,有八個的現在用的比較少,雖然oracle支援。

 

例子:

有兩臺伺服器,一臺儲存。儲存中放oracle資料庫檔案,每臺伺服器都裝oracle資料庫軟體。每臺伺服器啟動一個實體,兩個實體都訪問儲存中的oracle,這就是1:2的關係一個資料庫對應倆實體。兩個實體同時都可以訪問oracle資料庫。

 

一個使用者要訪問資料庫,它連線到的是實體,透過實體來訪問資料庫。

 

如:一個資料庫有兩個實體,假設有一百個使用者要訪問資料庫,可以50個使用者訪問一個實體,另外50個使用者訪問另外一個實體。這是一種負載均衡的概念(使一起執行的裝置負擔的負載達到一個近似相同的狀態),

可提高資料庫效能和併發性。從理論上講,資料庫效能提高了兩倍。實際上在生產環境裡面我們會講,這個技術就是oracle的RAC技術。

 

一般的學習環境下是一個資料庫對應一個實體。

 

下麵要用到兩個linux命令:

 

1. ps命令

是Process Status的縮寫,顯示瞬間系統行程 (process) 的動態。它列出了系統中當前執行的行程,結果是個行程的快照,即執行ps命令的那個時刻的行程。

 

2. ipcs命令 

用途:報告行程間通訊設施狀態。共有三種設施型別:訊息佇列、共享記憶體和訊號量 

 

引數:預設列出全部三種設施資訊

 

-m 輸出有關共享記憶體(shared memory)的資訊

-q 輸出有關資訊佇列(message queue)的資訊

-s 輸出訊號量(semaphore)的資訊

 

 

1)資料庫啟動前

 

檢視有沒有oracle實體

 

[oracle@redhat4 db_1]$ ps -ef|grep oraroot      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1oracle    1794  1793  0 07:34 pts/1    00:00:00 -bashoracle    3906  1794  0 07:52 pts/1    00:00:00 ps -eforacle    3907  1794  0 07:52 pts/1    00:00:00 grep ora

 

結果中沒有oracle的行程

 

檢視記憶體狀態

 

[oracle@redhat4 ~]$ ipcs------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status
------ Semaphore Arrays --------key        semid      owner      perms      nsems------ Message Queues --------key        msqid      owner      perms      used-bytes   messages

 

沒有Oracle使用的記憶體

 

2)資料庫啟動後

 

[oracle@redhat4 db_1]$ ps -ef|grep oraroot      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1oracle    1794  1793  0 07:34 pts/1    00:00:00 -bashoracle    3964     1  0 07:54 ?        00:00:00 ora_pmon_jiagulunoracle    3966     1  0 07:54 ?        00:00:00 ora_psp0_jiagulunoracle    3968     1  0 07:54 ?        00:00:00 ora_mman_jiagulunoracle    3970     1  0 07:54 ?        00:00:00 ora_dbw0_jiagulunoracle    3972     1  0 07:54 ?        00:00:00 ora_lgwr_jiagulunoracle    3974     1  0 07:54 ?        00:00:00 ora_ckpt_jiagulunoracle    3976     1  0 07:54 ?        00:00:00 ora_smon_jiagulunoracle    3978     1  0 07:54 ?        00:00:00 ora_reco_jiagulunoracle    3980     1  0 07:54 ?        00:00:00 ora_cjq0_jiagulunoracle    3982     1  0 07:54 ?        00:00:00 ora_mmon_jiagulunoracle    3984     1  0 07:54 ?        00:00:00 ora_mmnl_jiagulunoracle    3986     1  0 07:54 ?        00:00:00 ora_d000_jiagulunoracle    3988     1  0 07:54 ?        00:00:00 ora_s000_jiagulunoracle    3994     1  0 07:55 ?        00:00:00 ora_qmnc_jiagulunoracle    4009     1  0 07:55 ?        00:00:00 ora_j000_jiagulunoracle    4013     1  0 07:55 ?        00:00:00 ora_q000_jiagulunoracle    4015     1  0 07:55 ?        00:00:00 ora_q001_jiagulunoracle    4031  1794  0 07:55 pts/1    00:00:00 ps -eforacle    4032  1794  0 07:55 pts/1    00:00:00 grep ora

 

結果中有了很多oracle的實體的行程,如ora_pmon_jiagulun 等以ora_開頭的行程。

 

記憶體狀態

 

[oracle@redhat4 ~]$ ipcs------ Shared Memory Segments --------key        shmid      owner      perms      bytes      nattch     status0x36010028 360448     oracle    640        287309824  23------ Semaphore Arrays --------key        semid      owner      perms      nsems0x7df2e688 229376     oracle    640        154------ Message Queues --------key        msqid      owner      perms      used-bytes   messages

 

記憶體中出現了oracle使用的記憶體塊:

0x36010028 360448     oracle    640        287309824  23

 

有了一塊280M的記憶體給了oracle。這是oracle啟動起來以後在記憶體裡面劃了一塊比較大的空間。oracle啟動起來以後會佔用記憶體和產生行程,這個得到了驗證。

 

三、oracle記憶體結構


 

oracle資料庫啟動起來以後oracle會在記憶體裡面劃出一部分空間,這塊空間被oracle所獨享所使用。這塊記憶體oracle給它起名叫SGA。一般譯為:system global area 或shared global area。

 

當啟動Oracle資料庫時,系統會先在記憶體內規劃一個固定區域,用來儲存使用者需要的資料,以及Oracle執行時必備的系統資訊。是Oracle Instance的基本組成部分,在實體啟動時分配。

 

SGA我們通常叫系統全域性區,或共享全域性區。這塊記憶體有六大塊。對我們來講最重要的是三塊:共享池、資料庫緩衝區高速快取、重做日誌緩衝區。對應的英文名:shared pool,database buffer cache,redo log buffer,這三塊空間是我們著重要討論和關心的,而這三塊最容易出問題的是 shared pool和buffer cache,所以我們更加關註共享池和資料庫緩衝區高速快取。

 

oracle啟動起來以後有兩大記憶體結構,一大塊叫SGA,一大塊叫PGA。SGA是共享的,PGA是給行程使用的。PGA(Program Global Area程式全域性區)是一塊包含一個服務行程的資料和控制資訊的記憶體區域。sga有六大塊組成:shared pool,java pool,large pool,buffer cache,redo log,stream pool.

 

oracle資料庫啟動起來以後還會啟動一堆行程。這些行程分兩大類,前臺行程和後臺行程。

 

如ps命令的結果中:

 

oracle   16269     1  0 10:59 ?        00:00:00 ora_pmon_jiagulunoracle   16271     1  0 10:59 ?        00:00:00 ora_psp0_jiagulunoracle   16273     1  0 10:59 ?        00:00:00 ora_mman_jiagulunoracle   16275     1  0 10:59 ?        00:00:00 ora_dbw0_jiagulunoracle   16277     1  0 10:59 ?        00:00:00 ora_lgwr_jiagulunoracle   16279     1  0 10:59 ?        00:00:00 ora_ckpt_jiagulunoracle   16281     1  0 10:59 ?        00:00:00 ora_smon_jiagulunoracle   16283     1  0 10:59 ?        00:00:00 ora_reco_jiagulunoracle   16285     1  0 10:59 ?        00:00:00 ora_cjq0_jiagulunoracle   16287     1  0 10:59 ?        00:00:00 ora_mmon_jiagulunoracle   16289     1  0 10:59 ?        00:00:00 ora_mmnl_jiagulunoracle   16291     1  0 10:59 ?        00:00:00 ora_d000_jiagulunoracle   16293     1  0 10:59 ?        00:00:00 ora_s000_jiagulun

 

這些是後臺行程;

oracle   16298 16154  0 10:59 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

 

是前臺行程。

 

在實際生產中,前臺行程的數量要遠遠大於後臺行程的數量。因為對oracle資料庫的每一個連線都會產生一個前臺行程,一般的對資料庫來講都有上百個連線,至少前臺行程上百個,後臺行程就十幾個,所以就oracle資料庫來講前臺行程的數量要遠遠大於後臺行程的數量。

 

對於SGA來講,所有的記憶體空間對所有的行程來講是共享的,每個行程可以訪問SGA所有的記憶體空間。所以說SGA是所有行程共享的一個記憶體空間。

 

實際的工作中,可能有些行程主要使用buffer cache,有些行程主要使用redo log,有一些單個記憶體池的單獨分配。但我們認為,oracle資料庫的所有行程共享記憶體SGA中的六大空間。

 

對單個行程來講,它除了能夠訪問這一大塊SGA以外,單個行程它有自己的行程空間,也是一塊記憶體空間,這塊空間從PGA來。

 

oracle新的版本裡面,oracle有一個大的PGA空間,oracle每啟一個行程就從這個大的PGA空間拿出一塊來給這個行程。對這個行程來講,它會把一些公共的資訊寫到SGA裡面去, 這個行程所獨有的私有的資訊寫到自己的PGA裡面去,每個行程都這樣從PGA分一塊。

 

四、oracle的行程結構


 

以上所說前臺行程就是說的oracle的伺服器行程server process,如我們用ps命令得到的結果中的一個行程:

oracle   22727 22726  0 15:24 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

 

就是伺服器行程,就是前臺行程,也叫server process。

 

下麵講一下oracle資料庫中的在工作中的一個連線結構。

 

執行環境中,資料庫伺服器上有 資料庫、資料庫實體,要連線資料庫必須連線實體。

 

執行環境中還有一個應用伺服器,如weblogic,websphere,jboss等應用伺服器。應用伺服器上有使用者開發的應用,如基於java的和基於web的應用。

 

我們的客戶端透過ie瀏覽器連線web伺服器,web伺服器同時又是一個應用伺服器。

 

web伺服器是給瀏覽器提供網頁的服務。而應用伺服器可以給訪問程式提供更多的資料,它可以擁有和訪問資料庫等資源並可以對自己得到的資料進行處理並傳回給訪問它需要它的程式。web伺服器實際是應用伺服器的一個特例,在網路上它使用的最多。

 

在web伺服器及應用伺服器(如weblogic)啟動起來以後,會建立一個到oracle資料庫實體的一堆連線。

 

與我們在客戶端使用sqlplus / as sysdba命令建立的連線類似,這個命令就是建立了一個到oracle資料庫的連線。如:

客戶端執行sqlplus / as sysdba

ps結果中對應的行程為

oracle   22727 22726  0 15:24 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOC       AL=YES)(ADDRESS=(PROTOCOL=beq)))

 

建立了一個連線,有了一個server process;我們再模擬幾個這樣的連線

 

在客戶端執行sqlplus system/oracle

 

我們在看ps的結果會又出現一個新的行程

oracle   25733 25732  0 16:18 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

 

我們有兩個連線,oracle就起了兩個行程。如果是一百個連線就是一百個行程。

 

weblogic啟動起來以後,會主動的發起對oracle資料庫實體的n個連線,數量可以在weblogic裡面設定,這n個連線叫連線池。然後我們看oracle資料庫實體,它針對weblogic的每一個連線,這個實體會建立一個相應的行程和它對應。也就是說weblogic向oracle實體建立了一百個連線,這個時候oracle實體就會針對這一百個連線啟動一百個oracle前臺行程。也就是一百個server process,也就是一百個伺服器行程,這時候,oracle實體裡面憑空多了一百個server process。

 

oracle在實際工作中的結構中包含連線池。

 

比如我們訪問淘寶網站,我們透過ie瀏覽器連線到淘寶的web伺服器上,也就是它的應用伺服器上。然後我們要買鞋子,比如要買什麼廠商的鞋子,我們在網上選中搜索條件以後點選搜尋。對淘寶來講所有鞋子的資訊在資料庫裡面沒有在web伺服器上,所有商品包括商品價格、商品的圖片 等等所有資訊都在資料庫裡面。

 

web伺服器上面沒有資訊。

 

使用者連線到應用伺服器上以後,它會進行一些操作,它要搜鞋子,鞋子的資訊在資料庫裡面。當這個使用者想要搜鞋子資訊的時候,應用伺服器會做一件事情,會從應用伺服器與資料庫建立的這n個連線裡面,隨機的選擇其中的一個連線,應用伺服器會產生一條SQL陳述句,一個對鞋子訪問的SQL陳述句,透過這個連線送到oracle;oracle接到這個SQL陳述句以後,就會對它解析執行,然後獲取資料;然後再透過這個連線返給應用伺服器。應用伺服器接收到所有的鞋子資訊以後,就會以web介面的方式,再返給使用者。

 

我們使用者無形中訪問了oracle資料庫,但是使用者沒有體會到,使用者也不需要oracle資料庫的知識。

 

它只需要透過瀏覽器,連線到web上,根據自己查詢的條件,比如它要尋找某個牌子,尋找李寧牌運動鞋,碼在37到42之間,型別是籃球運動鞋。

 

瀏覽器有了這些條件有了以後,一點搜尋,web伺服器、應用伺服器會自動的從眾多的連線中找一個空閑的連線,同時會產生一個帶條件的,對鞋子訪問的一個SQL陳述句。SQL陳述句透過連線發到資料庫實體。oracle資料庫會接到這個SQL陳述句,然後對SQL陳述句解析執行,獲取到資料,透過連線再傳給應用伺服器。應用伺服器接到以後,然後再傳給我們的消費者。

 

這就是整個的一個過程。

 

如果你站在oracle資料庫的上方,你會發現:這一百條連線,就像一百條高速公路一樣。高速公路另一端是應用伺服器,你會看到大量的SQL陳述句,透過連線送過來。同時你低頭再看看,你會發現資料庫在處理大量的SQL陳述句。處理完了以後,將所有的結果,透過相應的連線再送回去。

 

也就是說,我們的oracle資料庫,實際上在大量的接受SQL,在解析SQL,然後執行SQL,然後獲取資料。把資料再返給應用伺服器。這就是從宏觀上去看,oracle日常的工作狀態。

 

使用者行程就是在使用者客戶端產生的行程,我們根本不關心這個。我們只關心oracle資料庫裡面的最前端的伺服器行程,每個伺服器行程都對應一個PGA,我們還關心SGA和後臺行程。但是要知道使用者行程是使用者端的行程。

 

五、oracle整體的體系結構


 

oracle實體有SGA,SGA中有六個池子,還有五個後臺行程。

 

oracle有三大檔案,控制檔案、資料檔案、重做日誌檔案。還有歸檔日誌檔案。

 

oracle有六大記憶體塊,共享池、streams池、大型池、java池、資料庫緩衝區高速快取、重做日誌緩衝區。

 

有五大後臺行程,檢查點(CKPT)、系統監視器(SMON)、行程監視器(PMON)、資料庫寫行程(DBWn)、日誌寫行程(LGWR)。以下簡單講五大行程作用。

 

三類檔案裡面分別放的資訊

 

控制檔案存放的了很多資訊,先簡單的講兩類資訊:

 

1. 整個資料庫的物理結構資訊,在控制檔案裡面記錄著。

所謂的物理結構,主要是資料庫有多少資料檔案,資料檔案分別放在什麼位置。oracle資料庫有多少redolog檔案,這些檔案分別放在什麼位置。

 

2. 控制檔案中還記錄著資料庫當前執行的一些狀態資訊。

比如說那個資料檔案是線上正常的,哪些資料檔案是離線不正常的。

oracle資料庫當前正在使用著眾多重做日誌檔案的哪一個,哪一些日誌檔案有一些問題。

資料庫當前執行的一些狀態資訊,也記錄在控制檔案中。

 

控制檔案我們目前主要講兩類資訊:

1. 資料庫的物理結構資訊。

2. 資料庫的當前執行的一些狀態資訊。

 

資料檔案裡面放的是oracle實在的資料檔案資料。oracle資料主要放的是表,表資訊就放在資料檔案裡面,控制檔案會很小,但是資料檔案會很大。因為oracle所有的資料全部放在資料檔案裡面。

 

重做日誌檔案

日誌檔案裡放的是日誌。日誌記錄的是,oracle對資料庫、對資料檔案所做的所有的修改,全部會以日誌的方式記錄在日誌檔案中。它記錄的是資料檔案的變化過程。

 

這是三大類檔案。

 

oracle資料庫接收到的是SQL陳述句,對SQL陳述句進行處理、執行,執行完以後會獲取到資料,再返給使用者。

贊(0)

分享創造快樂