oracle體系結構詳解

Oracle體系結構就是圍繞這張圖展開的,要想深刻了解oracle,就必須把這張圖搞明白。java

如圖:linux

1、基本組成:sql

Oracle server:數據庫

   通常狀況下是一個instance和一個database組成緩存

   1個instance只能對應一個數據庫。
    特殊:1個數據庫能夠有多個instance(rac)服務器

        一臺服務器上同時可裝多套版本的數據庫軟件,每一個數據庫軟件可建多個數據庫,可是每一個數據庫只對應一個instance,也能夠理解成每一個數據庫只有一個SID 。
         利用DBCA建出的每一個庫都是相對獨立的,在同一服務器上若是建立多庫必須將環境變量的參數文件作區分,而且在對實例切換時需以下操做:
                                                                         connect   用戶名/密碼@實例的服務名

 

 

Oracle Instance:session

是由內存(SGA)和後臺進程(backupground Process)組成oracle

經過instance來訪問database性能

一個實例只能打開一個數據庫優化

 

Oracle database:

數據文件(Data files):

    數據文件永遠存儲數據庫的數據,包括數據字典、用戶數據(表、索引、簇)、undo數據等

重作日誌(Redo log):

「先記後寫」

重作日誌用於記錄數據庫的變化,當進行例程恢復或介質恢復時須要使用重作日誌

執行DDL或DML操做時,事物變化會被寫到重作日誌緩衝區,而在特定的時刻LGWR會將重作日誌緩衝區中的內容寫入重作日誌。

控制文件(Control file)

控制文件用於記錄和維護數據庫的物理結構,而且每一個Oracle數據庫至少要包含一個控制文件。

歸檔日誌(Archive log):

是非活動(Inactive)重作日誌的備份。

口令文件(Password file):

用於驗證特權用戶(具備SYSDBA、SYSOPER權限的特殊數據庫用戶)

參數文件(Parameter file):

用於定義啓動實例所須要的初始化參數,包括文本參數文件(pfile)和服務器參數文件(spfile)

 

User and Server process :

在執行sql語句時產生的進程,每個鏈接,oracle server建立一個session,產生一個server process,在client發起一個connection時就產生了一個user process。

 

 

體系結構能夠分爲,database結構和instance結構

以下結構:

 

 

2、instance結構詳解

  

 

一、  內存結構

 

主要包括sga(system global area)和pga(program global area)

 

Pga是當程序起來時,給server process用(不包含在instance裏面,這裏不作重點討論)

 

SGA(System Global Area)由一組內存結構組成,它是由全部用戶進程共享的一塊內存區域。啓動例程時,Oracle自動分配SGA,關閉例程時,oracle自動釋放SGA所佔用的內存空間。

 

下面是dave哥關於sga詳解:

http://blog.csdn.net/tianlesoftware/article/details/5594080

Sga包括,share pool,db buffer cache,redo log buffer,large pool,java pool。

在9i 中咱們都知道在管理Oracle中使用動態SGA時,Granule的大小是和SGA的大小有關係。

SGA 分配的最小單元爲一個granule.Oracle SGA的大小老是granule的整數倍,即分配是以整數個granule來分配的。

9i 中的規則以下:

  linux/unix

   SGA <=128 M  granule 4M

   SGA >128M     granule 16M

  Windows

   SGA <=128 M   granule 4M

   SGA >128M     granule 8M

10g 中的分配規則爲

  linux/unix

  SGA <=1G   granule 4M

  SGA >1G    granule 16M

  Windows

  SGA <=1G   granule 4M

  SGA >1G     granule 8M

 SQL> select component, granule_size from v$sga_dynamic_components;

COMPONENT                                                        GRANULE_SIZE

---------------------------------------------------------------- ------------

shared pool                                                           4194304

large pool                                                            4194304

java pool                                                             4194304

streams pool                                                          4194304

DEFAULT buffer cache                                                  4194304

KEEP buffer cache                                                     4194304

RECYCLE buffer cache                                                  4194304

