一直以來都想好好研究下Oracle,剛好,現在的項是關於oracle安全的,所以,抽個時間,把它整理一下,雖然不可能完全理解oracle,但做了總比不做要好。
一、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也是不同的。這樣一來就保證了資料恢複時候的順序。
b. 鑑效組資料的一致性,當一