oracle學習筆記 Oracle體系結構概述

oracle學習筆記

Oracle體系結構概述

從這節開始,開始講oracle數據庫體系結構。
首先從總體上,從概述上把oracle整體的體系結構講一下,
然後接下來的時間我們會一塊一塊的將oracle體系結構進行相對深入的剖析。

這節課講oracle的整體的體系結構。

一)
oralce分兩塊,一、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]$ ls
assistants   has               listener.log  oracore           root.sh
bin          hs                log           oraInst.loc       root.sh.old
cdata        install           md            ord               slax
cfgtoollogs  install.platform  mesg          oui               sqlj
clone        inventory         mgw           owm               sqlnet.log
config       javavm            network       perl              sqlplus
crs          jdbc              nls           plsql             srvm
css          jdk               oc4j          precomp           startup.log
ctx          jlib              odbc          racg              sysman
dbs          jre               olap          rdbms             uix
demo         ldap              OPatch        redhat4_jiagulun  wwg
diagnostics  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]$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf  users01.dbf

ls命令顯示了數據庫的內容。

oracle數據庫軟件的文件和oracle數據庫的文件可以分開存儲到兩個地方。
我們最常使用的幾乎全部的在生產環境裏面的存放結構是:
oracle數據庫軟件存放在服務器本地硬盤上而oracle數據庫存放在存儲上。

以前講過了很多生產環境中關於oracle數據庫所運行的硬件環境。
一講oracle數據庫建在存儲上,我們應該大概反應出來到底是一個什麼結構。

oracle數據庫講的就是
/u01/app/oracle/oradata/jiagulun
目錄下的文件。
這些文件就組成了oracle數據庫。
有三類文件,
一類是ctl文件,一類是log文件,還有一類是dbf文件。

oracle數據庫主要有這三類文件組成。

通常意義講的oracle數據庫有兩大塊組成,
一大塊是oracle數據庫軟件,一大塊是oracle數據庫。
以後提oracle數據庫就是說的ctl、log、dbf這三類文件。

二)
Oracle實例
英文oracle instance
oracle數據庫
英文oracle database
它們有區別和聯繫

oracle數據庫是實實在在存儲在硬盤上的三類文件。

oracle數據庫可以啓動起來。

oracle啓動起來以後
首先在內存劃出一塊空間出來,供oracle使用,
這塊內存叫oracle內存。
第二件事情,啓動一堆進程。
我們把內存和進程統稱oracle實例。

oracle數據庫啓動起來以後會產生一個oracle實例。
oracle數據庫關閉後就沒有oracle實例了。
oracle實例是oracle數據庫內存和進程的總稱。
只有數據庫啓動起來以後纔有實例的產生。

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

例子:
有兩臺服務器,一臺存儲。
存儲中放oracle數據庫文件,
每臺服務器都裝oracle數據庫軟件。
每臺服務器啓動一個實例,
兩個實例都訪問存儲中的oracle,
這就是1:2的關係一個數據庫對應倆實例。
倆實例同時都可以訪問oracle數據庫。

一個用戶要訪問數據庫
它連接到的是實例,通過實例來訪問數據庫。

如:一個數據庫有倆實例,
假設有一百個用戶要訪問數據庫,
可以50個用戶訪問一個實例,另外50個用戶訪問另外一個實例。
這是一種負載均衡的概念(使一起運行的設備負擔的負載達到一個近似相同的狀態),
可提高數據庫性能和併發性。
從理論上講,數據庫性能提高了兩倍。
實際上在生產環境裏面我們會講,這個技術就是oralce的RAC技術。

一般的學習環境下是一個數據庫對應一個實例。

演示:
數據庫啓動起來以後內存空間會佔用大塊內存,同時啓動一堆進程。
這些進程和內存就叫oracle實例。

