文章出處

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

如圖:

一、基本組成:

Oracle server:

   一般情況下是一個instance和一個database組成

   1個instance只能對應一個數據庫。
    特殊:1個數據庫可以有多個instance(rac)

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

 

 

Oracle Instance:

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

通過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結構

如下結構:

 

 

二、instance結構詳解

  

 

1、  內存結構

 

主要包括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認證后開始建立會話,直到用戶退出登錄,會話結束

 

2、進程結構

 用戶進程

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工作觸發條件:

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

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

2、 臟數據塊達到閥值

3、服務器進程不能找到空閑的緩沖區

3、超時

4、 rac ping

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

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

5、開始表空間備份(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工作觸發條件:

1、提交事務(commit)

2、每隔3秒鐘

3、當重做日志信息超過1M

4、重做日志緩沖區超過1/3滿

5、在DBWR進程將臟緩沖區寫入到數據文件前

思考:

checkpoint時會不會導致lgwr寫?

 

 

Smon

在例程失敗的情況下,SMON做以下的恢復:

Instance recovery

        1、REDO,重新應用那些被記載的重做日志,但尚未記載的數據文件的數據。因為所有被提交的事務已經記載到了重做日志,所以可以確保恢復事務數據。(前滾)

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

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

整合空閑空間

臨時段

 

 

Pmon

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

用戶例程意外終止運行時,PMON可以輪詢檢測該服務進程,并執行以下操作:

1、回退用戶的當前事務

2、釋放服務器進程所占用的所有表鎖和行鎖

3、釋放用戶所占用的其他資源

 

Checkpoint

 

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

 

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

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

CKPT工作觸發條件:

1、日志切換(包括手動:ALTER SYSTEM SWITCH LOGFILE,手動歸檔應該也可以)

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

3、手工檢查點操作(alter  system  checkpoint)

4、熱備

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

6、手動設置fast_start_mttr_target

 

檢查點發生后,他會立馬做出如下事件:

1、更新數據文件頭部

2、更新控制文件

主要是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

 

三、 database 結構

 

1、物理結構

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

當然還有一些其他的文件:參數文件,口令文件,告緊日志文件,歸檔日志文件等

具體內容后面一一總結

 

2、邏輯結構

 

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

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

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

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

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

 

 

處理sql

 

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

 

處理DML語句:

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

 

處理commit

 

 

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()