1、Oracle組成前端
oracle分兩塊,oracle數據庫軟件和oracle數據庫。oracle數據庫軟件位置經過如下命令能夠找到:java
最後ls命令列出了數據庫軟件的內容。linux
oracle數據庫的位置web
ls命令顯示了數據庫的內容。sql
oracle數據庫軟件的文件和oracle數據庫的文件能夠分開存儲到兩個地方。數據庫
咱們最常使用的幾乎所有的在生產環境裏面的存放結構是:oracle數據庫軟件存放在服務器本地硬盤上而oracle數據庫存放在存儲上。瀏覽器
oracle數據庫講的就是/u01/app/oracle/oradata/jiagulun目錄下的文件。這些文件就組成了oracle數據庫。有三類文件,ctl文件、log文件以及dbf文件。緩存
2、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的進程
查看內存狀態
沒有Oracle使用的內存
2)數據庫啓動後
結果中有了不少oracle的實例的進程,如ora_pmon_jiagulun 等以ora_開頭的進程。
內存狀態
內存中出現了oracle使用的內存塊:
有了一塊280M的內存給了oracle。這是oracle啓動起來之後在內存裏面劃了一塊比較大的空間。oracle啓動起來之後會佔用內存和產生進程,這個獲得了驗證。
3、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 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分一塊。
4、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和後臺進程。可是要知道用戶進程是用戶端的進程。
5、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語句進行處理、執行,執行完之後會獲取到數據,再返給用戶。
出處:https://blog.csdn.net/xinzhan0/article/details/51816369