oracle數據庫優化基礎

實例(instance)與數據庫(database)
  
  數據庫是物理概念:它包括存儲在磁盤中的文件。實例是邏輯概念:它包括服務器中的內存結構與進程
  
  一個實例能夠而且只能與一個數據庫連接
  
  實例是暫時存在的實體,而數據庫只要正確維護則永久存在
  
  用戶一般不會直接訪問Oracle數據庫的信息,而是通過Oracle實例來訪問信息
  
  如果實例掛起,雖然數據庫仍然存在,用戶卻無法對它進行訪問。此時數據庫是靜態的:其數據不會改變。當實例重新服務時,數據庫中的數據則隨時做好準備,即可以對它進行訪問
  
  表空間(tablespace)
  
  表空間是一個邏輯結構,它和操作系統一樣,是不可見的
  
  表空間由數據文件這樣的物理結構組成;每個表空間包括一個或多個數據文件,但每個數據文件只能屬於一個表空間。
  
  創建一個表時,必須說明是在哪個表空間內創建的。這樣,Oracle才能在組成該表空間的數據文件中爲它找到空間。
  
  表空間是Oracle數據庫信息物理存儲的一個邏輯視圖。
  
  Oracle數據庫中的物理文件
  
  一個Oracle數據庫實際上是由以下三種基本類型的物理文件組成:
  
  控制文件  數據文件  日誌文件
  
  控制文件
  
  控制文件包含組成該數據庫的其他文件(例如,數據文件和日誌文件)的列表,它還包括數據庫內容和狀態的關鍵信息
  
  控制文件參數
  
  控制文件的大小主要受下述的初始化參數所影響,這些初始化參數是初始文件的組成部分,並在創建數據庫時得到設置
  
  MAXLOGFILES
  
  表示數據庫日誌組的最大數目
  
  MAXLOGMEMBERS
  
  每個日誌文件組的最大成員數目
  
  MAXLOGHISTORY
  
  表示控制文件所包含的歷史日誌文件的數目。這個歷史文件可以用於簡化自動恢復,它通過識別一個歸檔日誌文件中事務的範圍來使用有關的日誌文件。
  
  MAXDATAFILES
  
  表示控制文件能夠跟蹤的數據文件數目。在創建數據庫時,該參數決定了對應於數據文件的控制文件中設置的空間總量。如果增加的數據文件數目比MAXDATAFILES參數所指定的要大,控制文件則會自動擴展。
  
  MAXINSTANCES
  
  表示控制文件能夠跟蹤的實例總量和數目
  
  [color=Blue]多重控制文件[/b]
  
  一個數據庫至少應該有兩個控制文件。建立一個控制文件的多個複本是一個好辦法,通過對初始化文件中實例的CONTROL_FILES參數指定多個控制文件的位置,可以實現控制文件的多個複本:
  
  CONTROL_FILES=(/u00/oradata/prod/prodctl1.ctl,
  /u01/oradata/prod/prodctl2.ctl,
  /u02/oradata/prod/prodctl3.ctl)
  
  這個參數會告訴實例在哪裏能夠找到控制文件。Oracle對控制文件的改變同時進行。
  
  數據文件
  
  數據文件包括存儲在數據庫中的實際數據,其中包括:存儲數據的表和索引;維護這些數據結構信息的的數據字典,以及用於實現數據一致機制的回滾段
  
  一個數據文件由Oralce數據庫數據塊(block)組成,而Oracle數據庫數據塊又是由磁盤中操作系統數據塊組成。一個Oracle數據塊的大小可從2KB到32KB。如果在Oracle中支持巨大內存(Very Large Memory,VLM),一個Oracle數據塊能達到64KB。
  
  每個表空間的數據塊大小要一致,但在整個數據庫中數據塊的大小可以不同。
  
  根據需要,數據從數據文件中以數據庫的數據塊爲單位讀到內存中,數據塊也可以從內存中被寫入磁盤的數據文件中,從而確保數據庫真實地記錄了用戶所做的改變。
  
  Oracle數據庫與操作系統聯繫最緊密的是數據文件。在I/O子系統中佈置數據庫,能放置在任何位置的最小部分就是數據文件。
  
  數據文件結構
  
  數據文件的第一個數據塊稱爲數據文件首部(datafile header),它包含了維護整個數據庫完整性的關鍵信息。其中最重要的信息之一就是檢查點結構(checkpoint structure)。這是一個邏輯時間戳,表示改變寫入數據文件的最後時刻。這個時間戳對恢復數據庫來說是非常關鍵的,Oracle恢復過程就是用數據文件首部中的這個時間戳來確定:到底應該用哪個日誌文件將數據文件及時地恢復到當前點
  
  數據範圍與段
  
  從物理角度看,一個數據文件作爲操作系統數據塊加以存儲。從邏輯角度看,數據文件有三個中間結構層:數據塊(block)、數據範圍(extent)和段(segment)。數據範圍是指一個Oracle數據文件中相鄰的數據塊集合。段表示在Oralce數據庫中佔據空間的對象,例如由一個或多個數據範圍組成的表或索引。
  
  當Oracle修改數據時,它要修改的是同一數據塊中的數據。如果該數據塊沒有足夠的空間存放新信息,那麼Oracle把它寫到另一個新的數據塊中,兩個數據塊可能在不同的數據範圍內。
  
  Oracle默認數據塊大小爲2KB
  
  日誌文件
  
  日誌文件用於存儲由事務處理或Oracle內部行爲而引起的數據庫變化。在一般的操作中,Oracle會將改變的數據塊存儲到內存中;這樣當實例發生故障時,有些改變的數據塊可能還沒來的及寫到數據文件中。此時,利用日誌文件中記錄的信息可以恢復丟失的改變。
  
  可以對錶或整個表空間設定NOLOGGING屬性。這樣,基於表或表空間中所有表的操作都將抑制生成日誌信息
  
  多重日誌文件
  
  每個Oracle實例用一個日誌線程(thread)來記錄數據庫的變化。日誌線程由若干日誌組構成,日誌組又由一個或多個日誌成員構成。
  
  從邏輯上講可以將一個日誌組理解成一個獨立的日誌文件。但是,Oracle允許指定日誌的多個複本來保護日誌文件的完整性。
  
  在控制文件丟失的情況下,還有重建控制文件靜態部分的方法,但是對丟失的日誌文件就沒有重新生成的方法,因此必須保證日誌文件有多個複本。
  
  Oracle同步執行對所有日誌成員的寫操作。在確認了磁盤上所有的日誌文件複本都正確地修改後,寫日誌操作纔算已經執行。
  
  Oracle如何使用日誌
  
  當服務器將所有能用的日誌文件都使用過一次,它將再次轉向第一個並重新使用。Oracle用日誌文件序列號來跟蹤不同的日誌文件。這個序列號記錄正在使用的日誌文件中
  
  操作系統用日誌文件名來識別物理文件,而Oracle用日誌文件序列號來確定日誌文件填寫和循環使用的順序。因爲Oracle會自動重複使用日誌文件,因此並不需要用日誌文件名來確定它在日誌文件序列的位置。
  
  歸檔日誌
  
  Oralce兩種日誌文件類型:
  
  聯機日誌文件
  
  這是Oracle用來循環記錄數據庫改變的操作系統文件
  
  歸檔日誌文件
  
  這是指爲避免聯機日誌文件重寫時丟失重複數據而對聯機日誌文件所做的備份
  
  Oracle有兩種歸檔日誌模式,Oracle數據庫可以採用其中任何一種模式:
  
  NOARCHIVELOG
  
  不對日誌文件進行歸檔。這種模式可以大大減少數據庫備份的開銷,但可能回導致數據的不可恢復
  
  ARCHIVELOG
  
  在這種模式下,當Oracle轉向一個新的日誌文件時,將以前的日誌文件進行歸檔。爲了防止出現歷史“缺口”的情況,一個給定的日誌文件在它成功歸檔之前是不能重新使用的。歸檔的日誌文件,加上聯機日誌文件,爲數據庫的所有改變提供了完整的歷史信息。
  
  在Oracle利用日誌文件和歸檔日誌文件來恢復數據庫時,內部序列號可以起一個嚮導的作用。
  
  ARCHIVELOG模式和自動歸檔
  
  Oracle自動歸檔分成兩步。首先,用SQL命令來轉向歸檔日誌模式
  
  ALTER DATABASE ARCHIVELOG
  
  如果數據庫在ARCHIVELOG模式下,在Oracle寫日誌時,它會標識出用於歸檔的日誌。
  
  但是標記爲用於歸檔的日誌並不意味着它們會自動歸檔。必須在初始化文件中設置如下參數:
  
  LOG_ARCHIVE_START=TURE
  
  這樣就啓動了歸檔進程,由Oracle調用該進程,將完整的日誌文件拷貝到歸檔日誌的目標位置。
  
  歸檔日誌的目標位置以及歸檔日誌文件名的形式需使用另兩個參數來指定,即LOG_ARCHIVE_DEST和LOG_ARCHIVE_FORMAT。以下是一個設置的例子:
  
  LOG_ARCHIVE_DEST = C: /ORANT/DATABASE/ARCHIVE
  
  該語句指定了Oracle存放歸檔日誌的目錄。
  
  LOG_ARCHIVE_FORMAT = "ORCL%S.ARC"
  
  這個語句指定了Oracle對歸檔日誌文件的命名形式。此例中,文件名必須以ORCL開始,以.ARC結束。Oracle自動用左邊補零的日誌文件序列號來替代通配符%S。命名形式中可選的通配符還有:
  
  %S  以序列號替代,但左邊不補零
  
  %T  用補零的日誌線程號來替代
  
  %t  用不補零的日誌線程號來替代
  
  每個Oracle實例開始運行時,都要首先讀初始化文件,在此之後對參數的改變不會影響此實例的運行。只有在再次啓動實例時,改變的參數纔會起作用。
  
  儘管打開了自動歸檔模式也不會使數據庫處於ARCHIVELOG模式。同樣,僅僅將數據庫設置爲ARCHIVELOG模式是不會自動啓動歸檔進程的。
  
  LOG_ARCHIVE_START參數默認設置爲FALSE。有時由於ARCHIVELOG模式和LOG_ARCHIVE_START設置不一致,會導致一個Oracle實例無止境地等待。假如設置了歸檔模式,但是沒有啓動自動歸檔進程,這樣因爲不能寫一個沒有歸檔的日誌文件,Oracle實例就會停止。換句話說,不能自動執行該文件的歸檔進程。爲了避免這樣的問題,首先修改初始化參數,然後設置ALTER DATABASE ARCHIVELOG命令。
  
  在自動歸檔進程中應該確保歸檔目錄中有足夠的空間。如果歸檔日誌文件目標空間已滿,Oracle不能對其他的日誌文件進行歸檔,它將會掛起。
  
  歸檔日誌對Oracle數據庫的恢復很重要,Oracle8及其以後的版本允許爲歸檔日誌指定多個目標位置。Oracle將日誌文件寫入每個指定的路徑中,還可以指定每個複本是否必須成功。用於該功能的初始化參數如下:
  
  LOG_ARCHIVE_DUPLEX_DEST
  爲冗餘的日誌文件指定其他的存放位置
  LOG_ARCHIVE_MIN_SUCCEED_DEST
  表示日誌文件是否必須成功寫入某個或全部的存儲位置
  
  從Oracle8i開始,用戶可以指定五個必需的或可選的歸檔日誌存放位置,包括用於災難性恢復的遠程系統。Oracle自動支持多個歸檔進程,並對多個歸檔位置同時進行相同的歸檔。
  
  實例的組件
  
  Oracle實例可以定義爲一個共享內存區和後臺進程的集合。爲實例分配的內存被稱爲SGA(System Global Area,系統全局區)。SGA並不是一個不加區分的大內存段,它由許多組件構成。
  
  實例的所有進程共享SGA,包括系統進程以及用戶進程。
  
  在Oracle9i之前,實例開始時就要設置SGA的大小。改變SGA大小或者改變SGA中任何組件唯一辦法就是修改初始化參數,然後停止實例再重新運行。Oracle9i中,在實例運行中可以改變SGA的大小,也可以調整其組件。Oracle9i引入了粒度(granule)的概念,這是在SGA中可以改變(增加或刪除)的最小內存量。
  
  後臺進程要與操作系統進行交互,而且後臺進程互相之間也需要交互,從而管理實例的內存結構。這些進程還要管理磁盤上的實際數據庫,並對實例做一般性的內部管理。
  
  還有一些物理文件,也可以將它們認爲是實例的組成部分:
  
  實例的初始化文件
  
  初始化文件中包括許多配置實例運行的參數:可使用多大的內存,可連接的用戶數目,實例訪問的數據庫等等。在Oracle之前,只有一個初始化文件——INIT.ORA。在Oracle9i中引入了SPFILE,它不僅具有和INIT.ORA相同的功能,而且能夠連續地存儲Oracle9i運行過程中初始化參數的變化。
  
  SPFILE是一個二進制文件,它保存在服務器中,這樣就無需在客戶主機上保留INIT.ORA文件了。當一個Oracle9i實例開始啓動時,它首先尋找SPFILE文件,然後再查找INIT.ORA文件。
  
  實例的配置文件
  
  CONFIG.ORA是可選的參數文件。如果希望分離一個初始化文件參數集(例如,用於Oracle並行服務器/實時應用集羣的參數集),那麼可以選擇這個文件。
  
  口令文件
  
  口令文件是Oracle的一個可選文件,這是一個操作系統文件,可以爲管理Oracle數據庫提供附加的靈活性。口令文件是加密的,包括用於執行管理任務(例如,啓動或停止實例)的用戶ID和口令。
  
  實例的內存結構
  
  SGA由三個主要區組成:數據庫高速緩存、共享池和日誌文件緩衝區。
  
  大池(Larger Pool),內存池的另一種類型,是在Oracle8中引入的。這個SGA的可選區可用於爲不同服務器進程緩存I/O操作,其中包括那些用於恢復和備份的進程。還可以爲多線程服務器保存會話內存。
  
  由於這個備用池的存在,需要分配大內存時可以降低對共享池的要求。配置大池的初始化參數:LARGE_POOL_SIZE
  
  數據庫高速緩存
  
  數據庫高速緩存用來存儲從數據庫獲取的數據塊。這個介於用戶請求和實際數據文件之間的緩衝區改進了數據庫的性能。如果數據存放在緩衝區中,可以從內存中直接獲取,而不用去磁盤中讀取。Oracle用LRU(least recently used,最近最少使用)算法來管理緩衝區。如果一個用戶請求的數據是最近才使用過的,那麼這個數據最有可能存放在數據庫高速緩存中;存放在緩衝區的數據能夠直接傳送,不用執行磁盤讀操作。
  
  當用戶要讀的數據不在緩衝區時,該數據塊必須從磁盤中讀出,並加載到緩衝區中。當用戶修改數據時,首先是改變緩衝區中的數據,稍後這些改變才寫入數據所駐留的數據文件中。這樣做的目的在於,當Oracle往磁盤中寫入所該變的數據塊時用戶不必等待。
  
  磁盤是計算機系統中執行速度最慢的部分,因此I/O執行得越少,系統的運行速度就越快。通過延期而不是立即執行非關鍵性的I/O操作可以使一個Oracle數據庫獲得更好的性能。
  
  在Oracle8及其以後的版本中有三個可用的緩衝池:
  
  DEFAULT
  
  這是標準的Oracle數據庫高速緩存。如果沒有特別指出的話,所有的對象都使用該緩衝區。
  
  KEEP
  
  用來存放經常使用的對象
  
  RECYCLE
  
  用於存放很少再訪問的對象
  
  可以標記表或索引從而在一個特定的緩衝池內緩存。這將有助於在緩衝區內保存更多所需的對象,而避免了在一箇中心緩衝區內所有對象“竟用”緩衝區。
  
  共享池
  
  共享池中存放的是用戶共享結構。
  
  日誌文件緩衝區
  
  日誌信息首先存放在日誌文件緩衝區內,然後才寫入磁盤上的物理日誌文件中。
  
  實例的後臺進程
  
  DBWR(Database Writer,數據庫寫進程)
  
  DBWR將數據庫塊從SGA中的數據庫高速緩存寫入磁盤的數據文件中。每個Oracle實例最多可以擁有10個DBWR進程,即從DBWR0到DBWR9,用於處理多個數據文件的I/O操作。大多數實例只運行一個DBWR進程。若需要DBWR進程從緩存把數據塊寫到磁盤中,往往有兩個主要原因:
  
  ·如果Oracle需要執行一個檢查點(例如,修改數據文件的數據塊以便與日誌的記錄一致)。當一個事務提交時,Oracle先寫日誌,稍後才寫實際的數據塊。Oracle定期地執行檢查點,以保證數據文件的內容符合日誌爲提交事務所做的記錄。
  
  ·在響應用戶的請求時,Oracle需要將數據塊讀到高速緩存內,但是緩存內沒有富餘的空間,這個時候根據最近最少使用原則將某些數據塊寫入磁盤。這種順序執行寫數據塊可以極大地減少在高速緩存中丟失數據的可能。
  
  LGWR(Log Writer,日誌寫進程)
  
  LGWR把日誌信息從SGA中的日誌緩衝區寫到當前日誌所有的複本中。當事務在進行是,相關的日誌信息存放在SGA的日誌文件緩衝區內。事務提交時,Oracle通過調用LGWR將日誌信息寫到磁盤作爲永久保存。
  
  SMON(System Monitor,系統監控進程)
  
  系統監控進程爲一個Oracle實例維護其整體安全性。在一個實例失敗後重新啓動時,SMON執行緊急災難恢復;在Oracle並行服務器/實時應用集羣中,當有多個實例同時訪問同一數據庫時,SMON爲其中一個失敗的實例進行協調並執行恢復操作。SMON還可以把數據文件中相鄰的空閒內存合併爲一塊,並且對用於記錄排序的空間,如果不需要還可以將此空間釋放。
  
  PMON(Process Monitor,進程監控進程)
  
  PMON進程監控數據庫所有用戶進程。如果一個用戶進程非正常中斷,PMON負責釋放其餘所有資  源(如:內存),並且釋放失敗進程所加的鎖。
  
  ARCH(Archiver,歸檔進程)
  
  一旦Oracle寫好日誌文件,歸檔進程將讀出日誌文件,並且爲所有使用的日誌文件建立複本,寫入  到指定歸檔日誌的目錄中。
  
  採用ARCn的記法,Oracle8i可支持的多達10個歸檔進程。LGWR可能會根據負載的需要啓動其他的歸檔進程,啓動的進程數目受初始化參數LOG_ARCHIVE_MAX_PROCESSES所限。
  
  CKPT(Checkpoint,檢查點進程)
  
  檢查點進程和DBWR協同工作來執行檢查點。當檢查點完成時,CKPT會更新控制文件和數據文件首部中的檢查點數據。
  
  RECO(Recover,恢復進程)
  
  RECO會自動清除錯誤的或者掛起的分佈式事務
  
  數據字典
  
  每個Oracle數據庫包括一個被稱爲“元數據”的集合,或者說包含用來描述數據庫有關數據結構的數據。包含這些元數據的表和視圖稱爲Oracle數據字典。
  
  數據字典中有前綴V$或GV$的表是動態表,它們會不斷更新以反映出Oracle數據庫當前的狀態。靜態數據字典表都有一個形如DBA_、ALL_或USER_的前綴,表示該視圖中列出的對象範圍。
  
  數據庫組件      數據庫字典中的表和視圖
  數據庫        V$DATABASE
  表空間        DBA_TABLESPACE,DBA_DATA_FILES,
  DBA_FREE_SPACE
  控制文件       V$CONTROLFILE,V$PARAMETER,
  V$CONTROLFILE_RECORD_SECTION
  數據文件       V$DATAFILE,V$DATAFILE_HEADER,V$FILESTAT,
  DBA_DATA_FILES
  段          DBA_SEGMENTS
  數據範圍       DBA_EXTENTS
  日誌線程、日誌組和  V$THREAD,V$LOG,V$LOGFILE
  日誌序列號
  歸檔狀態       V$DATABASE,V$LOG,V$ARCHIVED_LOG,
  V$ARCHIVE_DEST
  數據庫實例      V$INSTANCE,V$PARAMETER,
  V$SYSTEM_PARAMETER
  內存結構       V$SGA,V$SGASTAT,V$DB_OBJECT_CACHE,V$SQL,
  V$SQLTEXT,V$SQLAREA
  後臺進程       V$BGPROCESS,V$SESSION 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章