oracle體系結構(1)

jss001發表於2009-03-06
在本章裡你可以瞭解以下內容
  
  1、 ORACLE 例項——包括記憶體結構與後臺程式
  2、 ORACLE 資料庫——物理作業系統檔案的集合
  3、 瞭解記憶體結構的組成
  4、 瞭解後臺程式的作用
  5、 瞭解資料庫的物理檔案
  6、 解釋各種邏輯結構
  
  一、ORACLE例項
  
  1、ORACLE 例項
  
  System Global Area(SGA) 和 Background Process 稱為資料庫的例項。
  
  2、ORACLE 資料庫
  
  一系列物理檔案的集合(資料檔案,控制檔案,聯機日誌,引數檔案等)
  
  3、系統全域性共享區System Global Area(SGA)
  
  System Global Area 是一塊巨大的共享記憶體區域,他被看做是Oracle 資料庫的一個大緩衝池,這裡的資料可以被ORACLE的各個程式共用。其大小可以透過如下語句檢視:
  SQL> select * from v$sga;
  NAME VALUE
  -------------------- ---------
  Fixed Size 39816
  Variable Size 259812784
  Database Buffers 1.049E+09
  Redo Buffers 327680
  
  更詳細的資訊可以參考V$sgastat、V$buffer_pool
  
  主要包括以下幾個部分:
  
  a、 共享池(Shared pool)
  
  共享池是SGA中最關鍵的記憶體片段,特別是在效能和可伸縮性上。一個太小的共享池會扼殺效能,使系統停止,太大的共享池也會有同樣的效果,將會消耗大量的CPU來管理這個共享池。不正確的使用共享池只會帶來災難。共享池主要又可以分為以下兩個部分:
  
  SQL語句緩衝(Library Cache)
  
   當一個使用者提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程類似於編譯,會耗費相對較多的時間。在分析完這個 SQL,Oracle會把他的分析結果給儲存在Shared pool的Library Cache中,當資料庫第二次執行該SQL時,Oracle自動跳過這個分析過程,從而減少了系統執行的時間。這也是為什麼第一次執行的SQL 比第二次執行的SQL要慢一點的原因。
  
  下面舉例說明parse的時間
  SQL> select count(*) fromscpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.08
  
  這是在Share_pool 和Data buffer 都沒有資料緩衝區的情況下所用的時間
  SQL> alter system flush SHARED_POOL;
  System altered.
  
  清空Share_pool,保留Data buffer
  SQL> select count(*) from scpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.02
  SQL> select count(*) from scpass ;
  COUNT(*)
  ----------
  243
  Elapsed: 00:00:00.00
  
  從兩句SQL 的時間差上可以看出該SQL 的Parse 時間約為00:00:00.02
  
   對於儲存在共享池中的SQL語句,可以從V$Sqltext、v$Sqlarea中查詢到,對於程式設計者來說,要儘量提高語句的重用率,減少語句的分析時 間。一個設計的差的應用程式可以毀掉整個資料庫的Share pool,提高SQL語句的重用率必須先養成良好的變成習慣,儘量使用Bind變數。
  
  資料字典緩衝區(Data Dictionary Cache)
  
  顯而易見,資料字典緩衝區是ORACLE特地為資料字典準備的一塊緩衝池,供ORACLE內部使用,沒有什麼可以說的。
  
  b、塊緩衝區快取記憶體(Database Buffer Cache)
  
   這些緩衝是對應所有資料檔案中的一些被使用到的資料塊。讓他們能夠在記憶體中進行操作。在這個級別裡沒有系統檔案,,戶資料檔案,臨時資料檔案,回滾段文 件之分。也就是任何檔案的資料塊都有可能被緩衝。資料庫的任何修改都在該緩衝裡完成,並由DBWR程式將修改後的資料寫入磁碟。
  
  這個緩衝區的塊基本上在兩個不同的列表中管理。一個是塊的“髒”表(Dirty List),需要用資料庫塊的
  
   書寫器(DBWR)來寫入,另外一個是不髒的塊的列表(Free List),一般的情況下,是使用最近最少使用 (Least Recently Used,LRU)演算法來管理。塊緩衝區快取記憶體又可以細分為以下三個部分(Default pool,Keep pool,Recycle pool)。如果不是人為設定初始化引數(Init.ora),ORACLE將預設為Default pool。由於作業系統定址能力的限制,不透過特殊設定,在32位的系統上,塊緩衝區快取記憶體最大可以達到1.7G,在64位系統上,塊緩衝區快取記憶體最 大可以達到10G。
  
  c、重做日誌緩衝區(Redo log buffer)
  
  重做日誌檔案的緩衝區,對數 據庫的任何修改都按順序被記錄在該緩衝,然後由LGWR程式將它寫入磁碟。這些修改資訊可能是DML語句,如 (Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。 重做日誌緩衝區的存在是因為記憶體到記憶體的操作比較記憶體到硬碟的速度快很多,所以重作日誌緩衝區可以加快資料庫的操作速度,但是考慮的資料庫的一致性與可恢 復性,資料在重做日誌緩衝區中的滯留時間不會很長。所以重作日誌緩衝區一般都很小,大於3M之後的重作日誌緩衝區已經沒有太大的實際意義。
  
  d、Java程式緩衝區(Java Pool)
  
  Java 的程式區,Oracle 8I 以後,Oracle 在核心中加入了對Java的支援。該程式緩衝區就是為Java 程式保留的。如果不用Java程式沒有必要改變該緩衝區的預設大小。
  
  e、大池(Large Pool)
  
  大池的得名不是因為大,而是因為它用來分配大塊的記憶體,處理比共享池更大的記憶體,在8.0開始引入。
  
  下面物件使用大池:
  
  MTS——在SGA的Large Pool中分配UGA
  
  語句的並行查詢(Parallel Executeion of Statements)——允許程式間訊息緩衝區的分配,用來協調 並行查詢伺服器
  
  備份(Backup)——用於RMAN磁碟I/O快取
  
  4、後臺程式(Background process)
  
   後臺程式是Oracle的程式,用來管理資料庫的讀寫,恢復和監視等工作。Server Process主要是透過他和user process進行聯絡和溝通,並由他和user process進行資料的交換。在Unix機器上,Oracle後臺程式相對於作業系統程式,也就是說,一個Oracle後臺程式將啟動一個作業系統進 程;在Windows機器上, Oracle後臺程式相對於作業系統執行緒,開啟工作管理員,我們只能看到一個ORACLE.EXE的程式,但是透過另外的工具,就可以看到包含在這裡程式 中的執行緒。
  
  在Unix上可以透過如下方法檢視後臺程式:
  
  ps –ef | grep ora_
  # ps -ef | grep ora_ | grep XCLUAT
  oracle 29431 1 0 Sep 02 2:02 ora_dbwr_SID
  oracle 29444 1 0 Sep 02 0:03 ora_ckpt_SID
  oracle 29448 1 0 Sep 02 2:42 ora_smon_SID
  oracle 29442 1 0 Sep 02 3:25 ora_lgwr_SID
  oracle 29427 1 0 Sep 02 0:01 ora_pmon_SID
  
  a、Oracle系統有5 個基本程式他們是
  DBWR(資料檔案寫入程式)
  LGWR(日誌檔案寫入程式)
  SMON(系統監護程式)
  PMON(使用者程式監護程式)
  CKPT(檢查點程式,同步資料檔案, 日誌檔案,控制檔案)
  
  b、DBWR
  將修改過的資料緩衝區的資料寫入對應資料檔案
  維護系統內的空緩衝區
  這裡指出幾個容易錯誤的概念:
  當一個更新提交後,DBWR把資料寫到磁碟並返回給使用者提交完成.
  DBWR會觸發CKPT 後臺程式
  DBWR不會觸發LGWR 程式
  上面的概念都是錯誤的.
  DBWR是一個很底層的工作程式,他批次的把緩衝區的資料寫入磁碟。和任何前臺使用者的程式幾乎沒有什麼關係,也不受他們的控制。至於DBWR會不會觸發LGWR和CKPT程式,我們將在下面幾節裡討論。
  DBWR工作的主要條件如下
  DBWR 超時
  系統中沒有多的空緩衝區用來存放資料
  CKPT 程式觸發DBWR 等
  
  c、LGWR
  將重做日誌緩衝區的資料寫入重做日誌檔案,LGWR是一個必須和前臺使用者程式通訊的程式。當資料被修改的時候,系統會產生一個重做日誌並記錄在重做日誌緩衝區內。這個重做日誌可以類似的認為是以下的一個結構:
  SCN=000000001000
  資料塊ID
  物件ID=0801
  資料行=02
  修改後的資料=0011
  提交的時候,LGWR必須將被修改的資料的重做日誌緩衝區內資料寫入日誌資料檔案,然後再通知前臺程式提交成功,並由前臺程式通知使用者。從這點可以看出LGWR承擔了維護系統資料完整性的任務。
  LGWR 工作的主要條件如下
  使用者提交
  有1/3 重做日誌緩衝區未被寫入磁碟
  有大於1M 重做日誌緩衝區未被寫入磁碟
  超時
  DBWR需要寫入的資料的SCN號大於LGWR 記錄的SCN號,DBWR 觸發LGWR寫入
  
  d、SMON
  工作主要包含
  清除臨時空間
  在系統啟動時,完成系統例項恢復
  聚結空閒空間
  從不可用的檔案中恢復事務的活動
  OPS中失敗節點的例項恢復
  清除OBJ$表
  縮減回滾段
  使回滾段離線
  
  e、PMON
  主要用於清除失效的使用者程式,釋放使用者程式所用的資源。如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗程式的SGA資源。
  
  f、CKPT
  同步資料檔案,日誌檔案和控制檔案,由於DBWR/LGWR的工作原理,造成了資料檔案,日誌檔案,控制檔案的不一至,這就需要CKPT程式來同步。CKPT會更新資料檔案/控制檔案的頭資訊。
  CKPT工作的主要條件如下
  在日誌切換的時候
  資料庫用immediate ,transaction , normal 選項shutdown 資料庫的時候
  根據初始話檔案LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設定的數值來確定
  使用者觸發
  以下程式的啟動需要手工配置
  
  g、ARCH
  當資料庫以歸檔方式執行的時候,Oracle會啟動ARCH程式,當重做日誌檔案被寫滿時,日誌檔案進行切換,舊的重做日誌檔案就被ARCH程式複製到一個/多個特定的目錄/遠端機器。這些被複制的重做日誌檔案被叫做歸檔日誌檔案。
  
  h、RECO
  負責解決分佈事物中的故障。Oracle可以連線遠端的多個資料庫,當由於網路問題,有些事物處於懸而未決的狀態。RECO程式試圖建立與遠端伺服器的通訊,當故障消除後,RECO程式自動解決所有懸而未決的會話。
  i、服務程式Server Process
  服務程式的分類
  專用服務程式(Dedicated Server Process)
  一個服務程式對應一個使用者程式
  共享服務程式(MultiTreaded Server Process)
  一個服務程式對應多個使用者程式,輪流為使用者程式服務。
  PGA & UGA
  PGA = Process Global Area
  UGA = User Global Area
  他儲存了使用者的變數、許可權、堆疊、排序空間等使用者資訊,對於專用伺服器程式,UGA在PGA中分配。對於多執行緒程式,UGA在Large pool中分配。
  
  j、使用者程式User Process
  在客戶端,將使用者的SQL 語句傳遞給服務程式
  
  5、一個貫穿資料庫全域性的概念----系統改變號SCN(System Change Number)
  系統改變號,一個由系統內部維護的序列號。當系統需要更新的時候自動增加,他是系統中維持資料的一致性和順序恢復的重要標誌。
  
  a. 查詢語句不會使SCN增加,就算是同時發生的更新,資料庫內部對應的SCN也是不同的。這樣一來就保證了資料恢復時候的順序。[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1016960/,如需轉載,請註明出處,否則將追究法律責任。

相關文章