DEFAULT 2K buffer cache                                               4194304

DEFAULT 4K buffer cache                                               4194304

DEFAULT 8K buffer cache                                               4194304

DEFAULT 16K buffer cache                                              4194304

DEFAULT 32K buffer cache                                              4194304

ASM Buffer Cache                                                      4194304

 

13 rows selected.

 

Elapsed: 00:00:00.06

 SQL>

 SQL> desc v$sga_dynamic_components;

 Name                   Type

 --------------------------------------------------------

 COMPONENT              VARCHAR2(64)      

 CURRENT_SIZE           NUMBER

 MIN_SIZE               NUMBER

 MAX_SIZE               NUMBER

 USER_SPECIFIED_SIZE    NUMBER

 OPER_COUNT             NUMBER

 LAST_OPER_TYPE         VARCHAR2(13)

 LAST_OPER_MODE         VARCHAR2(9)

 LAST_OPER_TIME         DATE

 GRANULE_SIZE           NUMBER

 SQL>

 SQL>  select * from v$sga_dynamic_components;

COMPONENT            CURRENT_SIZE   MIN_SIZE   MAX_SIZE USER_SPECIFIED_SIZE OPER_COUNT LAST_OPER_TYP LAST_OPER LAST_OPER GRANULE_SIZE

-------------------- ------------ ---------- ---------- ------------------- ---------- ------------- --------- --------- ------------

shared pool              92274688   92274688          0                   0          0 STATIC                                 4194304

large pool                4194304    4194304          0                   0          0 STATIC                                 4194304

java pool                 4194304    4194304          0                   0          0 STATIC                                 4194304

streams pool                    0          0          0                   0          0 STATIC                                 4194304

DEFAULT buffer cache     62914560   62914560          0                   0          0 INITIALIZING                           4194304

KEEP buffer cache               0          0          0                   0          0 STATIC                                 4194304

RECYCLE buffer cache            0          0          0                   0          0 STATIC                                 4194304

DEFAULT 2K buffer ca            0          0          0                   0          0 STATIC                                 4194304

DEFAULT 4K buffer ca            0          0          0                   0          0 STATIC                                 4194304

DEFAULT 8K buffer ca            0          0          0                   0          0 STATIC                                 4194304

DEFAULT 16K buffer c            0          0          0                   0          0 STATIC                                 4194304

DEFAULT 32K buffer c            0          0          0                   0          0 STATIC                                 4194304

ASM Buffer Cache                0          0          0                   0          0 STATIC                                 4194304

 

13 rows selected.

 

 

Buffer Cache Size    

   數據緩存,調高數據命中率能夠提升性能。按數據塊存放。

     db_cache_size

     db_keep_cache_size

     db_recycle_cache_size

  alter system set db_cache_size = xxx M

 SQL> show parameter advice

NAME_COL_PLUS_SHOW_PARAM    TYPE                 VALUE_COL_PLUS_SHOW_PARAM

--------------------------------------------------------------------------------

db_cache_advice             string               ON

 SQL>

 SQL> select * from v$db_cache_advice;

 SQL>

Large Pool Size        rman 和一些並行處理時候會用到。

Java Pool Size         java存儲過程的支持

 

Streams Pool Size          

           

         

          

Oracle 10g 中 sga_target自動調整隻是針對這四項:data buffer cache, large_pool, shared_pool, java_pool

 

1)       03:41:30 SQL> show sga

2)        

3)       Total System Global Area  285212672 bytes

4)       Fixed Size                  1218992 bytes

5)       Variable Size              71304784 bytes

6)       Database Buffers          209715200 bytes

7)       Redo Buffers                2973696 bytes

8)       04:45:40 SQL>

9)        

04:46:18 SQL> select name,bytes/(1024*1024) ,resizeable from v$sgainfo;

10)    

11)   NAME                             BYTES/(1024*1024) RES

12)   -------------------------------- ----------------- ---

13)   Fixed SGA Size                          1.16252136 No

14)   Redo Buffers                             2.8359375 No

