Oracle體系結構就是圍繞這張圖展開的,要想深入了解oracle,就必須把這張圖搞明白。
如圖:
一、基本組成:
Oracle server:
一般情況下是一個instance和一個database組成
1個instance只能對應一個數據庫。
特殊:1個數據庫可以有多個instance(rac)
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
文章列表