Oracle體系結構

Oracle 服務器由Oracle實例與Oracle數據庫組成

Oracle實例(instance),通過ORACLE_SID來引導(Oracle標識)

單實例情況下:Oracle數據庫名與Oracle實例名相同且具有唯一性

舉例:

三國中,關羽使用青龍偃月刀,呂布使用方天畫戟,這就是唯一性身份標識(連遊戲裏都有***力加成甚至其他特殊效果,別不承認,哈哈),那麼青龍偃月刀和方天畫戟分別是兩個獨立的庫,他們的ORACLE_SID就分別是關羽和呂布。

另一種情況下,關羽與呂布的坐騎都是赤兔馬(貂蟬不算哈,額,貂蟬,有木有),此時赤兔做爲唯一庫名,但是同時被關羽和呂布兩個SID實例調用,因此赤兔馬屬於RAC(實時應用集羣,具有LB+HA雙層功效)

clip_image001

單實例情況下,instance(sid)名與數據庫是一致的(查詢出的庫名與表名默認都是大寫形式,這是正常的)

clip_image002

RAC集羣的第一個節點

clip_image003

RAC集羣的第二個節點(可以明顯看到,雖然實例名不同,但是庫名是一樣的,因此,RAC是一個多實例單庫的集羣數據庫模式)

Oracle數據庫結構包括內存結構、進程結構、存儲結構

Oracle實例等於SGA + 後臺進程

Oracle內存結構

clip_image004

上面的圖就說明了Oracle的內存結構,其中最重要的兩個區域就是SGA與PGA

系統全局區(SGA):由所有服務器進程和後臺進程共享

程序全局區(PGA):專用於每一個服務器進程或後臺進程。每一個進程使用一個PGA

SGA 是包含實例的數據和控制信息的內存區。

SGA 包含以下數據結構:

數據庫緩衝區高速緩存:緩存從數據庫檢索的數據塊

重做日誌緩衝區:高速緩存重做信息(用於實例恢復),直到可以將其寫入磁盤中存儲的物理重做日誌文件

共享池:緩存可在用戶間共享的各個結構

大型池:是一個可選區域,可爲某些大型進程(如Oracle 備份和恢復操作、I/O 服務器進程)提供大量內存分配

Java 池:用於Java 虛擬機(JVM) 中特定會話的所有Java 代碼和數據

Streams 池:由Oracle Streams 使用

通過使用Enterprise Manager 或SQL*Plus 啓動實例,可以顯示爲SGA 分配的內存量。

下面具體說一下SGA裏的幾個重要的池

共享池(Shared_Pool):Oracle會將用戶提交來的SQL語句都緩存在內存中。每次處理新的一條SQL語句時,都會先在內存中查看是否有相同的SQL語句。如果相同則可以減少最重要的解析工作(也就是生成執行計劃),從而節省了大量的資源;反之,如果沒有找到相同的SQL語句,則必須重新從頭到尾進行完整的解析過程。這部分存放SQL語句的內存就叫做共享池(Shared Pool)。當然,Shared Pool裏不僅僅是SQL語句,還包括管理Shared Pool的內存結構以及執行計劃、控制信息等等內存結構。

數據庫緩衝區高速緩存(Buffer_Cache):Buffer Cache所能提供的功能主要包括(一些頻繁查詢的熱表可以考慮放在這個區域,這就像現在最火的固態硬盤一個道理,但是頻繁DML操作的表不建議放入此處)

通過緩存數據塊,從而減少I/O;

通過構造CR塊,從而提供讀一致性功能;

通過提供各種Lock、Latch機制,從而提供多個進程併發訪問同一個數據塊的功能。

重做日誌緩衝區(Log_Buffer):Oracle這種數據庫最好的一個運作機制在於先寫日誌後操作,這樣能夠有效的確定你運行到了哪一步,方便故障排查與恢復。

爲了臨時存放所產生的日誌信息,Oracle在SGA中開闢了一塊內存區域。這塊區域就叫做日誌緩衝區(Log Buffer),當滿足一定條件以後,Oracle會使用名爲LGWR的後臺進程將Log Buffer中的日誌信息寫入聯機日誌文件裏。

在10g以後的Oracle版本中,有兩個參數可以動態的調整SGA的大小,否則就需要自行設置每個池子的大小(當然,Oracle官方有一套科學的算法)

10g數據庫有如下兩個參數(在初始化參數文件中設置)

SGA_MAX_SIZE(允許的最大的SGA大小)

SGA_TARGET(SGA分配大小)

到了11g以後不僅可以自動配置SGA,也同時可以分配所有內存了,有如下兩個參數(在初始化參數文件中設置)

MEMORY_MAX_TARGET(允許的最大的內存大小)

MEMORY_TARGET(內存分配大小)

進程結構

clip_image005

Oracle的進程包括了上圖所述幾個主要種類的進程,這裏主要說一下後臺進程

