標籤:blog http java 使用 strong 檔案
Oracle的體繫結構大體上分為兩部分:Instance(執行個體)和Database(資料庫)。
- Instance(執行個體) :在Oracle Instance中主要包含了SGA以及一些進程(例如:PMON、SMON、DBWn、LGWR、CKPT等)。如果一個使用者的進程串連到Oracle Server時,其實就是串連到Oracle Instance。在SGA中又包含了5大組件:Share Pool、Database Buffer Cache、Redo Log Buffer、Java Pool、Large Pool。
- Database(資料庫) :Database其實就是一堆檔案組成的,主要是用於儲存著資料,Database中主要包含三種類型的檔案:Data Files、Control Files、Redo Log Files。
下面介紹幾個Oracle重要概念:
Oracle Server(Oracle伺服器)
Oracle Server又包含兩部分:Oracle Instance和Oracle Database(Oracle Server是一個比較大的概念,我們通常說的Oracle伺服器就是指的Oracle Server)。
Oracle Instance(Oracle執行個體)
Oracle Server用於管理資料,資料存放區在Oracle Database中,其表現形式為儲存在磁碟上的一堆檔案,如果要去訪問這堆檔案,需要有一個媒介------Oracle Instance,Oracle Instance是訪問Oracle Database的一種手段。
一個Oracle Instance對應一個且只能對應一個Oracle Database,而一個Oracle Database可以有多個Instance來訪問他,也就是說Oracle Instance和Oracle Database是多對一的方式。一般情況下我們以一台機器上安裝Oracle時都是以Instance和Database一對一的方式,但是在Oracle叢集(Oracle RAC環境)的情況下他是多個Instance對應一個Database。
Oracle Instance有兩部分組成:
- Memory Structures(記憶體結構) :Memory Structures就是Oracle Instance中的SGA。
- Background Process Structures(後台進程結構) :Background Process Structures就是指PMON、SMON、DBWR、LGWR、CKPT等後台進程。
Oracle Instance啟動時就會啟動一些Background Process並且分配記憶體,Oracle Instance是易於消失的。(相對於資料庫檔案來說,例如:一斷電就沒有了)。
Oracle資料庫Connection & Session
Oracle Connection
Oracle中的Connection是指一個Oracle的用戶端和背景伺服器建立的一個TCP串連,一定是Oracle用戶端和背景進程(Server Process)建立的TCP串連。
在Oracle Process中有三種類型:
- Background process(後台進程)他是Oracle Instance的基本組成部分
- Server process(伺服器處理序)其實Background Process和Server Process都是Oracle的後台進程。其中Background Process是專註於資料庫核心服務的進程;而Server process是處理用戶端和伺服器之間串連的進程。
- User process(用戶端進程) 用戶端要與伺服器串連,那麼在用戶端啟動起來的進程就是User Process(例如:SQL*Plus、Toad等)。使用者登入到Oracle Server就是User Process和Server Process建立Connection。
Oracle Session
Connection建立的過程其實就是首先建立TCP串連,Oracle對使用者的身份進行認證、進行安全審計等等,當這些都通過後Oracle的Server Process才會允許用戶端使用Oracle提供的服務,當Oracle的串連建立起來以後,就意味著開始了一個會話,當串連斷開的時候這個回話就消失了。Session是和Connection相輔相成的。Session資訊會儲存在Oracle的Data Dictionary中。
為在Linux中啟動Oracle Instance
輸入一個【!】便可以切換到shell中。後續如果想返回sqlplus中輸入【exit】即可。
通過Linux命令ps –ef可以查看Oracle進程(Oracle Instance)
Oracle Database(Oracle資料庫)
Oracle Database其實就是一堆檔案,這堆檔案是一堆資料,他們是作為一個整體。Oracle Database包含三種基本的核心檔案類型Data File、Control File、Redo Log File。
- Data Files(資料檔案) :Data Files就是用於儲存資料的,Table中的資料都是儲存在Data File中的。
- Control Files(控制檔案) :Oracle為了操作Data File,提供了一些Control files,這些Control File主要是記錄資料庫的一些控制資訊。
- Redo Log Files(重做記錄檔) :Redo Log Files記錄著資料庫的改變,如果向資料庫中放入資料或者是修改裡面的資料,只要對資料庫作了修改,那麼就要將修改之前的狀態、修改之後的狀態都會記錄在Redo Log Files中,其作用就是恢複Data File。例如:資料庫有一個事務需要提交,但是提交失敗了,事務就要復原,那麼交易回復的依據就來自於這個Redo Log Files。Redo Log Files中記錄著資料庫的改變,關於這個事務的改變,如果需要復原就需要把Redo Log Files中的資料取出來,依照Redo Log Files中的資料把Data Files恢複到修改之前的狀態。
- Parameter File(參數檔案) :任何一個資料庫都必須要有參數檔案,這個參數檔案就規定了Oracle中的一些基本的參數、初始化的參數的值。
- Archived Log Files(歸檔記錄檔) :Archived Log Files和Redo Log Files是相輔相成的,Redo Log Files其實是一個反覆利用的過程,他會有幾個(一般為3個)固定的檔案,這些固定檔案他會被依次使用,用滿了以後,Oracle就會在此寫這個檔案頭,就把以前的東西衝掉了。為了進一步加強資料庫的備份恢複能力,在覆蓋之前把這些修改的資訊都把他歸檔到Archived Log Files中。
- Password File :用與戶用戶端串連到後台資料庫系統時候儲存口令的。
下面顯示在Linux安裝的Oracle的Database部分。下面顯示的這一大堆檔案就是Oracle Database(一般存放在資料庫安裝路徑下的執行個體名對應的目錄下)。
- *.tcl控制檔案
- *.dbf資料檔案
- *.log重做記錄檔
Memory Structures
Oracle的Memory Structures實際上包含兩部分內容:SGA和PGA:
- SGA(System Global Area系統全域區) 一個Oracle Instance對應一個SGA,SGA在Oracle Instance啟動的時候被分配,SGA是Oracle Instance的基本組成部分。一個Oracle Instance就僅有一塊SGA,SGA是一個非常大的記憶體空間,甚至可以佔據實體記憶體的80%。
- PGA(Program Global Area程式全域區) 一個Server Process啟動的時候就會分配一個PGA。
整個Oracle Instance只有一個SGA,一個Server Process就會有一個PGA。在Oracle Instance中PGA可能會很多。例如啟動10個Server Process就會有10個PGA。無論啟動多少個進程,只要有一個Oracle Instance那麼他就僅有一個SGA。
Oracle的使用情境一般為管理海量資料,那麼大量的資料都是儲存在磁碟上的,為了提高儲存、訪問的效率,那麼Oracle必然會在記憶體中開闢一塊很大的記憶體地區(記憶體的訪問速度要快幾千倍幾萬倍)。Oracle是一個比較耗費記憶體的軟體,一般他會把可用的記憶體全部用完,他的記憶體一般是消耗在SGA上。
當Linux/Unix下的Oracle進程啟動,我們可以在Linux/Unix的shell中輸入【ipcs】命令查看系統共用記憶體配置的情況(IPC是進程間通訊的一種機制,ipcs命令是用於查看ipc資源的、ipc狀態的)。在Linux/Unix中Oracle的SGA的實現方式就是利用Shared Memory Segments(共用記憶體),對於Windows的實現方式可能不同。SGA的大小是可以配置的,隨著資料庫的負載加大,Oracle Instance對記憶體的需求加大,那麼SGA也會擴張甚至會把整個記憶體都消耗掉。
SGA(System Global Area)
SGA(System Global Area系統全域區),其中包含以下幾大塊的基本記憶體:
- Shared Pool
- Database Buffer Cache
- Redo Log Buffer
- Large Pool
- Java Pool
其中Shared Pool、Database Buffer Cache、Redo Log Buffer是核心的記憶體地區,其中Large Pool和Java Pool是可選項的(在Oracle 11g中又包含了String Pool)。
對於一個啟動好的Oracle資料庫,怎樣去查看他的SGA?以Linux為例,首先可以通過命令【ps –ef | grep oracle】查看Oracle 的Background Process。
輸入命令【show sga;】便可以查看SGA的資訊了。
在早期的Oracle版本中,在Oracle啟動之後SGA就是固定不變的,在Oracle 9i以後的版本就可以在運行時發生改變,即線上動態調整SGA的值。Oracle Instance啟動起來就會分配一個SGA,使用者便可以向資料庫服務發送請求,隨著使用者發出的請求負荷增大,Oracle需要的記憶體資源就越大,因此SGA就需要擴張,所以便有了可以動態變化SGA的需求。
在SGA中有一個重要的參數 SGA_MAX_SIZE ,該參數決定了Oracle Instance SGA的最大值,在這個上限的範圍內,SGA可以分配他的每個組件佔用多少記憶體。SGA可以動態增長或縮小,SGA每次增大或縮小的單位granules(granules是SGA分配記憶體的基本單位,通常對於SGA小於128M的情況granules=4M,SGA超過128M的情況granules=16M )。SGA是一個連續分配的記憶體地區,而且他的分配最小單位是granules但是他的最大尺寸不能超過SGA_MAX_SIZE。
執行中的SQL語句便可以查看當前Oracle系統的granules。顯示了SGA的組成部分以及每個組成部分的granules。
SGA最大值是由SGA_MAX_SIZE決定的,它裡面又包含了不同的組件(Shared Pool、Database Buffer Cache、Redo Log Buffer、Large Pool、Java Pool),這些內部組件也有其記憶體大小設定的參數:
- DB_CACHE_SIZE 用於設定Database Buffer Cache的記憶體大小
- LOG_BUFFER 用於設定Redo Log Buffer的記憶體大小
- SHARED_POOL_SIZE 用於設定Shared Pool的記憶體大小
- LARGE_POOL_SIZE 用於設定Large Pool的記憶體大小
- JAVA_POOL_SIZE 用於設定 Java Pool的記憶體大小
Oracle10g引入了一個功能,就是自動記憶體配置功能,例如:已經制定了SGA_MAX_SIZE,在這個上限範圍內,具體每個組件最優的尺寸設定有Oracle自動來進行分配。這樣便可以減少對如果設定SGA內部各組件的記憶體大小設定的問題。隨著Oracle負荷的變化,Oracle會自動去調整記憶體配置的最佳布局。
Shared Pool
Shared Pool(共用池)的主要作用是儲存SQL解析後的內容。例如:發出一個SQL語句或命令讓資料庫執行,SQL就需要在資料庫內部就需要被解析,建立執行計畫,然後按照執行計畫去執行,每個SQL語句都要被解析成原始操作去執行,解析好的SQL語句都會儲存在共用池中。
在Oracle Instance中Shared Pool非常總要,它關係到資料庫的效能,共用池包含兩塊共用記憶體,這兩塊共用記憶體關係到資料庫的效能。
- Library Cache :Library Cache中儲存的是經過編譯解析後的SQL和PL/SQL語句的內容。如果下次在執行同樣的SQL語句的時候,就不需要解析了,立即從Library Cache擷取執行。Library Cache的SIZE會決定著編譯解析SQL語句的頻度,從而決定了效能。Library Cache中有包含兩部分內容:Shared SQL Area和Shared PL/SQL Area。Library Cache是Shared Pool的一個子組件,Library Cache的SIZE是由Shared Pool來決定的。
- Data Dictionary Cache :Data Dictionary就是儲存著資料庫控制資訊。為了提高訪問Data Dictionary的速度,此時需要一個Cache,需要的時候訪問記憶體即可。Data Dictionary Cache裡面的資訊包含了database files、tables、indexes、columns、users、privileges和其他的資料庫物件。資料字典是使用最頻繁的,幾乎所有的操作都需要到資料字典去查詢(例如:需要針對一個表進行操作,就需要到資料字典去查詢使用者對這個表是否具有存取權限等等),他的SIZE是由Shared Pool來決定的。
可以線上去更改Shared Pool的SIZE,只需要執行下面的SQL語句即可:
- ALERT SYSTEM SET SHARED_POOL_SIZE=64M
Database Buffer Cache
Database Buffer Cache的任務主要是用於儲存資料檔案中的資料,在Oracle中資料是儲存在磁碟上的,又不可能將所有的資料檔案內容都放到記憶體中,但訪問磁碟中的資料速度又會很慢,那麼就需要將其中一部分的資料放入到記憶體中,當使用者去訪問時發現需要訪問的資訊在記憶體中,那麼就不需要訪問磁碟了,這樣提升了訪問的速度。
Database Buffer Cache就是包含了來自於Data File中的資料以及即將要寫到Data File中的資料(也成為Dirty Buffer)都會儲存到這個Database Buffer Cache中,而且Database Buffer Cache得SIZE是最大的。例如一個使用者去訪問一個表裡面的記錄時,資料庫接收到這個請求後,他首先會在這個Cache中尋找是否存在該資料庫表的記錄,如果有這個記錄直接從記憶體中讀取該記錄返回給使用者,否則只能去磁碟上去讀取。很顯然如果希望效能提高就需要提升Cache的命中率。
Database Buffer Cache中儲存的是Data Blocks(資料區塊)。Oracle中的資料是按照Block來進行儲存的,Block是Oracle儲存的最基本的單位。在Database Buffer Cache中針對Block的SIZE的設定,對應的參數是:DB_BLOCK_SIZE。
在Database Buffer Cache中包含三部分內容:
- DB_CACHE_SIZE
- DB_KEEP_CACHE_SIZE
- DB_RECYCLE_CACHE_SIZE
Database Buffer Cache可以線上去更改SIZE,只需要執行下面的SQL語句即可:
- ALERT SYSTEM SET DB_CACHE_SIZE=64M
在效能調優的過程中,需要去監控DB_CACHE_SIZE的行為和他的統計資訊,可以使用DB_CACHE_ADVICE參數來設定是否要收集資訊,如果收集資訊那麼收集後的資訊就會放在V$DB_CACHE_ADVICE表中。
Redo Log Buffer
資料庫是處於經常在改變的,比如有時候事務失敗的需要復原,就需要Redo Log Files來記錄資料庫的改變,如果想恢複資料庫檔案就用Redo Log Files裡面的內容進行恢複。Redo Log File在記憶體中有一個對應的Cache它稱為Redo Log Buffer。每次對資料進行改變,在Redo Log裡面就會有相應的一條記錄,這條記錄稱為Redo Entries,一條Redo Entries就可以恢複一次對資料庫的改變。Redo Log Buffer的SIZE由參數LOG_BUFFER來決定。
Large Pool
Large Pool主要是用於處理一些額外的工作,比如說使用RMAN進行備份需要使用Large Pool或者進行平行處理的時候會需要用到Large Pool。做一些IO操作的時候也會用到Large Pool。Large Pool的SIZE由參數LARGE_POOL_SIZE來決定。
Java Pool
Oracle支援Java編程,例如支援Java編寫預存程序的,Java Pool的SIZE由參數JAVA_POOL_SIZE來決定。
PGA(Program Global Area)
PGA(Program Global Area程式全域區)與SGA不同,每一個Background Process對應一個PGA(例如:PMON就會有一個PGA與之對應)。PGA和SGA是平等的關係,並不存在內含項目關聯性。
Process Structures
Oracle分為三種類型的進程:User Process、Server Process、Background Process。其中Server Process和Background Process都屬於後台進程。為了串連Oracle的後台伺服器,那麼User Process是在用戶端所必須的進程。Oracle本身的進程細分成兩類,就是前面提到的Server Process和Background Process。Oracle是可以運行在多種平台下,而Linux和Windows的進程有所不同,在Linux中進程為基本單位,所以Oracle在Linux(或Unix)中體現的是多個進程。而在Windows中一般是在進程中運行多個線程,所以Oracle在Windows中的體現是一個大的進程中運行了多個線程。
User Process
Oracle User Process就是Oracle用戶端的進程,任何程式如果想去串連到Oracle的後台,那麼這個程式就是Oracle的用戶端(一般是編譯利用Oracle提供的類庫實現)。例如下面使用SQL*Plus進行登入,通過Windows Task Manager可以看到這便是Oracle User Process。
Server Process
Oracle的後台進程分為兩類,一類是Background Process,另一類就是Server Process。Server Process主要是負責和User Process串連。Oracle的串連方式有兩種:Dedicated Server模式和Shared Server模式。Server process是處理用戶端和伺服器之間串連的進程。
以Linux為例,首先通過命令ps –ef | grep oracle查看Oracle進程。
當有User Process與Server Process進行串連的時候,以Linux為例,通過ps –ef | grep oracle這時會發現後台進程中多出了一個進程(即本例中的:oracledlw),之所以用戶端可以串連到Oracle Server,就是這個進程與用戶端進程進行的通訊,這個進程就是Server Process的一種。
在Oracle的伺服器也可以通過SQL*plus命令進行用戶端串連到Server Process。
那麼在用戶端機器使用用戶端工具訪問Oracle Server和在Oracle伺服器上直接使用SQL*plus訪問Oracle Server有什麼區別呢?的兩個大的矩形框表示兩台物理機,黃色的框表示網卡,主機中的圓圈表示進程,兩台機器的進行通訊,需要通過網卡進行串連,一般是通過TCP/IP建立的串連,對於同一台電腦的進程之間的通訊方式有兩種:第一種方式為利用IPC進行通訊;另一種方式為類比TCP/IP方式,在Linux中有一個特殊的網卡【lo】這個網卡稱為Local Loopback(本地環路網卡),他的IP地址永遠是127.0.0.1,即使電腦不存在物理網卡這個網卡也是存在的。這種方式其實就是本地對本地的通訊。
IPC:Inter Process Communication,包括共用記憶體、隊列、訊號量等幾種形式。
Background Process
Background Process是Oracle Instance的核心,Oracle中有很多Background Process,下面可以通過命令 ps –ef | grep oracle 查看Oracle的進程,Oracle Background Process都是以【ora_ 】為首碼,以【_資料庫執行個體名 】為尾碼。
Oracle Background Process又分為兩種:
- Mandatory Background Processes(必須的後台進程):當Oracle Instance啟動完成以後這些進程必須要存在(例如:DBWn其中n表示從0開始,可能存在多個進程)。
- Optional Background Process(可選的後台進程):根據具體的配置,這些進程可能啟動或不啟動。
DBWn(Database Writer)
DBWn是Oracle中工作最繁重的進程。他的任務是把SGA中的Database Buffer Cache中儲存著已修改過的內容(Dirty Buffer)寫到Data File中,已經發生過修改的這些Buffer,在Oracle中稱為Dirty Buffer(髒資料)。Data Buffer Cache中的Dirty Buffer通過DBWn Process寫入Data File,如果資料庫的負荷比較大,來自於用戶端的請求比較多,存在大量的IO操作,需要頻繁的將緩衝區的內容寫到磁碟檔案上,那麼這時就可以配置多個DBWn(一共Oracle支援20個DBWn,DBW0-DBW9,DBWa-DBWg)。通常一個中小型的Oracle只需要一個DBW0 Process就可以了。
觸發DBWn Process將緩衝區的內容寫到磁碟檔案的條件:
- Checkpoint Occurs
- Dirty Buffer reach threshold
- There are no free Buffers
- Timeout occurs
- RAC ping request is made
- Tablespace OFFLINE
- Tablespace READ ONLY
- Table DROP or TRUNCATE
- Tablespace BEGIN
- BACKUP
LGWR(LOG Writer)
在Oracle Instance中只有一個LGWR Process,這個Process的工作和DBWn Process類似,LGWR Process是將Redo Log Buffer中的內容寫入到Redo Log Files中。Redo Log Buffer是一個迴圈的Buffer,對應的Redo Log Files也是一個迴圈的檔案組,從檔案頭開始寫,當檔案寫滿了,又會從檔案頭開始寫(會把前面的內容覆蓋掉),為了避免將Redo Log File覆蓋掉可以選擇將其寫入到Archived Redo Log Files中。
觸發LGWR Process的條件:
- At Commit
- When one-third full
- When there is 1 MB of redo
- Every three seconds
- Before DBWn writes
SMON(System Monitor)
SMON(System Monitor)系統管理器,當Oracle運行時突然宕機,那麼在下一次啟動Oracle Instance的時候,它裡面一些沒有釋放的資源,這些資源都會由SMON進行清理;在一些事務失敗的時候也由SMON進行清理,或者由於記憶體空間很分散(不連續)這時需要SMON將這個分散的空間整合起來;對於一些臨時的Segment由SMON進行釋放。
PMON(Process Monitor)
PMON ( Process Monitor )進程監控器,用於監控各個 Oracle 後台進程的,檢查各個進程是否正常,發現異常的進程將其清除掉,重建該進程。
CKPT(Checkpoint)
CKPT(Checkpoint)主要用於寫Checkpoint(檢查點)、在Data File的在檔案頭更新檢查點資訊、在Control File中更新檢查點的資訊。
ARCn(Archiver)
ARCn(Archiver)是Oracle中的可選項的進程(幾乎可看作必選項進程),Oracle可以運行在兩種模式下,一種是ARCHIVELOG MODE(歸檔模式);另一種是NOARCHIVELOG MODE(非歸檔模式)。Redo Log Files是一個迴圈檔案組,從頭開始寫,寫完了以後,又回到最開始的地方寫(即:覆蓋原來的開頭部分),在覆蓋之前就可以通過ACRn進程將老的資訊寫到Archiver Redo Log files(歸檔記錄檔)中,基本上所有的生產資料庫都會運行在Archiver模式,否則資料庫發生災難性事故後就很難進行恢複了。
Logical Structure
Oracle有一套Logical Structures(邏輯結構),一個Oracle Server只有一個Oracle Database,一個Oracle Database可以由多個Tablespace組成,一個Tablespace可以有多個Segment組成,一個Segmnet可以由多個Extent組成。一個Extent是一組連續的Blocks組成,Block是Oracle中的最小基本單位,Oracle中的Block對應著作業系統的Block,作業系統的檔案系統也是由Block組成的,一個Block又對應著記憶體中的一個Page,Oracle的Block是作業系統檔案系統的Block的整數倍,例如: Oracle的一個Block對應著作業系統的1個Block或者Oracle的一個Block對應著作業系統的2個Block。Oracle中有一個重要的參數DB_BLOCK_SIZE,該參數用於設定Oracle Block的SIZE(通常Oracle的Block=8K)。一堆連續的Block組成了Extent。很多Extent(不一定是連續的)組成了Segment。一個或多個Segment就組成了一個Tablespace。一個Tablespace或多個Tablespace組成了Oracle Database。Oracle有很多Data File,這些Data File其實就是他的物理結構。一個Tablespace可以由多個Data File組成,一個Segment也可以由多個Data file組成,但Segment和Data File並沒有隸屬關係,一個Data File必然屬於一個Tablespace,但是一個Data File不一定屬於一個Segment,Extent不能跨Data File,一個Extent只能存在於一個Data File中。
Processing SQL Statements
Oracle處理SQL語句的過程分為以下階段:用戶端Connect到後台建立一個Connection,建立一個會話,建立完成後, 向後台發出SQL語句,發到後台第一個階段Parseing(其實在做Parseing之前還要做安全檢查,查看使用者的許可權),Parseing就是解析SQL語句,把SQL語句分解成它能夠執行的原子操作;下一個階段叫做Banding,就是把一些變數綁定在SQL語句上,接下來就開始執行,執行完成SQL語句後,把返回的結果返回給用戶端。
SQL語句分為幾種:一種就是查詢語句,就是SELECT,第二種是DML(資料操作語言),也就是INSERT、DELETE、UPDATE。比如說去UPDATE一條記錄的時候,這條語句通過Parseing、通過安全檢查後以及解析成原子操作後開始執行的時候,如果該操做的記錄沒有在SGA的Database Buffer Cache中,就會從磁碟上的資料檔案中讀取上來,然後再進行更新操作。
轉載:http://jianshi-dlw.iteye.com/blog/1554892