下面要用到兩個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 ora
root      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]
oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1
oracle    1794  1793  0 07:34 pts/1    00:00:00 -bash
oracle    3906  1794  0 07:52 pts/1    00:00:00 ps -ef
oracle    3907  1794  0 07:52 pts/1    00:00:00 grep ora
結果中沒有oralce的進程

查看內存狀態
[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

沒有roacle使用的內存

2)數據庫啓動後
[oracle@redhat4 db_1]$ ps -ef|grep ora
root      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]
oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1
oracle    1794  1793  0 07:34 pts/1    00:00:00 -bash
oracle    3964     1  0 07:54 ?        00:00:00 ora_pmon_jiagulun
oracle    3966     1  0 07:54 ?        00:00:00 ora_psp0_jiagulun
oracle    3968     1  0 07:54 ?        00:00:00 ora_mman_jiagulun
oracle    3970     1  0 07:54 ?        00:00:00 ora_dbw0_jiagulun
oracle    3972     1  0 07:54 ?        00:00:00 ora_lgwr_jiagulun
oracle    3974     1  0 07:54 ?        00:00:00 ora_ckpt_jiagulun
oracle    3976     1  0 07:54 ?        00:00:00 ora_smon_jiagulun
oracle    3978     1  0 07:54 ?        00:00:00 ora_reco_jiagulun
oracle    3980     1  0 07:54 ?        00:00:00 ora_cjq0_jiagulun
oracle    3982     1  0 07:54 ?        00:00:00 ora_mmon_jiagulun
oracle    3984     1  0 07:54 ?        00:00:00 ora_mmnl_jiagulun
oracle    3986     1  0 07:54 ?        00:00:00 ora_d000_jiagulun
oracle    3988     1  0 07:54 ?        00:00:00 ora_s000_jiagulun
oracle    3994     1  0 07:55 ?        00:00:00 ora_qmnc_jiagulun
oracle    4009     1  0 07:55 ?        00:00:00 ora_j000_jiagulun
oracle    4013     1  0 07:55 ?        00:00:00 ora_q000_jiagulun
oracle    4015     1  0 07:55 ?        00:00:00 ora_q001_jiagulun
oracle    4031  1794  0 07:55 pts/1    00:00:00 ps -ef
oracle    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     status
0x36010028 360448     oracle    640        287309824  23


------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x7df2e688 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內存結構
1)
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
所以我們更加關注共享池和數據庫緩衝區高速緩存
以後着重的介紹這兩個。

Java池 和 Streams池 先不講,
只有在後面用到streams和java時這兩個池子纔會分配,
否則沒有必要分配。
large pool我們不講,在後面講rman時再講large pool。
這三個池子都沒什麼問題。

oracle啓動起來以後有兩大內存結構,
一大塊叫SGA,一大塊叫PGA。
SGA是共享的,PGA是給進程使用的。
PGA(Program Global Area程序全局區)
是一塊包含一個服務進程的數據和控制信息的內存區域。

sga有六大塊組成
shared pool,java pool,large pool,
buffer cache,redo log,stream pool.

2)
oracle數據庫啓動起來以後還會啓動一堆進程。
這些進程分兩大類,
1、後臺進程
2、前臺進程
前臺進程只有老師這麼說,別人沒有這個說法。

如ps命令的結果中:

oracle   16269     1  0 10:59 ?        00:00:00 ora_pmon_jiagulun
oracle   16271     1  0 10:59 ?        00:00:00 ora_psp0_jiagulun
oracle   16273     1  0 10:59 ?        00:00:00 ora_mman_jiagulun
oracle   16275     1  0 10:59 ?        00:00:00 ora_dbw0_jiagulun
oracle   16277     1  0 10:59 ?        00:00:00 ora_lgwr_jiagulun
oracle   16279     1  0 10:59 ?        00:00:00 ora_ckpt_jiagulun
oracle   16281     1  0 10:59 ?        00:00:00 ora_smon_jiagulun
oracle   16283     1  0 10:59 ?        00:00:00 ora_reco_jiagulun
oracle   16285     1  0 10:59 ?        00:00:00 ora_cjq0_jiagulun
oracle   16287     1  0 10:59 ?        00:00:00 ora_mmon_jiagulun
oracle   16289     1  0 10:59 ?        00:00:00 ora_mmnl_jiagulun
oracle   16291     1  0 10:59 ?        00:00:00 ora_d000_jiagulun
oracle   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)))

