關係型資料庫Oracle之架構詳解
寫在前面
作為開發人員,掌握資料庫是必不可少的一件事情,當你已經對資料庫系統的基本理論知識和基本的SQL語句有所掌握時,理所應當去深入學習一種資料庫系統,以便在開發中能加以運用。就目前而言,市場上常見的資料庫有以下這些。
你大可不必為應當學習以上哪種資料庫系統而煩惱,當你的資料庫理論及基本的SQL語法掌握後,學習哪種資料庫系統對你而言應當不再是難事。
今天,我們就市場佔據市場份額較多的關係型資料庫–Oracle為例作為講解,本章主要從架構上面分析,希望可以起到高屋建瓴的效果。
企業級常用資料庫—Oracle
下面我們先來看下面這幅常見的架構圖
由圖可看出來,Oracle資料庫例項(Instance)是由一系列記憶體結構及後臺結構組成。記憶體結構主要是SGA(System Global Area,系統區全域性區)和PGA(Program Global Area,程式全域性區)組成,後臺程序則主要是一系列程序監控程序(PMON)、系統監控程序(SMON)、資料庫寫入程序(DBWR)、日誌寫入程序(LGWR)、檢查點程序(CKPT),以及一些其他程序組成。本文主要講述記憶體結構的組成及原理。
SGA
SGA是什麼呢,總的來說是Oracle分配的一種共享記憶體結構,使用者對資料庫的各種操作主要在SGA中進行。下面我們來看下如何檢視系統的SGA。
- 首先,在sqlplus中以免密的方式登入資料庫
C:\Users\Administrator>sqlplus / as sysdba
- 然後執行下面命令,便可以看到系統SGA的基本情況
SQL> show parameter sga NAME TYPE VALUE ------------------------------------ ----------- ----- lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 1G sga_target big integer 0
- 當然你也可以選擇修改裡面的引數,例如
SQL>alter system set sga_target=436M;
- 或者,
SQL> alter system set sga_max_size=436M scope=spfile;
- 你只需要重啟資料庫即可使上面的命令生效
SQL>shutdown immediate
SQL>startup
但是,我並不建議你這樣做,SGA通常在資料庫系統建立之初就分配好。好了,下面我再來講述SGA的主要組成部分
1.Database Buffer Cache(資料高速緩衝區)
在現代資料庫中,設立資料高速緩衝區基本是必不可少的,為了避免資料庫等待磁碟I/O,Oracle設計了資料庫高速緩衝區,暫時存放使用者執行查詢語句時從資料檔案(磁碟)讀取出來的資料,避免了直接對磁碟I/O,並被當前例項的其他使用者共享。下面我們來看下其原理圖
當發生SQL查詢時,在共享池的伺服器結果緩衝區裡找不到結果,那麼就會到資料庫高速緩衝區裡查詢,如果有,則產生緩衝命中(Cache Hit),讀取保持池,否則產生緩衝失誤(Cache Miss),可能會讀取預設池或者回收池,還有一種情況,如果在資料庫高速緩衝區裡找了很久,直到臨界點,那麼就會通知DBWR程序,將回收池裡的髒緩衝器寫入磁碟,再將預設池裡的空閒緩衝器轉移到回收池,變為髒緩衝器。
在資料庫優化一塊便有對資料高速緩衝區的優化,在這我不做過多講解,下面我們來了解一下其常用的檢視即可
- v$db_cache_advice檢視,Oracle自動收集的相關統計資料,並預測出DB_CACHE_SIZE在不同大小情況下的效能資料
SQL> desc v$db_cache_advice
名稱 是否為空? 型別
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
ADVICE_STATUS VARCHAR2(3)
SIZE_FOR_ESTIMATE NUMBER
SIZE_FACTOR NUMBER
BUFFERS_FOR_ESTIMATE NUMBER
ESTD_PHYSICAL_READ_FACTOR NUMBER
ESTD_PHYSICAL_READS NUMBER
ESTD_PHYSICAL_READ_TIME NUMBER
ESTD_PCT_OF_DB_TIME_FOR_READS NUMBER
ESTD_CLUSTER_READS NUMBER
ESTD_CLUSTER_READ_TIME NUMBER
- v$bh檢視,查詢消耗資料庫快取記憶體區的物件
SQL> desc v$bh
名稱 是否為空? 型別
----------------------------------------- -------- ------------
FILE# NUMBER
BLOCK# NUMBER
CLASS# NUMBER
STATUS VARCHAR2(10)
XNC NUMBER
FORCED_READS NUMBER
FORCED_WRITES NUMBER
LOCK_ELEMENT_ADDR RAW(4)
LOCK_ELEMENT_NAME NUMBER
LOCK_ELEMENT_CLASS NUMBER
DIRTY VARCHAR2(1)
TEMP VARCHAR2(1)
PING VARCHAR2(1)
STALE VARCHAR2(1)
DIRECT VARCHAR2(1)
NEW CHAR(1)
OBJD NUMBER
TS# NUMBER
LOBID NUMBER
CACHEHINT NUMBER
- v$buffer_pool檢視,主要是裡面不同分割槽的詳細情況
SQL> desc v$buffer_pool
名稱 是否為空? 型別
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
RESIZE_STATE VARCHAR2(10)
CURRENT_SIZE NUMBER
BUFFERS NUMBER
TARGET_SIZE NUMBER
TARGET_BUFFERS NUMBER
PREV_SIZE NUMBER
PREV_BUFFERS NUMBER
LO_BNUM NUMBER
HI_BNUM NUMBER
LO_SETID NUMBER
HI_SETID NUMBER
SET_COUNT NUMBER
- v$buffer_pool_statistics檢視,主要是檢視高速緩衝區和分割槽的命中率情況
SQL> desc v$buffer_pool_statistics
名稱 是否為空? 型別
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
SET_MSIZE NUMBER
CNUM_REPL NUMBER
CNUM_WRITE NUMBER
CNUM_SET NUMBER
BUF_GOT NUMBER
SUM_WRITE NUMBER
SUM_SCAN NUMBER
FREE_BUFFER_WAIT NUMBER
WRITE_COMPLETE_WAIT NUMBER
BUFFER_BUSY_WAIT NUMBER
FREE_BUFFER_INSPECTED NUMBER
DIRTY_BUFFERS_INSPECTED NUMBER
DB_BLOCK_CHANGE NUMBER
DB_BLOCK_GETS NUMBER
CONSISTENT_GETS NUMBER
PHYSICAL_READS NUMBER
寫在後面
本來整體簡單介紹其系統架構,不料在涉及其組成部分過於複雜,為避免蝙蝠過長,今天先寫到這,在今後的時間我還會對更多的架構組成及其應用做講解。