系統監視器(SMON):出現故障後,在啓動實例時執行崩潰恢復任務

進程監視器(PMON):用戶進程失敗時執行進程清理任務

數據庫寫進程(DBWn):將修改後的塊從數據庫緩衝區高速緩存寫入磁盤中的數據文件

檢查點(CKPT):通過更新數據庫的所有數據文件和控制文件指出最新的檢查點

日誌寫進程(LGWR):將重做日誌條目寫入磁盤

歸檔進程(ARCn):發生日誌切換時將重做日誌文件複製到歸檔存儲器

clip_image006

上圖包括了所有的後臺進程(MMON和MMNL是AWR報告的支持進程),其他一些進程不做詳細解釋

Oracle存儲結構

clip_image007

上圖是一個Oracle的物理存儲結構

構成Oracle 數據庫的文件可分爲以下幾類:

控制文件:包含有關數據庫本身的數據(即物理數據庫的結構信息)。這些文件對數據庫而言至關重要。沒有這些文件,就無法打開用於訪問數據庫數據的數據文件。

數據文件:包含數據庫中的用戶數據或應用程序數據。

聯機重做日誌文件:可用來實現數據庫實例恢復。如果數據庫已崩潰但未丟失任何數據文件,那麼使用這些文件中的信息可以通過實例恢復數據庫。

要成功運行數據庫,以下附加文件非常重要:

參數文件:用於定義啓動實例時如何配置實例。

口令文件:允許用戶遠程連接到數據庫並執行管理任務。

備份文件:用於恢復數據庫。當因介質故障或用戶錯誤而損壞或刪除了原始文件時,通常需要還原備份文件。

歸檔日誌文件:包含實例生成的數據更改(重做)的實時歷史記錄。

使用這些文件和數據庫備份可以恢復丟失的數據文件。也就是說,使用歸檔日誌可以恢復還原的數據文件。

跟蹤文件:每個服務器和後臺進程都可以對關聯的跟蹤文件執行寫操作。如果在進程中檢測到內部錯誤,進程就會將關於錯誤的信息轉儲到進程的跟蹤文件中。寫入到跟蹤文件中的某些信息專門供數據庫管理員使用,另一些信息則供Oracle 支持服務部門使用。

預警日誌文件:是特殊的跟蹤文件,又稱爲預警日誌。數據庫預警日誌是按時間順序列出的消息日誌和錯誤日誌。Oracle 建議你查看這些文件。

clip_image008

這是一張邏輯與物理轉換的圖

Oracle 數據庫在邏輯上將數據存儲在表空間中,在物理上將數據存儲在數據文件中。

表空間:

只能屬於一個數據庫

包括一個或多個數據文件

可進一步劃分爲邏輯存儲單元

是存儲方案對象數據的資料檔案庫

數據文件:

只能屬於一個表空間和一個數據庫

是構成表空間的基礎文件

數據庫、表空間、段(segment)、區(extent)、數據塊(block)

1、一個表空間只能屬於一個數據庫、一個表空間可以包括多個數據文件、一個數據文件只能屬於一個表空間

2、一個段可以跨越多個數據文件,普通表就是一個segment、索引也是一個segment

3、segment分配空間的最小單位就是extent,每個segment由一個或者多個extent組成

4、一個extent不能跨越多個數據文件因爲一個extent是物理上連續的存儲空間

5、一個extent由多個連續的block組成

6、block是oracle I/O的最小單位

下面通俗的話解釋一下

數據庫,可以看成是我們工作的公司(一般指大型集團性質的公司),表空間是集團下屬的各種分公司(以種類劃分,比如浪潮集團分爲浪潮信息,浪潮服務器,浪潮軟件,浪潮通軟等),段是分公司下的具體行政劃分(比如浪潮總公司,北京分公司,武漢分公司等),區是指各種行政部門(比如市場部,銷售部,研發部,技術部等等),塊就是苦逼的我們(每個人),人是公司的最小單元,一些相同工種的人構成了區(部門),有些部門人多勢衆(比如銷售部32K,市場部16K),有些部門人則很少(比如人事部4K,財務部2K),而苦逼的我們(系統部,默認8K),這些部門組成了分公司(段),不同的分公司組成行政大區(表空間),不同的行政大區組成了完整的集團公司(數據庫),當然,這些都是邏輯結構

一個公司,尤其是集團這種性質的公司,不可能只有一個辦公地點,那麼,這種實際的辦公地點,就是我們的數據文件(什麼,你不知道數據文件具體幹啥用的,拜託,你在哪裏上班啊,你坐的工位,就可以看成是一個OS塊,足夠的OS塊組成的OS文件就是數據文件,數據文件也是OS文件的一種),但是一個辦公地點只能被一個分公司註冊(道理很簡單了,你不可能武漢分公司的辦公地點在上海,那樣也太不靠譜了,當然,移動表空間這種情況單算,這事以後再說,HOHO)

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