15)   Buffer Cache Size                              200 Yes

16)   Shared Pool Size                                60 Yes

17)   Large Pool Size                                  4 Yes

18)   Java Pool Size                                   4 Yes

19)   Streams Pool Size                                0 Yes

20)   Granule Size                                     4 No     ;區組大小爲4M

21)   Maximum SGA Size                               272 No

22)   Startup overhead in Shared Pool                 36 No

23)   Free SGA Memory Available                        0

24)    

04:49:34 SQL> select sum(bytes)/(1024*1024) size_in_mb  from v$sgastat;

25)    

26)   SIZE_IN_MB

27)   ----------

28)   276.003071

29)    

30)    

04:48:19 SQL> select * from v$sgastat;

31)    

32)   POOL         NAME                            BYTES

33)   ------------ -------------------------- ----------

34)   shared pool  KKJ WRK LAT                       300

35)   shared pool  kfkhsh_kfdsg                     2052

36)   shared pool  event statistics ptr arra         680

37)   shared pool  KGKP randnum                    40000

38)   large pool   PX msg pool                    206208

39)   large pool   free memory                   3988096

40)   java pool    free memory                   4194304

41)    

42)   602 rows selected.

43)    

04:50:37 SQL> show parameter sga;

44)   

45)   NAME                                 TYPE        VALUE

46)   ------------------------------------ ----------- ------------------------------

47)   lock_sga                             boolean     FALSE

48)   pre_page_sga                         boolean     FALSE

49)   sga_max_size                         big integer 272M

50)   sga_target                           big integer 272M

SGA動態尺寸總計不能超過初始化參數SGA_MAX_SIZE的值。

若是sga_target超過了sga_max_size的大小,在Instance從新啓動後,sga_max_size會調整成和sga_target同樣大小的值。

若是在初始化參數裏這些內存池設置爲非零,則系統啓動後,這些值將做爲該參數對應的最小值運行。若是那個值在系統運行時不夠,則Oracle將自動爲其添加容量,以幫助其優化操做,直到內存使用達到SGA_TARGET所代表的上限。

[oracle@oraserv ~]$ !sql

sqlplus '/as sysdba';

 

SQL*Plus: Release 10.2.0.1.0 - Production on Sat Mar 19 11:17:30 2011

 

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

 

Connected to an idle instance.

 

11:17:35 SQL> startup

ORACLE instance started.

 

Total System Global Area  419430400 bytes

Fixed Size                  1219784 bytes

Variable Size             289407800 bytes

Database Buffers          125829120 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

11:18:13 SQL> show parameter sga

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 400M

sga_target                           big integer 300M

11:18:23 SQL> alter system set sga_target=500m ;

alter system set sga_target=500m

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00823: Specified value of sga_target greater than sga_max_size

 

 

11:18:38 SQL> alter system set sga_target=500m  scope=spfile;

 

System altered.

 

11:18:54 SQL> startup force;

ORACLE instance started.

 

Total System Global Area  524288000 bytes

Fixed Size                  1220360 bytes

Variable Size             176161016 bytes

Database Buffers          343932928 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

11:19:30 SQL> show parameter sga;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 500M

sga_target                           big integer 500M

11:19:38 SQL>

 

利用後臺進程MMAN進行SGA動態管理

[oracle@oracle ~]$ ps -ef |grep ora_|grep ora_

oracle    8012     1  0 11:12 ?        00:00:00 ora_mman_prod

 

 

share pool:

共享池(Share Pool)用於存放最近執行的SQL語句和數據字典信息。

共享池主要有庫高速緩存(Library Cache)和數據字典高速緩存(Dictionary cache)兩部分組成

1)庫高速緩存(Library Cache)

庫高速緩存用於存放最近執行的sql語句信息,包括sql語句文本,解析代碼值及執行計劃。

 假設執行一條sql語句

     -select ename,job from emp where empno=7788;

           若是最近(尚未被lru淘汰)執行過這條語句,他就會直接從cache裏面讀結果;若是沒有執行過,就須要讀數據文件,這個過程就比較複雜,效率差距很大。

