Oracle數據庫學習筆記(一)


 

 

 

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中有三種類型:

 

  1. Background process(后台進程)他是Oracle Instance的基本組成部分
  2. Server process(服務器進程)其實Background Process和Server Process都是Oracle的后台進程。其中Background Process是專注於數據庫核心服務的進程;而Server process是處理客戶端和服務器之間連接的進程。
  3. 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語句即可:

Sql代碼     收藏代碼
  1. 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語句即可:

Sql代碼     收藏代碼
  1. 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM