【學習目標】
作為一個數據庫管理員(DBA),經常會遇到各種沒有見過的問題。除了寶貴的經驗外, 通過理論基礎去對問題進行判斷、解決是至關重要的。因此,Oracle 服務器的結構和組成 是學習Oracle 數據庫必不可少的基礎知識,所以本章內容對於學習以后章節的內容都是至 關重要的。
本章主要介紹Oracle 服務器的結構和組成,對Oracle 服務器從實例結構和數據庫結構 兩個方面予以分析。
【本章要點】
● Oracle 服務器的總體結構
● Oracle 實例的內存結構和進程結構
● Oracle 數據庫的結構和組成
【關鍵術語】
Architecture 結構- Component 組成部件
Process 進程 - Parameter 參數
Instance 實例 - Memory 內存
Database buffer cache 數據庫高速緩存 - Shared pool 共享池
Library cache 庫緩存 - Data dictionary cache 數據字典緩存
Redo log buffer 重做日志緩存 - Large pool 大池
Java pool java 池 - Background process 后台進程
Connection 連接 - Session 會話
Online redo log 聯機重做日志 - Dynamic 動態的
SGA(System Global Area) 系統全局區 - PGA(Program Global Area)程序全局區
Server process 服務器進程 - User process 用戶進程
Parsing 分析
一、Oracle 服務器的構成
Oracle 服務器是一個具有高性能和高可靠性面向對象關系型數據庫管理系統,也是一 個高效的SQL 語句執行環境。
Oracle 服務器具備以下的特點:
- ● 能夠可靠的進行多用戶環境下大量數據的處理,允許多用戶同時訪問相同的數據。
● 保證數據訪問的高性能。
● 有效防止對數據的非法訪問。
● 對於故障恢復提供高效的解決方案。
(一)、Oracle 服務器的總體結構
Oracle 服務器同運行在操作系統下的很多程序一樣,通過在后台運行一組可執行程序、 在內存中開辟程序運行的存儲區域並在磁盤上存儲數據來進行運作。
如圖1-1 所示,在結構上,Oracle 服務器(Oracle Server)由實例(Instance)和數 據庫(Database)兩大部分構成。實例是一組內存結構和Oracle 后台進程的集合;數據庫 在物理上由多個操作系統文件組成, 其中主要包括數據文件、控制文件和重做日志文件。
Oracle 服務器=實例+數據庫。
(二)、Oracle 實例
如圖1-1 所示,Oracle 實例由內存結構(SGA)和Oracle 后台進程組成的。 當用戶啟動(start)實例時,Oracle 將自動地為SGA 分配內存並啟動后台進程,實 例運行后,用戶可以訪問實例,由實例來訪問數據庫。實例相當於用戶和數據庫的中間層。 當用戶關閉(shut down)實例時,由操作系統負責回收內存。每個實例都有自己的 SGA,並且,每個實例同時只能訪問一個數據庫。 Oracle 數據庫實例(Instance) = 內存結構(SGA) + 后台進程(Background Process)。
內存結構描述的是Oracle 數據庫對內存的使用構成。Oracle 內存結構被總稱為SGA (System Global Area),主要包括數據庫高速緩沖區(Database Buffer Cache)、重做日 志緩沖區(Redo Log Buffer)和共享池(Shared Pool)三個部分。 Oracle 后台進程主要包括DBWn、CKPT、LGWR、SMON、PMON、ARCn 和RECO。
(三)、Oracle 數據庫
如圖1-2 所示,Oracle 數據庫包含了用於存放數據的數據文件(DataFiles),用於保護 數據不丟失的聯機重做日志文件(Online Redolog Files)和用於連接Oracle 實例和數據庫 所需要的控制文件(Control Files)。
Oracle 數據庫= 數據文件+ 控制文件+ 聯機重做日志文件。
除了以上三種文件之外,Oracle 還包含了參數文件(Parameter File)、口令文件 (Password File)、歸檔日志文件(Archived log Files)、以及跟蹤文件(Trace File)和警 告文件(Alert Log File)等非數據庫文件。控制文件:記錄了數據庫的各項信息,是連接Oracle 實例和Oracle 數據庫的橋梁。 每個Oracle 數據庫包含1-8 個控制文件。
聯機重做日志文件:記錄了用戶對數據的各項操作,用於保護數據不丟失。 以日志組的形式存在。每個Oracle 數據庫至少包含兩個日志組。
數據文件:用於存放數據。
參數文件:記錄了Oracle 實例的各項信息。分為動態和靜態初始化參數文件。
口令文件:存放特定用戶的口令。
歸檔日志文件:相當於聯機重做日志文件的備份,用於保護數據不丟失。
追蹤文件:存放后台進程和服務器進程的跟蹤信息。
警告文件:警告文件由連續的消息和錯誤組成。 可以查看到Oracle 內部錯誤、塊損壞錯誤以及非默認的初始化參數值等。
二、Oracle 內存結構
Oracle 的內存由系統全局區(System Global Area,簡稱SGA)和程序全局區 (Program Global Area,簡稱PGA)組成。
(一)、系統全局區SGA
系統全局區(system global area,SGA)是一組包含了Oracle 數據庫數據及實例控 制信息的共享的內存結構。當多個用戶並發地連接到同一個實例后,這些用戶將共享此實例 SGA 中的數據。因此SGA 也被稱為共享全局區(shared global area)。
SGA 越大系統的性能越好,但SGA 過大也會起到反作用。一般情況下,SGA 不應超 過系統實際內存的1/2。但從Oracle 9i 開始支持動態SGA 特性,即無需關閉實例就可以改 變數據高速緩沖區、共享池和大池的大小。數據高速緩沖區、共享池的大小也可以根據工作 負載自動調整,但SGA 的總大小不能超過初始化參數SGA_MAX_SIZE 的設置。。1.SGA 的構成
如圖2-1 所示,SGA 包括三個子緩沖區:保留緩沖區、循環緩沖區和非標准大小塊緩 沖區。SGA 包括以下結構:
● 數據高速緩沖區(Data Buffer Cache)
● 重做日志緩沖區(Redo Log Buffer)
● 共享池(Shared Pool)
● Java 池(Java Pool)
● 大池(Large Pool)
● 流池(Stream Pool)
1.1 數據庫高速緩沖區(Database Buffer Cache)
在Oracle 中無論是讀取還是修改數據,都是由服務器進程在數據庫高速緩沖區中完成 的。數據庫高速緩沖區的作用就是用來緩存最近從數據庫中讀出的數據塊,並可供其他客戶 進程共享。用戶進程查看數據時,首先檢查需要的信息是否在緩沖區內,如果在緩沖區中, 就可以直接訪問,否則訪問物理文件並讀取數據塊到數據庫緩沖區。我們知道內存的讀寫速 度要比物理設備的讀寫速度快很多,這樣就可以大大提高Oracle 數據庫的性能。1) 數據庫高速緩沖區的子緩沖區
根據緩沖數據塊的狀態,Oracle 將數據高速緩沖區可划分成:
● 臟緩沖區(Dirty Buffer):
當數據庫發生DML(Insert、Update、Delete)操作時,會對緩沖區內容進行修改, 這樣緩沖區的內容就會和相對應的數據文件不一致,這時,緩沖區標識為“臟緩沖區”。
● 自由緩沖區(Free Buffer):
當“臟緩沖區”的內容被寫入數據文件后,因為該緩沖區與相應數據文件部分內容 一致,所以將這些緩沖區稱為“自由緩沖區”。 當執行SELECT 語句時,會將對應數據文件部分數據讀取到數據高速緩存的相應 緩沖區,因為緩沖區與數據塊內容完全一致,所以這些緩沖區也被稱為“自由緩沖區”。
● 忙緩沖區(Pinned Buffer):
“忙緩沖區”是指服務器進程正在訪問的緩沖區。 每個數據庫的數據庫高速緩沖區大小有限,所以一般不會把磁盤上的所有數據都可以存 放在緩沖區中。 為了防止數據庫高速緩沖區空間不夠用,Oracle 會將臟緩沖區中的數據寫入對應的數 據文件中,以騰出空間給新的數據。 如果緩沖區不臟,即為“自由緩沖區”,它可以直接被讀入新的數據塊。)隨后訪問被寫 入磁盤導致額外的高速緩存未命中的數據。 “臟列表”的作用就是記錄臟緩沖區的情況。如果某些緩沖區中的數據塊被修改,就會 加入該列表,只有臟列表中的緩沖區數據塊需要寫回數據庫文件,一旦寫回數據庫文件,緩 沖區就會從臟列表中清除。2) 非標准塊大小支持
數據庫塊是Oracle 數據庫I/O 的最小單位。 每個數據庫都可以通過參數DB_BLOCK_SIZE 指定標准塊大小(2k、4k、8k、16k、 32k),默認為8k。但是Oracle 數據庫同時支持多種塊大小,我們稱這些標准塊以外的塊為 “非標准大小塊”。 非標准大小塊的高速緩沖區大小指定以下參數(DB_nK_CACHE_SIZE):
DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
DB_nK_CACHE_SIZE 參數不能用於設定標准大小塊的高速緩存,標准大小塊的緩存 尺寸由參數DB_CACHE_SIZE 的值決定。
3) 使用多個緩沖區
數據庫管理員(DBA )可以通過創建多個緩沖池來提高數據庫緩沖區高速緩存的性能。 用戶可以指定方案對象(schema object)(表,簇,索引,及分區)使用相應的緩沖池, 以便控制數據被移出緩存區的時機。
● 保留緩沖區(Keep Buffer Cache):用來保留在內存中最有可能重用的對象。 保留這些對象將減少I/O 操作,指定DB_KEEP_CACHE_SIZE 參數的值配置。
● 循環緩沖區(Recycle Buffer Cache):用來保留被重用機會不大的內存塊。 指定DB_RECYCLE_CACHE_SIZE 參數的值配置該緩沖區的大小。
● 默認緩沖區(Default Buffer Cache):此池始終存在。它相當於一個實例的數據庫 高速緩沖區中保留和循環區以外的部分。指定參數DB_CACHE_SIZE。
注:保留緩沖區和循環緩沖區並非默認緩沖區的子集。 可以使用BUFFER_POOL 子句對對象定義默認的緩沖區。1 EXAMPLE: 2 CREATE INDEX cust_idx … 3 STORAGE (BUFFER_POOL KEEP); 4 ALTER TABLE oe.customers 5 STORAGE (BUFFER_POOL RECYCLE);4) 數據庫高速緩沖區空間管理
Oracle 用LRU(Least Recently Used)算法來管理數據高速緩沖區。該算法將最近使 用的數據塊按照使用時間的早晚排成隊列,當緩沖區占滿后,調入新的數據塊時,必須清除 已有的數據塊,來獲得空閑數據塊空間,那么,最合理的選擇就是清除最早沒有使用數據塊, 因為使用該塊的概率相對比較小。通過規划SGA 時合理地設置數據高速緩存的尺寸,盡量 的避免緩沖區占滿的情況發生,否則就會降低系統的效率。Oracle 將隊列分成兩端,分別為熱端和冷端。
假設新數據塊K 將要被讀入,又沒有空閑位置,則Oracle 會對冷端頭J 塊進行判斷: 假設J 被訪問次數為1,Oracle 將會認為J 不是一個經常被訪問的塊(冷),則會將J 塊踢出隊列,將K 插入至F 的位置,F 和其他塊右移:
假設新數據塊L 將要被讀入,又沒有空閑位置,則Oracle 會對冷端頭I 塊進行判斷: 假設I 被訪問次數為5,Oracle 將會認為I 是一個經常被訪問的塊(熱),則會將I 塊放 入熱端頭,A 和其他快右移如下圖所示:這時,將對下一個冷端頭塊H 進行判斷: 假設H 被訪問次數為1,Oracle 將會認為H 不是一個經常被訪問的塊(冷),則會將H 塊踢出隊列,將L 插入至E 的位置,E 和其他塊右移:
但是這時,我們會發現。I 塊被放入熱端頭,經過漫長的時間,I 塊最終會被放到冷端 頭進行判斷;如果這段時間中,即使I 沒有再被訪問過,I 的訪問次數也仍然是5,這樣I 將再次回到熱端頭,這樣就造成了死循環,I 永遠無法被踢出列表。
因此,當I 被放到熱端頭的時候,訪問次數將會被清零。如果這段時間I 被訪問多次,
則有機會回到熱端頭,否則,可能被踢出列表。5) 數據庫高速緩沖區的大小管理
1 --1> 連接數據庫 2 [oracle@oracle ~ ]$ sqlplus / as sysdba 3 --2> 顯示數據庫高速緩沖區的大小 4 SQL> show parameter db_cache_size 5 NAME TYPE VALUE 6 ------------------------------------ ----------- ------------------------------ 7 db_cache_size big integer 0 8 --3> 顯示保留緩沖區的大小 9 SQL> show parameter db_keep_cache_size 10 NAME TYPE VALUE 11 ------------------------------------ ----------- ------------------------------ 12 db_keep_cache_size big integer 0 13 --4> 顯示循環緩沖區的大小 14 SQL> show parameter db_recycle_cache_size 15 --5> 修改數據庫高速緩沖區的大小 16 SQL> ALTER SYSTEM SET db_cache_size=500m; 17 --6> 清空數據庫高速緩沖區 18 SQL> ALTER SYSTEM FLUSH buffer_cache;1.2 重做日志緩沖區(Redo Log Buffer)
當運行Oracle 服務器的時候,如果突然斷電或系統癱瘓,會不會造成數據的丟失?
Oracle 提供了一套復雜的機制來維護數據完整性,並最終確保數據不會丟失。這就是重做 日志文件的作用。 重做日志緩沖區用來記錄對數據緩沖區數據進行的修改,可以循環使用。當用戶運行 DML(INSERT、UPDATE、DELETE)以及DDL(CREATE、ALTER、DROP)語句時,會改 變數據高速緩存中的相應緩沖區。但是在修改這些緩沖區之前,Oracle 會自動生成重做項, 首先要將這些緩沖區的變化記載到“重做日志緩沖區”中。重做日志緩沖區由一條一條的重 做項構成,每條重做項記載了修改的時間、被修改的塊、修改位置以及新數據。緩沖區被循 環使用,當重做日志緩沖區填滿時,數據庫系統將重做日志緩沖區的內容寫入日志文件。在 系統發生故障時,可以通過重做項重新執行對數據庫的修改,實現對實例的恢復。 重做日志緩沖區的大小由LOG_BUFFER 初始化參數來決定。1.3 共享池(Shared Pool)
SGA 的共享池(Shared Pool)內包含了庫緩存(Library Cache),數據字典緩沖區 (Dictionary Cache),並行執行消息緩沖區(Buffers for parallel execution messages), 以及用於系統控制的各種內存結構。 共享存儲區的大小由SHARED_POOL_SIZE 初始化參數來決定。同數據高速緩沖區一
樣,它的大小可以動態的修改。 如圖1-5 所示,共享池由庫高速緩存和數據字典緩沖區組成。
1) 數據字典緩沖區
數據字典是一系列保存了數據庫參考信息(例如數據庫結構,數據庫用戶等)的表和視 圖。Oracle 需要頻繁地使用經過解析的SQL 語句訪問數據字典。數據字典信息對Oracle 能否正常運行至關重要。數據字典是用來描述數據庫數據的組織方式的,由表和視圖組成。
數據字典由腳本$oracle_home/rdbms/admin/catalog.sql 創建。
視圖有三種實例:user_*(當前用戶所擁有對象的有關信息),
all_*(當前用戶可訪問對象 的信息),
dba_*(數據庫中所有對象的信息)。
在Oracle 數據庫中,數據庫的一些信息,包括賬戶、數據文件、表的描述、用戶權限 等信息,存儲在數據字典表中,數據字典表被存放在SYSTEM 表空間的數據文件中。
因為執行任何SQL 語句都需要訪問數據字典,所以為了提高數據字典的訪問性能, Oracle 在共享池中專門為存放數據字典信息分配了內存空間,這些內存空間被稱為數據字 典高速緩沖區。用來緩存來自於數據字典的定義。例如,當用戶執行"SELECT * FROM emp WHERE empno=7788"語句時,Oracle 需要 查詢數據字典dba_tables 確定表emp 是否存在;如果該表已經存在,還需要查詢數據字典 dba_tab_columns 確定列empno 在表emp 中是否存在,然后才能生成執行語句的過程(執 行計划)。這些定義在首次查詢時存入數據字典高速緩沖區,在后續過程中用到就可以直接 使用,而不必重新查詢數據字典。
2) 庫高速緩存
庫高速緩沖區又可分為共享SQL 區和共享PL/SQL 區。
共享SQL 區用來存放最近執行的SQL 語句信息,包括語句文本、解析樹及執行計划。 執行計划就是Oracle 為執行特定的SQL 語句,產生的優化的執行步驟。
庫高速緩沖區由許多上下文區(Context Area)組成,SQL 語句和執行計划存放在相應上 下文區中,並且不同SQL 語句分別對應於不同的上下文區。當客戶端運行SQL 語句時,服 務器進程首先檢查是否存在對應於該SQL 語句的上下文區,若存在,則按照其執行計划直 接執行該SQL 語句;否則生成SQL 語句執行計划,並將執行計划、SQL 語句存放到相應 上下文區中,然后執行該SQL 語句。
在開發應用程序時,必須要注意使用標准格式來編寫SQL 語句,使得SQL 語句盡可能 共享上下文區,以降低SQL 語句解析次數,進而提高應用性能。
在解析SQL 語句時,認為完全相同的SQL 語句有以下特點:
● 語句文本相同。
● 大小寫相同。
● 賦值變量相同。
共享PL/SQL 區用來存放最近執行的PL/SQL 語句,解析和編譯過的程序單元和過程(函 數、包和觸發器)也存放在此區域。
類似於數據高速緩沖區,Oracle 也是使用LRU 算法來管理庫高速緩存的。通過庫高速 緩存,可以最小化SQL 語句解析次數,進而提高應用程序的性能。1.3 大池(Large Pool)
數據庫管理員可以配置一個稱為大型池(Large Pool)的可選內存區域,供一次性大量 的內存分配使用,例如:
● 共享服務器(shared server)及Oracle XA 接口(當一個事務與多個數據庫交互 時使用的接口)使用的會話內存(session memory)
● I/O 服務進程
● Oracle 備份與恢復操作
如果從大型池內為共享服務器,Oracle XA,或並行查詢緩沖區(parallel query buffer) 分配會話內存,共享池(shared pool)就能夠專注於為共享SQL 區(shared SQL area) 提供內存,從而避免了共享池可用空間減小而帶來的系統性能開銷。
此外,Oracle 備份與恢復操作,I/O 服務進程,及並行執行緩存所需的存儲空間通常 為數百KB。與共享池相比,大型池能夠更好地滿足此類大量內存分配的要求。
注:大型池不使用LRU 列表管理其中內存的分配與回收。1.4 JAVA 池(Java Pool)和流池(Stream Pool)
SGA 內的Java 池(Java Pool)是供各會話內運行的Java 代碼及JVM 內的數據使 用的。Java 池是SGA 的可選區域,用來為Java 命令解析提供內存。只有在安裝和使用JAVA 時才需要JAVA 池。
Java 池的大小由JAVA_POOL_SIZE 初始化參數來決定。
在數據庫中,管理員可以在SGA 內配置一個被稱為數據流池(Streams Pool)的內 存池供Oracle 數據流(Stream)分配內存。管理員需要使用TREAMS_POOL_SIZE 初 始化參數設定數據流池的容量(單位為字節)。如果Oracle 數據流第一次使用時系統中沒 有定義數據流池,Oracle 將自動地創建一個。
注:Java 編程和Oracle 數據流的詳細討論超出了本課程的范圍。2.查詢SGA 的大小
(二)、程序全局區PGA
當客戶進程訪問Oracle 服務器時,會在Oracle 服務器端為用戶進程分配相應的服務進 程,並且為該服務進程分配相應的內存空間來存放其數據和控制信息,每一個后台進程也同 樣需要為其分配專用的存儲空間,這塊內存空間被稱為程序全局區(Program Global Area 或 Process Global Area )。如圖1-5 表示為服務進程專門分配PGA 存儲區。
所有進程都可共享SGA,而PGA 是非共享的。當建立服務進程或后台進程時,Oracle會自動為其分配PGA;而當服務進程或后台進程終止時,Oracle 會自動釋放PGA 所占用 的內存空間。
根據專有和共享服務器模式的不同,PGA 的內存也會發生變化,但大致可分為三部分:1.私有SQL 區
私有SQL 區(Private SQL Area)中包含綁定信 息(Bind Information)及運行時內存結構(Runtime Memory Structure)等數據。每個提交了SQL 語句 的會話都有一個私有SQL 區。每個提交了相同SQL 語句的用戶都有自己的私有SQL 區,但她們使用同 一個共享SQL 區(Shared SQL Area)。即多個私有 SQL 區可以和同一個共享SQL 區相聯系。 游標的私有SQL 區又可以被分為兩個區域,這 兩部分的生命周期有所不同:
● 持續數據區(Persistent Area),包含綁定信息(Bind Information)之類的數據。 此區只在游標關閉時才會被釋放。
● 運行時間區(Run-time Area),當執行請求的第一步創建,對於INSERT, UPDATE,和 DELETE 命令,這個區域當語句執行后釋放。 對於查詢,只有所有行取出后或查詢取消后該區域才釋放。 私有SQL 區即可位於SGA 也可位於PGA。
● 對專有服務器模式私有SQL 區位於服務進程的PGA 區;
● 對共享服務器模式私有SQL 區位於SGA。私有SQL 區管理由用戶進程完成,一個用 戶進程可以分配的游標私有SQL 區個數由OPEN_CURSORS 參數限定,默認值是50。
● 專用服務器:對於每個用戶,Oracle 服務器對每個用戶進程執行一個專有的服務進程。
● 共享服務器:一個共享服務器進程響應多個客戶端的請求。
2.會話內存(Session Memory)
會話內存是為會話變量和會話有關信息分配的內存。對共享服務器模式,會話內存也是 共享的。3.SQL 工作區(SQL Work Areas)
SQL 工作區用於排序(Sort)哈斯連接(Hash-join)位圖(Bitmap)合並和位圖創建。 該區域大小即可控制也可以自動調整。 用戶可以對工作區的容量進行控制與調優。一般來說,更大的工作區能夠顯著地提高 SQL 操作的性能,但代價是消耗更多的內存。最理想的情況是,工作區能夠容納SQL 語 句的全部輸入數據及額外的控制內存結構。否則語句的響應時間將增加,因為部分輸入數據 必須放入臨時磁盤區。在極端情況下,如果工作區容量遠小於輸入數據,那么輸入數據需要在臨時磁盤區與工作區間多次交換。這將顯著地增加SQL 操作的響應時間。
從Oracle9i 開始,通過設置初始化參數WORKAREA_SIZE_POLICY(默認值為TRUE) 和PGA_AGGREGATE_TARGET,工作區可以自動的進行全局管理。
PGA_AGGREGATE_TARGET 參數設置實例的PGA 目標總量,可以動態的修改。當 設置了此參數,所有的工作區大小就變為自動修改。
在Oracle9i 之前,控制SQL 工作區的最大尺寸,是通過設置以下參數:
SORT_AREA_SIZE、HASH_AREA_SIZE、BITMAP_MERGE_AREA_SIZE 和
CREATE_BITMAP_AREA_SIZE 完成的。4.專用服務器和共享服務器
某些內存分配特性與系統使用專用服務器還是共享服務器模式有關。表2-1 展現了兩 種情況的區別。
(三)、自動共享管理內存ASMM
1.ASMM 的作用
從Oracle 10g 開始,Oracle 提供了自動SGA 的管理(簡稱ASMM,Automatic Shared Memory Management)新特性。所謂ASMM,就是指我們不再需要手工設置shared pool、 buffer pool 等若干內存池的大小,而是為SGA 設置一個總的大小尺寸即可。Oracle 數據庫 會根據系統負載變化,自動調整各組件的大小,從而使得內存始終能夠流向最需要它的地方。 例如,假設某個系統在上午10:00 到下午9:00 屬於OLTP 應用,因而可能會用到較
多的BUFFER CACHE;而下午9:00 到上午10:00 屬於OLAP 系統,可能會用到較大 的SHARED POOL 和LARGE POOL。如果我們啟用了ASMM,數據庫就會根據負載的變 化而自動對內存大小進行調整,就不需要數據庫管理員手工進行調整了。2.如何使用ASMM
Oracle 10g 提供了一個新的初始化參數:sga_target 來啟動ASMM,該參數定義了整 個SGA 的總容量。同時,初始化參數statistics_level 必須設置為typical 或all 才能啟動 ASMM,否則如果設置為basic,則關閉ASMM。
ASMM 只能自動調整5 個內存池的大小,它們是:shared pool、buffer cache、large pool、 java pool 和stream pool 。我們不再需要設置shared_pool_size 、db_cache_size 、 large_pool_size、java_pool_size、streams_pool_size 這五個初始化參數。而其他的內存 池,比如log buffer、keep buffer cache 等仍然需要DBA 手工進行調整。
Oracle 10g 還提供了另一個初始化參數sga_max_size。sga_target 的值不能超過 sga_max_size 的值,修改sga_max_size 時,必須重啟實例才能生效,而sga_target 則可 以在線修改,立即生效,無須重啟實例。3.ASMM 的原理
為了實現ASMM,Oracle 新引入了一個名為MMAN(Memory Manager)的后台進程。 每隔很短的一段時間,MMAN 進程就會啟動,然后去詢問一下Oracle 提供的各個內存組件 顧問,比如有buffer cache 顧問,也有shared pool 顧問,由這些顧問根據當前的負載情況, 將這5 個可以自動調整的內存池的、建議的大小尺寸,返回給MMAN。於是,MMAN 進程 就會根據該返回的值,來設置各個內存池。同時,如果我們使用了spfile,還會將這些顧問
得出的建議值寫入spfile 里。這樣,下次啟動實例時,就可以直接把顧問得出的建議值拿來 作為啟動內存池的依據了。
如果我們啟用了ASMM,同時又手工設置了可以自動調整大小的內存池的尺寸,比如 設置了參數shared_pool_size 為一個非0 值的時候,會怎么樣?對於Oracle 10g 來說,我 們為自動調整大小的內存組件設置了值,則會以我們設置的值作為自動調整的最小值。也就 是說,假設sga_target 為4GB,而我們將shared_pool_size 設置為600MB,則MMAN 在 進行自動調整時,永遠不會將shared pool 設置為600MB 以下。4.11g 中的ASMM
在Oracle11g 數據庫中,使用自動內存管理特性不再需要設定參數SGA_TARGET 和 PGA_AGGREGATE_TARGET,,因為這兩個參數都已經被修改成自動調優的,除非想指定 PGA 和SGA 的最小值才需要設定這兩個參數。 在Oracle11g 數據庫中,則需要設置一個叫做MEMORY_TARGET 的初始化參數,這 個參數是指整個Oracle 實例所能使用的內存大小,包括PGA 和SGA 的整體大小,在 MEMORY_TARGET 的內存大小之內,PGA 和SGA 所用的內存可以根據當前負載情況自 動相互轉換。
如果當初始設定的MEMORY_TARGET 的內存不夠當前數據庫使用的時候,Oracle11g 還提供了另外一個初始化參數MEMORY_MAX_TARGET,當原始設定的內存不夠使用的時 候,可以手工來動態調節MEMORY_TARGET 的大
小,但是不允許超過MEMORY_MAX_TARGET 的值。下面這張圖簡單明了的描述出 了Oracle11g 數據庫內存大小的設定參數
三、Oracle 進程結構
Oracle 的進程分為用戶進程、服務器進程和后台進程。
用戶進程是在客戶機內存上運行的程序,在用戶請求連接Oracle 數據庫時建立。用戶 進程不能直接同Oracle 服務器交互,而是把操作請求提交給服務進程。服務進程是在用戶 同Oracle 數據庫建立會話之后自動在服務器端創建的進程。服務進程直接同Oracle 服務器 交互,執行用戶請求並返回結果。服務進程有專有和共享之分。 后台進程屬於Oracle 實例的一部分,Oracle 的后台進程的作用是對數據進行操作,並 維護數據庫系統,使其始終處於良好的狀態。
(一)、用戶進程與服務器進程
如圖3-1 所示,如果用戶要提交並執行SQL 語句,在用戶的客戶機上,要運行一個程 序如SQL*Plus 或其他應用程序,這個程序是作為用戶進程(User Process)運行的。當用 戶需要連接到Oracle 服務器時,在Oracle 服務器上會啟動一個與用戶進程對應的進程來為 用戶進程服務,這個進程稱為服務進程(Server Process)。注意,服務進程總是運行在Oracle 服務器上面的,而用戶進程既可以運行在服務器上面,也可以運行在客戶機上面。
用戶進程同服務進程通訊,需要建立一個連接,最簡單的情況是用戶進程同服務進程位 於同一台機器, 可通過內部進程通訊機制進行連接; 用戶也可以通過客戶服務器 (Client-Server)軟件通過網絡進行連接,這時需要進行相應的網絡通訊配置;比較復雜的 情況是通過三層結構,比如以瀏覽器作為客戶端進行連接。
如果一個客戶進程對應一個服務進程,我們稱該連接為專有(Dedicated)服務器連接, 如果多個客戶進程對應一個服務器進程,我們稱該連接為共享(Shared)服務器連接。
當特定的用戶同Oracle 服務器連接成功,並通過Oracle 服務器的身份驗證,這時用戶 和Oracle 服務器之間建立了一個會話(Session),同一個用戶可以並發的同Oracle 數據庫建 立多個會話。當用戶退出或異常斷開時,會話就結束了。
(二)、后台進程結構
為了實現為多用戶提供服務且保證系統性能,在一個多進程Oracle 系統(multiprocess Oracle system)中,存在多個被稱為后台進程(background process)的Oracle 進程。
一個Oracle 實例中可以包含多種后台進程,這些進程不一定全部出現在實例中。系統 中運行的后台進程數量眾多,用戶可以通過V$BGPROCESS 視圖查詢關於后台進程的信 息。這里給大家簡單介紹一些經常用到的數據庫后台進程:
● 系統監控進程(SMON),主要任務是實例啟動時執行恢復性工作,對有故障數據庫實例進行恢復。
● 進程監控進程(PMON),主要任務用於恢復失敗的用戶進程。
● 數據庫寫入進程(DBWn),將修改后的數據塊內容寫回數據文件。
● 日志寫入進程(LGWR),將內存中的日志內容寫入日志文件。
● 檢查點進程(CKPT),啟動檢查點,用於減少數據庫實例恢復所需要的時間。
● 歸檔進程(ARCn),當數據庫服務器以歸檔方式運行時調用該進程完成日志歸檔。
● 恢復進程(RECO),用於分布式數據庫中的失敗處理。
● 鎖進程(LCKn),在並行服務器模式下確保數據的一致性。
● 調度進程(Dnnn),負責把用戶進程分配到可用的服務進程進行處理。
1.查看后台進程
1 SQL> SELECT name FROM v$bgprocess WHERE paddr!='00'; 2 或者 3 [oracle@oracle ~ ]$ ps -ef | grep ora_
2.LGWR 日志寫入進程(Log Writer)
LGWR 日志寫入進程負責將重做日志緩沖區的日志條目寫入磁盤上的聯機日志文件。
當運行DML 或DDL 語句時,服務器進程首先要將事務的變化記載到重做日志緩沖區, 然后才會寫入數據高速緩沖區,並且重做日志緩沖區的內容將會被寫入聯機重做日志文件, 以避免系統出現意外帶來的數據損失(如果操作系統斷電,內存中的重做日志緩沖區的內容 會丟失,而存在磁盤上的聯機日志文件則不會丟失),這項任務由LGWR 來完成。
重做日志緩沖區是一個循環結構,LGWR 將重做日志緩沖區中的重做記錄寫入聯機重 做日志文件后,相應的緩沖區內容將被清空,保證Oracle 有空閑的重做日志緩沖區可以寫 入。
在出現以下情況時LGWR 會開始工作:
● 在DWBR 進程將臟緩沖區寫入數據文件之前。 //預寫協議
● 在重做日志記錄達到緩沖區的三分之一。
● 日志緩沖區記錄的日志多於1M。
● 每隔3 秒鍾。 //重做日志緩沖區是循環使用的,要騰出足夠的空間給新的記錄使用
● 提交事務(執行Commit)。 //提交事務相當於確定保存修改,不存入日志文件就有丟失的可能
Oracle 總是先記載數據變化到重做日志緩沖區,然后才修改數據高速緩存。與之類似, 在后台進程DBWn 將臟緩沖區寫入到數據文件之前,首先要由后台進程LGWR 將重做日志 緩沖區寫入到重做日志中。與數據高速緩存相比,重做日志緩沖區相對要小得多,但寫入頻 率高的多,Oracle 必須要確保重做日志緩沖區總有足夠的空間容納新事務,因此每隔3 秒 鍾或重做日志緩沖區已有三分之一填滿時LGWR 會自動工作。
另外,Oracle 采用了快速提交機制,當執行COMMIT 操作時,並不是將“臟緩沖區”數 據寫入到數據文件中,而是將重做日志緩沖區的內容寫入到重做日志文件中,以確保數據庫 完整性。此時即使系統出現意外情況(如掉電、系統崩潰等),因為被提交事務已經記載到 了存放在磁盤上的聯機重做日志文件中,將來在重新啟動數據庫時系統會自動進行實例恢 復,並將事務所修改數據寫入到數據文件中,從而避免了數據丟失。
3.DBWn 數據庫寫入進程(Database Writer)
數據庫寫入進程負責將數據庫高速緩沖區(臟緩沖區)的內容寫入到數據文件。 盡管有一個數據庫寫進程( DBW0 )適用於大多數系統,但數據庫管理員可以配置額 外的進程(DBW0-DBW9,最多10 個進程),以提高寫入性能,通過設置初始化參數 DB_WRITER_PROCESSES 來完成。如果你的系統修改數據嚴重,這些額外的DBWn 進 程在單處理器系統不是非常有用。
當 數據庫高速緩沖區的塊被修改,它被標記為臟緩沖區並添加到以SCN(System Change Number,系統更改號,這里可以看做“時間”)為順序的LRUW(LRUWriter)列表。 同時,這個順序與重做日志緩沖區的順序一致。
在出現以下情況時DBWn 進程會開始工作:
● 系統發出檢查點指令。- //同步數據,詳見檢查點進程(CKPT)。
● 臟緩沖區個數達到指定閥值。
● 服務進程搜索一定數目的數據塊后,不能找到自由緩沖區。
● 數據寫入計時時間到。 //客戶端執行SELECT\INSERT\UPDATE\DELETE 語句時,都需要訪問數據庫高 速緩沖區。如果是第一次訪問,必須要將數據由數據文件讀取到數據庫高速緩沖區,所 以Oracle 必須要確保數據高速緩存總是存在足夠的“自由緩沖區”以容納新數據。 當DBWn 進程將臟緩沖區的數據塊寫入到數據文件后,Oracle 將把“臟緩沖區” 標記為“自由緩沖區”。 因此,為了保證有足夠“自由緩沖區”來存放新的數據塊,需要DBWn 進程工作。
● 表空間脫機或進入只讀狀態。
● 執行刪除或截斷表操作。
● 執行ALTER TABLESPACE … BEGIN BACKUP 命令 //需要同步數據,原理同檢查點
4.CKPT 檢查點進程(Checkpoint)
CKPT 檢查點進程的作用是執行一個“檢查點”,同步數據庫的所有數據文件、控制文 件和重做日志文件。當執行檢查點時,系統促使DBWn 將數據緩沖區中數據的變化寫入數 據文件,同時完成對數據文件和控制文件的更新,記錄下當前數據庫的結構和狀態。在執行 一個檢查點之后,數據庫處於一個完整狀態。在數據庫發生崩潰后,可以將數據庫恢復到上 一個檢查點。
Oracle 數據庫在執行涉及數據變化的語句時,會針對任何修改生成一個順序遞增SCN (System Change Number)值,並且會將SCN 值連同事務的變化一起記載到重做日志緩 沖區。在數據文件、控制文件頭部以及重做日志文件中都記載有該值。Oracle 通過比較各 種文件的SCN 值,確定文件是否損壞、系統是否異常,最終確定系統是需要進行實例恢復 還是介質恢復。在發出檢查點時,數據文件、控制文件和重做日志的SCN 值完全一致。進程CKPT 在以下情況下會開始工作:
- 發生日志切換 。
- 關閉實例(SHUTDOWN ABORT 除外)。
- 手工執行檢查點操作。
- 由初始化參數LOG_CHECKPOINT_INTERVAL 和 LOG_CHECKPOINT_TIMEOUT 強制發出。
假設現在有一張員工工資表,員工號7899 的員工張三工資為8000,由於工作表現良好, 現在為其加薪到10000。
1> 此時,第一次讀取,需要將數據從數據文件讀入數據庫高速緩沖區。2> 數據讀入數據庫高速緩沖區后,我們修改數據的條目先記錄入重做日志緩沖區:
3> 接着新數據被寫入數據庫高速緩沖區
4> 提交,LGWR 進程將條目從重做日志緩沖區寫入聯機重做日志文件
5> 執行檢查點CKPT,同步數據庫
發現聯機日志文件為最新,同步更新數據文件、控制文件,觸發了DBWn 進程。
5.SMON 系統監控進程(System Monitor)
SMON 系統監控進程主要作用是強制對數據庫進行恢復操作。在實例啟動時,如果上 一次數據庫是非正常關閉,並且重做日志文件和控制文件的SCN 值是不同的,Oracle 將自 動在重新打開數據庫之前,通過執行重做日志文件的記錄,來同步所有數據文件、控制文件 和重做日志文件,確保所有數據庫文件的一致性,然后才打開數據庫。
如果檢查點進程一例中,第四步完成后發生系統掉電、崩潰,那么數據會不會丟失呢? 當然不會。我們知道,系統掉電,導致內存中的數據(數據庫高速緩沖區)的數據丟失。那 么自然上例中的第五步無法完成(無法從數據庫高速緩沖區寫入數據文件),但是由於此時 已寫入聯機日志文件。因此,此時數據將從聯機日志文件中更新,而更新的數據量是多少, 自然就是由SCN 決定。
這一過程我們成為“實例恢復”。該過程不需要數據庫管理員手工干預,由SMON 進程 自動完成。
該進程還負責在啟動實例時清理臨時段和合並區(Extent)碎片等工作。所以SMON 進程的工作歸納如下:
- ● 進行實例恢復
- ● 合並數據文件的自由空間
- ● 釋放數據文件的臨時段
6.PMON 進程監控進程(Process Monitor)
PMON 進程監控進程負責對失敗的用戶進程或服務進程進行恢復。當用戶進程連接到 Oracle 服務器時,Oracle 將在服務器端分配相應的服務進程。這時由PMON 進程來監視用 戶進程的執行情況。當由於種種原因,用戶對Oracle 數據庫的連接,發生崩潰、掛起或異 常終止現象時,該進程負責清除服務進程所占用的資源,回滾沒有完成的事務。
當PMON 檢測到用戶進程失敗時,進行的工作歸納如下:
- ● 回滾當前用戶的事務
- ● 釋放當前用戶加的表或行級鎖
- ● 釋放用戶的其他資源
- ● 重新啟動死掉的調度進程
假定我們在客戶端運行SQL*Plus 並通過網絡訪問Oracle 服務器,那么Oracle 將在服 務器端分配相應的服務進程。假如用戶異常終止SQL*Plus,或出現網絡斷開或客戶端死機 的情況,PMON 就必須檢測到這種情況,並釋放掉服務進程所占用的資源。
7.ARCn 歸檔進程(Archive)
ARCn 歸檔進程完成日志的歸檔備份,是一個可選后台進程。當數據庫運行於歸檔日志 模式(ARCHIVELOG)下時,負責將已寫滿的重做日志文件復制到歸檔日志目標文件中, 這樣可以保留所有的重做記錄。有了歸檔日志和數據庫早期的物理備份,即使發生磁盤數據 丟失,也可以通過原來的數據文件和歸檔日志進行恢復。
日志文件是循環使用的,當一個日志寫滿后,自動切換到另一個日志文件。ARCn 進程 在重做日志文件進行切換時開始工作,將寫滿的重做日志文件寫入歸檔日志文件。根據歸檔 任務量的大小,通過設置初始化參數,可以同時啟動多個ARCn 進程。Oracle 服務器默認 的是非歸檔模式,通過修改初始化參數文件中的參數可以改變歸檔模式。生產數據庫通常都 會設置為歸檔模式。
8.RECO 恢復進程(Recover)
RECO 恢復進程負責在分布式數據庫(Distributed Database)環境下,自動恢復失敗的 分布式事務。當某個分布式事務由於網絡連接故障或者其他原因失敗時,RECO 進程將會 嘗試與該事物相關的所有數據庫進行聯系,已完成對失敗事物的處理工作。
9.Dnnnn 調度進程
Dnnnn 調度進程是多線程服務器體系結構的一部分,調度進程接受用戶進程的請求, 將他們放入到請求隊列中,然后為請求隊列中的用戶進程分配一個服務進程。
四、Oracle 數據庫
數據庫是數據存儲的容器,作用是用來收集、存儲數據和返回信息。 Oracle 數據庫的物理結構包括兩個部分,分別是數據庫文件和操作系統文件。
(一)、數據庫文件
1.控制文件(Control Files)
控制文件是一個很小的二進制文件,用於記錄和維護數據庫結構(數據庫名、數據文件 的名稱和路徑、聯機重做日志文件的名稱和路徑、備份信息等),每個Oracle 數據庫可以有 1-8 個控制文件,最少要包含一個控制文件。
一般情況下,實例和數據庫是一一對應的關系,Oracle 數據庫通過控制文件在實例和 數據庫之間建立關聯。
在啟動數據庫時,系統會根據初始化參數control_files 來定位控制文件,Oracle 從控制 文件中讀取組成數據庫所有物理文件的信息,這樣就可以打開必要的文件。如果控制文件丟 失或出現錯誤,數據庫的啟動就會失敗。為了保護數據庫的安全,Oracle 采用復合控制文 件,即控制文件同時可以有多個鏡像。1> 查看控制文件相關信息
1 SQL> SELECT name FROM v$controlfile; 2 NAME 3 ---------------------------------------------------------------- 4 /disk1/orcl/control01.ctl 5 /disk2/orcl/control02.ctl 6 /disk3/orcl/control03.ctl 7 或者 8 SQL> SHOW PARAMETER CONTROL2> 二進制備份控制文件
3> 文本備份控制文件
2.數據文件(Data File)
數據文件是用於存儲數據庫數據的物理文件,它由若干個操作系統文件組成,在數據文 件中存儲着用戶數據(表、索引等)、數據字典以及回滾段數據等。
數據文件和表空間有着密切的關系,Oracle 數據庫至少要包含一個數據文件,並且數據 文件是表空間的物理組成元素,一個表空間可以包含多個數據文件,並且每個數據文件只能 惟一地屬於某個表空間。“表空間”在后面會做介紹。
數據文件相關視圖:
3.聯機重做日志文件(Online Redo Log File)
重做日志文件是用於記錄數據庫變化的物理文件,其作用是在發生意外時恢復Oracle 數據庫。
日志文件以日志文件組的形式存在。我們知道重做日志緩沖區是循環使用的:當重做日志緩沖區的重做項被寫入聯機重做日 志文件后,重做日志緩沖區的內容可以被覆蓋;
日志文件也是循環使用的,當聯機重做日志文件中記錄的數據已經同步寫入數據文件, 聯機重做日志文件中的內容也可以被覆蓋。但是這種循環以組的方式循環。
如圖4-1 所示,當前數據庫有三個重做日志組,每個組有兩個成員(同一組內多個成員 為鏡像關系,成員是為了保護文件不丟失、損壞而作的冗余,一般存放在不同磁盤上)。正 在使用的是第一個日志文件組。當第一個日志文件組寫滿后切換至第二組寫入,第二組寫滿 后切換至第三個重做日志組,第三個重做日志組寫滿后,再切換回第一組寫入
(二)、操作系統文件
1.初始化參數文件(Initialization Parameter File)
初始化參數文件定義了Oracle 實例的各項參數,初始化參數文件是打開Oracle 實例必 需的文件。對於Linux 操作系統,初始化參數文件一般默認存放在$ORACLE_HOME/dbs 路徑下。初始化參數文件分為靜態初始化參數文件和動態初始化參數文件。 靜態初始化參數文件為文本格式,可以用vi 編輯器編輯,默認名為initsid.ora; 動態初始化參數文件為二進制格式,不可以用vi 編輯器編輯,默認名為spfilesid.ora。 關於初始化參數文件的詳細內容,會在《數據庫的啟動和關閉》章節介紹。
2.口令文件(Password File)
口令文件用於存放特權用戶信息及其口令的文件,“特權用戶”是指具有啟動、關閉 Oracle 服務器並建立數據庫等特殊權利的用戶。如具有SYSDBA、SYSOPER、SYSASM 權限的用戶。 關於口令文件的詳細內容,會在《管理用戶安全性》章節介紹。
3.歸檔日志文件(Archive Log File)
歸檔日志文件用於記錄聯機重做日志文件中的內容。 我們知道,聯機重做日志文件以日志組的形式存在,並且循環使用。也就是說,如果聯 機重做日志文件被覆蓋以后數據庫發生故障,由於日志已經覆蓋,將會導致數據庫無法恢復。 因此,我們希望聯機重做日志文件能夠得以保留。而聯機重做日志文件是聯機的,也就 是說,數據庫正常運行的時候需要用到,這時候如果把日志全部留在聯機重做日志文件中, 必然會對數據庫的正常運行造成影響;而這些日志往往是出現意外時才會使用的。 由於以上的原因,能夠保留聯機重做日志文件的內容,同時將這些內容脫機,是最好的 解決方案。歸檔日志文件正滿足了這些需求。
當聯機重做日志組發生切換時,上一組的內容同時寫入歸檔日志文件,這樣既可以保證 日志不會丟失,又可以保證不影響數據庫的正常運行。 關於歸檔日志文件的詳細內容,會在《日志文件和歸檔日志文件》章節詳細介紹。
4.追蹤文件(Trace File)和警告文件(Alert Log File)
追蹤文件用於存放后台進程和服務器進程的跟蹤信息。后台進程跟蹤文件存放着后台進 程的警告和錯誤信息,並且每個后台進程都有相應的跟蹤文件。服務器進程跟蹤文件用於存 放SQL 語句的跟蹤信息該類文件會記載SQL 語句的執行時間、執行計划等信息等。 警告文件由連續的消息和錯誤組成。通過查看警告文件,可以查看到Oracle 內部錯誤、 塊損壞錯誤以及非默認的初始化參數值,並且可以監視特權用戶的所有操作,例如啟動、關 閉數據庫。
五、練習
1 2 1.下列哪個組件不是Oracle 實例的組成部分? 3 A. 系統全局區SGA B. PMON 后台進程 4 C. 控制文件D. 調度程序 5 2.下面哪個內存區域是用來緩存數據字典信息的? 6 A. Database Buffer Cache B. PGA 7 C. Redo Log Buffer D. Shared Pool 8 3.如果一個服務進程中止,Oracle 使用哪一個進程來釋放它所占有的資源? 9 A. DBWn B. LGWR 10 C. SMON D. PMON 11 4.下列哪個后台進程,不是Oracle 實例必須啟動的? 12 A. DBWN B. LGWR 13 C. SMON D. ARCn 14 5.如果一個數據緩沖區被稱為臟緩沖區,正確的說法是: 15 A. 該緩沖區的數據與數據文件不一致。 16 B. 該緩沖區的數據與數據文件一致。 17 C. 該緩沖區的數據正在被使用。 18 D. 該緩沖區的數據包含有錯誤。 19 6.數據庫高速緩沖區的大小可以由以下哪個初始化參數決定? 20 A. LOG_BUFFER 21 B. LARGE_POOL_SIZE 22 C. DB_CACHE_SIZE 23 D. SHARED_POOL_SIZE 24 7.以下哪種情況會引起檢查點? 25 A. SCN 的值發生變化。 26 B. 切換日志。 27 C. 臟緩沖區個數達到指定閥值。 28 D. 執行Commit 命令。 29 8.下面哪一個是對LGWR 進程的描述 30 A.負責對實例進行恢復 31 B.進程失敗后進行清理 32 C.記錄數據庫的變化,以便進行數據恢復 33 D.將臟緩沖區寫入數據文件 34 專業專注超越Oracle 體系結構篇之Oracle 服務器結構 35 - 29 - 36 9.下列哪些視圖可用來查詢控制文件信息: 37 A.V$CONTROLFILES B.V$DATABASE 38 C.V$CONTROLFILE D.V$CONTROL 39 10.LGWR 進程在哪些情況下寫重做日志緩沖區到重做日志文件: 40 A.每三秒 41 B.當日志緩沖區的1/3 已滿時 42 C.執行Commit 語句時 43 D.都正確 44 11.哪種數據庫文件用來記錄應用程序對數據庫的改變: 45 A.數據文件B.控制文件 46 C.重做日志文件D.參數文件 47 12.下面哪些內存區域使用LRU 機制進行管理: 48 A.JAVA 池B.重做日志緩沖區 49 C.數據庫高速緩沖區D.大池 50 13.下面哪個后台進程可實現對重做日志文件的歸檔: 51 A.PMON B.CKPT 52 C.LCKn D.ARCn 53 54 55