http://blog.csdn.net/yujin2010good/article/details/7235864

 

這裏還有兩個概念:

物理i/o和邏輯i/o---------1:1000

物理i/o:從數據緩衝區找不到所須要的數據,就要從硬盤裏面讀取。

邏輯i/o:從數據緩衝區能找到所須要的數據,

理論上講一個數據庫性能是否良好,這個邏輯i/o應該佔95%以上

 dave哥對命中率有詳細的描述

http://blog.csdn.net/tianlesoftware/article/details/4674153

 

2)、數據字典高速緩存區(Dictionary cache)

用於存放數據字典的信息,包括表、列定義以及權限信息)

庫高速緩存和數據字典高速緩存大小是動態變化的,不是固定的。

     SQL> alter  system   set  share_pool_size=60m;

DB buffer

     數據高速緩存(Database Buffer cache)用於存放最近訪問的數據塊信息,它由許多小緩衝區(緩衝區大小=數據尺寸)組成

Db_cache_size  定義標準的高速緩存尺寸

Db_nk_cache_size  定義非標準的高速緩存尺寸

 

數據庫高速緩存區:

Db_cache_size Default 默認池,全部段都被默認高速緩存到默認池。(採用LRU)

Db_keep_cache_size ,確保某些數據塊始終被保留到內存中

Db_recycle_cache_size ,數據高速緩存區「回收池」

 

 

 

Redo log buffer

   重作日誌緩存區(Redo log buffer),用於記載實例的變化。執行DDL或DML語句時,服務器進程首先將事物的變化記載到重作日誌緩存區,而後纔會修改數據高速緩存。

重作日誌緩存區由不少重作記錄(Redo record)組成,而且每條重作記錄記載了被修改數據塊的位置以及變換後的數據

Large pool

   

PGA(Program Global Area)

用於存放服務器進程的數據和控制信息,獨立於SGA的一塊內存區域。

     當用戶鏈接到Oracle Server時,Oracle server會爲每一個服務器進程分配相應的PGA.

SGA是全部服務器進程均可共享那個的一塊內存區域,而每一個服務器進程都具備私有的PGA內存空間。

 客戶端在經過sql語句鏈接database時,必須經過實例Instance來鏈接和管理數據庫。

Connection:客戶端進程和服務端進程創建通信。

Session:當用戶通過Oracle server認證後開始創建會話,直到用戶退出登陸,會話結束

 

二、進程結構

 用戶進程

server進程

     當客戶端運行應用程序時,會啓動形影的應用進程,該進程稱爲用戶進程;

     當鏈接到Oracle Server 時,Oracle在服務器端會爲用戶進程派生一個新的進程

後臺進程

啓動實例時,Oracle不只會分配SGA,還會啓動後臺進程。

[oracle@oraserv ~]$ ps -ef |grep ora_ 
oracle    4694     1  0 01:18 ?        00:00:01 ora_pmon_orcl

oracle    4696     1  0 01:18 ?        00:00:00 ora_psp0_orcl

oracle    4698     1  0 01:18 ?        00:00:00 ora_mman_orcl

oracle    4700     1  0 01:18 ?        00:00:00 ora_dbw0_orcl

oracle    4702     1  0 01:18 ?        00:00:00 ora_lgwr_orcl

oracle    4704     1  0 01:18 ?        00:00:06 ora_ckpt_orcl

oracle    4706     1  0 01:18 ?        00:00:01 ora_smon_orcl

oracle    4708     1  0 01:18 ?        00:00:00 ora_reco_orcl

oracle    4710     1  0 01:18 ?        00:00:02 ora_cjq0_orcl

oracle    4712     1  0 01:18 ?        00:00:01 ora_mmon_orcl

oracle    4714     1  0 01:18 ?        00:00:01 ora_mmnl_orcl

oracle    4716     1  0 01:18 ?        00:00:00 ora_d000_orcl