是前臺進程。
這裏只是舉例並未列全。

演示中後臺進程多,前臺進程少。
在實際生產中,前臺進程的數量要遠遠大於後臺進程的數量。

因爲,對oralce數據庫的每一個連接都會產生一個前臺進程,
一般的對數據庫來講都有上百個連接,至少前臺進程上百個,
後臺進程就十幾個,
所以都oracle數據庫來講前臺進程的數量要遠遠大於後臺進程的數量。

3)
對於SGA來講,
所有的內存空間對所有的進程來講是共享的,
每個進程可以訪問SGA所有的內存空間。
所以說SGA是所有進程共享的一個內存空間。

實際的工作中,
可能有些進程主要使用buffer cache,
有些進程主要使用redo log,
有一些單個內存池的單獨分配。
但我們認爲,
oracle數據庫的所有進程共享內存SGA中的六大空間。

對單個進程來講,它除了能夠訪問這一大塊SGA以外,
它自己還有點小祕密,
單個進程它有自己的進程空間,也是一塊內存空間,
這塊空間從PGA來。

oracle新的版本里面,
oracle有一個大的PGA空間,
我們後面會講怎麼設PGA,該設多大,
然後怎麼判斷設的大小,有沒有問題。

oracle每啓一個進程就從這個大的PGA空間拿出一塊來給這個進程。
對這個進程來講,它會把一些公共的信息寫到SGA裏面去, 
這個進程所獨有的私有的信息寫到自己的PGA裏面去,
每個進程都這樣從PGA分一塊。

我們在後面的講課過程中,我們會重點講,
oracle前臺進程和PGA的關係,
也就是說我們非常關心oracle前臺進程是如何使用PAG空間的。

實際中不僅僅是oracle前臺進程給他們分配了PGA空間,
後臺進程也有PGA空間。
只不過我們不去太多的關注,因爲它不是經常出問題。

使用越多的組件,越容易損壞,計算機組件也是這樣。
這樣人們會花更多的時間去維護和修復它,使它更易使用。
儘管如此它仍然是最容易損壞的地方。

oracle內存結構裏面有兩大塊:SGA和PGA,
以及一堆進程,分後臺進程和前臺進程。

四)
oracle的進程結構
1)
我們剛纔說的前臺進程就是說的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就起了兩個進程。
如果是一百個連接就是一百個進程。
這些在oracle啓的進程就叫oracle前臺進程,也叫server process。

weblogic啓動起來以後,會主動的發起對oracle數據庫實例的n個連接,
數量可以在weblogic裏面設置,這n個連接叫連接池。
然後我們看oracle數據庫實例,
它針對weblogic的每一個連接,這個實例會建立一個相應的進程和它對應。
也就是說weblogic向oracle實例建立了一百個連接,
這個時候oracle實例就會針對這一百個連接啓動一百個oracle前臺進程。
也就是一百個server process,也就是一百個服務器進程,
這時候,oracle實例裏面憑空多了一百個server process。

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

2)
比如我們訪問淘寶網站
我們通過ie瀏覽器連接到淘寶的web服務器上,也就是它的應用服務器上。
然後我們要買鞋子,比如要買什麼廠商的鞋子,
我們在網上選中搜索條件以後點擊搜索。
對淘寶來講所有鞋子的信息在數據庫裏面沒有在web服務器上,
所有商品包括商品價格、商品的圖片 等等所有信息都在數據庫裏面。
web服務器上面沒有信息。

