Oracle體系結構就是圍繞這張圖展開的,要想深刻了解oracle,就必須把這張圖搞明白。java
如圖:linux
1、基本組成:sql
Oracle server:數據庫
通常狀況下是一個instance和一個database組成緩存
1個instance只能對應一個數據庫。
特殊:1個數據庫能夠有多個instance(rac)服務器
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