oracle    4718     1  0 01:18 ?        00:00:00 ora_s000_orcl

oracle    4722     1  0 01:18 ?        00:00:00 ora_arc0_orcl

oracle    4724     1  0 01:18 ?        00:00:00 ora_arc1_orcl

oracle    4728     1  0 01:18 ?        00:00:00 ora_qmnc_orcl

oracle    4741     1  0 01:18 ?        00:00:00 ora_q000_orcl

oracle    4743     1  0 01:18 ?        00:00:00 ora_q001_orcl

oracle    5467     1  0 03:46 ?        00:00:00 ora_j000_orcl

 

[oracle@oraserv ~]$

03:50:01 SQL> select paddr,name,description from v$bgprocess where paddr<>'00';

 

PADDR    NAME  DESCRIPTION

-------- ----- ----------------------------------------------------------------

30E16830 PMON  process cleanup

30E16DE4 PSP0  process spawner 0

30E17398 MMAN  Memory Manager

30E1794C DBW0  db writer process 0

30E1B808 ARC0  Archival Process 0

30E1BDBC ARC1  Archival Process 1

30E1C370 ARC2  Archival Process 2

30E17F00 LGWR  Redo etc.

30E184B4 CKPT  checkpoint

30E18A68 SMON  System Monitor Process

30E1901C RECO  distributed recovery

30E195D0 CJQ0  Job Queue Coordinator

30E1C924 QMNC  AQ Coordinator

30E19B84 MMON  Manageability Monitor Process

30E1A138 MMNL  Manageability Monitor Process 2

 


 DBWN

DBWR,用於將數據高速緩存的髒緩衝區數據寫入到數據文件中

默認狀況下只有一個DBWR0進程,經過db_writer_process 能夠定義最多10個DBWR進程(DBWR0-DBWR9).

DBWR工做觸發條件:

一、 系統發出檢查點(CheckPoint)

如:alter system checkpoint local; 這是手動操做。

二、 髒數據塊達到閥值

三、服務器進程不能找到空閒的緩衝區

三、超時

四、 rac ping

三、刪除或截斷表(表空間的相關操做只寫表空間相關的內容)

四、表空間正常脫機(ALTER  TABLE … OFFLINE NORMAL)

五、開始表空間備份(ALTER  TABLESAPCE ...BEGIN  BACKUP )

 

rac ping官方解釋:

        Every few seconds, the process in one instance sends messages to each instance. The message is received by PING on the target instance. The time for the round trip is measured and collected.

        rac ping是用ops時的概念了,如今已經不用這個概念了,或許沒有這個概念了。

 

Lgwr

 

LGWR,用於將重作日誌緩衝區所記載的所有內容寫入到重作日誌文件中。

Oracle 老是「先日誌後修改」(先記載變化而後修改數據);

在DBWR工做以前,LGWR首先將事務變化寫入到重作日誌。

LGWR工做觸發條件:

一、提交事務(commit)

二、每隔3秒鐘

三、當重作日誌信息超過1M

四、重作日誌緩衝區超過1/3滿

五、在DBWR進程將髒緩衝區寫入到數據文件前

思考:

checkpoint時會不會致使lgwr寫?

 

 

Smon

在例程失敗的狀況下,SMON作如下的恢復:

Instance recovery

        一、REDO,從新應用那些被記載的重作日誌,但還沒有記載的數據文件的數據。由於全部被提交的事務已經記載到了重作日誌,因此能夠確保恢復事務數據。(前滾)

        二、打開數據庫,在打開數據庫時,既包含了被提交的數據,也包含了未被提交的數據(加鎖)。

        三、Undo,取消未提交的數據。打開數據庫以後,Oracle會自動使用Undo段回退未提交的數據。(回滾)

整合空閒空間

臨時段

 

 

Pmon

PMON,用於監視服務器進程的執行,而且在服務器進程失敗時清除該服務器進程。

用戶例程意外終止運行時,PMON能夠輪詢檢測該服務進程,並執行如下操做:

一、回退用戶的當前事務

二、釋放服務器進程所佔用的全部表鎖和行鎖

三、釋放用戶所佔用的其餘資源

 

Checkpoint

 

CKPT,用於發出檢查點(CheckPoint),檢查點會同步數據庫的數據文件和控制文件、重作日誌)。

 

當發出檢查點時,後臺進程CKPT將檢查點時刻的SCN(System Change Number)寫入到控制文件、和數據文件頭部,同時會促使後臺進程DBWR將全部的髒緩衝區寫入到數據文件中。

當發出檢查點是,不只後臺進程CKPT和DBWR要開始工做,LGWR也會將重作日誌緩衝區寫入到重作日誌,從而確保數據文件、控制文件、重作日誌的一致性。

CKPT工做觸發條件:

一、日誌切換(包括手動:ALTER SYSTEM SWITCH LOGFILE,手動歸檔應該也能夠)

二、關閉實例(shutdown abort除外)

三、手工檢查點操做(alter  system  checkpoint)

四、熱備

五、當運行ALTER TABLESPACE/DATAFILE READ ONLY的時候

六、手動設置fast_start_mttr_target

 

檢查點發生後,他會立馬作出以下事件:

一、更新數據文件頭部

二、更新控制文件

主要是scn,用於恢復,chpt發生的頻率越高,恢復的時間越短,頻率高了,數據庫性能可能有影響;因此設置這個參數的時候要慎重。

 

Arcn

ARCH,用於將重作日誌的事務變化複製到歸檔日誌中(用於重作日誌的備份)

SQL> show parameter archive

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

archive_lag_target                   integer     0

log_archive_config                   string

log_archive_dest                     string

log_archive_dest_1                   string      location=/disk1/arch

log_archive_dest_10                  string

log_archive_dest_2                   string

log_archive_dest_3                   string

log_archive_dest_4                   string

log_archive_dest_5                   string

log_archive_dest_6                   string

log_archive_dest_7                   string

log_archive_dest_8                   string

log_archive_dest_9                   string

log_archive_dest_state_1             string      enable

log_archive_dest_state_10            string      enable

log_archive_dest_state_2             string      enable

log_archive_dest_state_3             string      enable

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

log_archive_dest_state_4             string      enable

log_archive_dest_state_5             string      enable

log_archive_dest_state_6             string      enable

log_archive_dest_state_7             string      enable

log_archive_dest_state_8             string      enable

log_archive_dest_state_9             string      enable

log_archive_duplex_dest              string

log_archive_format                   string      %s_%t_%r.log

log_archive_local_first              boolean     TRUE

log_archive_max_processes            integer     2

log_archive_min_succeed_dest         integer     1

log_archive_start                    boolean     FALSE

log_archive_trace                    integer     0

remote_archive_enable                string      true

standby_archive_dest                 string      ?/dbs/arch

 

3、 database 結構

 

一、物理結構

Oracle物理結構主要由:數據文件,日誌文件,控制文件

固然還有一些其餘的文件:參數文件,口令文件,告緊日誌文件,歸檔日誌文件等

具體內容後面一一總結

 

二、邏輯結構

 

一、表空間(tablespace),是數據庫的邏輯組成部分。

二、段(Segment),用於存放特定的邏輯對象(表、簇、索引等)的全部數據,它由一個或多個區組成的。

如表段、索引段、臨時段、undo段等

三、區(extent),是Oracle進行空間分配的邏輯單元,它由相鄰的數據塊組成。

四、Oracle 塊,數據塊,是Oracle 在數據文件上執行I/0的最小單位,其尺寸應該爲OS塊的整數倍

 

 

處理sql

 

服務器進程處理select語句包括解析(Parse),執行(Execute),和提取數據(Fetch)三個階段

 

處理DML語句:

由於DML語句不會返回數據,因此處理DML語句只包括解析和執行兩個階段

 

處理commit

 

 

轉:http://blog.csdn.net/yujin2010good/article/details/7709120

相關文章
相關標籤/搜索