用戶連接到應用服務器上以後,它會進行一些操作,
它要搜鞋子,鞋子的信息在數據庫裏面。
當這個用戶想要搜鞋子信息的時候,
應用服務器會做一件事情,
會從應用服務器與數據庫建立的這n個連接裏面,隨機的選擇其中的一個連接,
應用服務器會產生一條SQL語句,一個對鞋子訪問的SQL語句,
通過這個連接送到oracle;
oracle接到這個SQL語句以後,就會對它解析執行,然後獲取數據;
然後再通過這個連接返給應用服務器。
應用服務器接收到所有的鞋子信息以後,就會以web界面的方式,
再返給用戶。

我們用戶無形中訪問了oracle數據庫,
但是用戶沒有體會到,
用戶也不需要oracle數據庫的知識。

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

瀏覽器有了這些條件有了以後,
一點搜索,web服務器、應用服務器會自動的從衆多的連接中找一個空閒的連接,
同時會產生一個帶條件的,對鞋子訪問的一個SQL語句。
SQL語句通過連接發到數據庫實例。
oracle數據庫會接到這個SQL語句,
然後對SQL語句解析執行,獲取到數據,
通過連接再傳給應用服務器。
應用服務器接到以後,然後再傳給我們的消費者。

這就是整個的一個過程。

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

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

4)
用戶進程就是在用戶客戶端產生的進程,
我們根本不關心這個。
我們只關心oracle數據庫裏面的最前端的服務器進程,
每個服務器進程都對應一個PGA,
我們還關心SGA和後臺進程。
但是要知道用戶進程是用戶端的進程。

五)
oracle整體的體系結構

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

前面講了前臺進程後臺進程,
重點講了server process。

其實在oracle數據庫裏面後臺進程也很重要,
oracle後臺進程非常多,
重點這次給大家講的oracle有五大後臺進程。

oracle有三大文件,
控制文件、數據文件、重做日誌文件。
還有歸檔日誌文件。後面要專門講歸檔知識。

oracle有六大內存塊,
共享池、streams池、大型池、java池、數據庫緩衝區高速緩存、重做日誌緩衝區。

有五大後臺進程,
檢查點(CKPT)、系統監視器(SMON)、進程監視器(PMON)、
數據庫寫進程(DBWn)、日誌寫進程(LGWR)。
先簡單講五大進程作用,歸檔進程(ARCn)先不講。

三類文件裏面分別放的信息
1)
控制文件存放的了很多信息,先簡單的講兩類信息
1、整個數據庫的物理結構信息,在控制文件裏面記錄着。
所謂的物理結構,
主要是數據庫有多少數據文件,數據文件分別放在什麼位置。
oracle數據庫有多少redolog文件,這些文件分別放在什麼位置。

2、控制文件中還記錄着數據庫當前運行的一些狀態信息。
比如說那個數據文件是在線正常的,哪些數據文件是離線不正常的。
oracle數據庫當前正在使用着衆多重做日誌文件的哪一個,哪一些日誌文件有一些問題。
數據庫當前運行的一些狀態信息,也記錄在控制文件中。

控制文件我們目前主要講兩類信息,
1、數據庫的物理結構信息。
2、數據庫的當前運行的一些狀態信息。

2)
數據文件裏面放的是oracle實在的數據文件數據。
oracle數據主要放的是表,
表信息就放在數據文件裏面,
控制文件會很小,但是數據文件會很大。
因爲oracle所有的數據全部放在數據文件裏面。

3)
第三類文件 重做日誌文件
日誌文件裏放的是日誌。
日誌記錄的是,
oracle對數據庫、對數據文件所做的所有的修改,
全部會以日誌的方式記錄在日誌文件中。
它記錄的是數據文件的變化過程。

這是三大類文件。

oracle數據庫接收到的是SQL語句,對SQL語句進行處理、執行,
執行完以後會獲取到數據,再返給用戶。




2016年7月3日
                                                                             韻箏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章