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: ORANTDATABASEARCHIVE
該語句指定了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 [@more@]
資料庫是物理概念:它包括儲存在磁碟中的檔案。例項是邏輯概念:它包括伺服器中的記憶體結構與程式
一個例項能夠而且只能與一個資料庫連線
例項是暫時存在的實體,而資料庫只要正確維護則永久存在
使用者一般不會直接訪問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: ORANTDATABASEARCHIVE
該語句指定了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 [@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8570952/viewspace-912415/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JAVA基礎:JDBC最佳化資料庫連線(轉)JavaJDBC資料庫
- 資料庫 基礎資料庫
- 資料庫基礎資料庫
- 資料庫基礎使用資料庫
- 1、資料庫基礎資料庫
- 資料庫基礎教程資料庫
- 資料庫基礎概念理解資料庫
- 【資料庫】Redis基礎篇資料庫Redis
- Redis基礎(二)資料庫Redis資料庫
- MySQL資料庫注入基礎MySql資料庫
- MongoDB資料庫基礎操作MongoDB資料庫
- 資料庫基礎知識資料庫
- 31. 資料庫基礎資料庫
- 資料庫設計基礎資料庫
- 【效能最佳化】ORACLE資料庫效能最佳化概述Oracle資料庫
- 紹Oracle資料庫的最佳化之資料庫磁碟I/OOracle資料庫
- oracle資料庫巡檢最佳化-快速定位資料庫瓶頸Oracle資料庫
- 【資料庫】資料庫儲存元素型別基礎資料庫型別
- 基礎知識梳理~資料庫資料庫
- Mysql資料庫基礎操作命令MySql資料庫
- MySQL資料庫基礎詳解MySql資料庫
- Flutter基礎-041-資料庫Flutter資料庫
- 資料庫基礎重要知識資料庫
- GEO資料庫基礎知識資料庫
- 達夢資料庫基礎---表資料庫
- 資料庫-SQL基礎語法資料庫SQL
- MySQL資料庫基礎筆記MySql資料庫筆記
- Oracle資料庫基礎:程式中呼叫sqlplus的方式Oracle資料庫SQL
- Oracle資料庫效能最佳化技術(轉)Oracle資料庫
- Django基礎之七(資料庫操作)Django資料庫
- 資料庫基礎知識介紹!資料庫
- mysql資料庫的基礎架構MySql資料庫架構
- 資料庫基礎知識講解資料庫
- NoSQL資料庫的基礎知識SQL資料庫
- SQL基礎-->資料庫事務(TRANSACTION)SQL資料庫
- php連線mysql資料庫基礎PHPMySql資料庫
- FastAPI - Tortoise ORM 資料庫基礎操作ASTAPIORM資料庫
- MySQL/Oracle資料庫最佳化總結(非常全面)MySqlOracle資料庫