【Oracle學習12】 Oracle 12c體系結構
Oracle版本:


12.1 Oracle數(shù)據(jù)庫體系結構組件
Oracle主要體系為:三大文件,五大進程,六大池.
- 三大文件:ctl(控制文件),log(日志文件),dbf(數(shù)據(jù)文件)
- 五大進程:PMON,SMON,DBWR,LGWR,CKPT
- 六大池:buffer cache,shared pool,redo log buffer,large pool,java pool,streams pool





12.1.1 單實例數(shù)據(jù)庫體系結構
數(shù)據(jù)庫物理結構:
select name,bytes from v$datafile;
select name,bytes from v$tempfile;
select member from v$logfile;
select * from v$controlfile;
#
SQL> select name,bytes from v$datafile;
NAME BYTES
-------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf 870318080
/u01/app/oracle/oradata/orcl/jinlian_undo.dbf 20971520
/u01/app/oracle/oradata/orcl/sysaux01.dbf 954204160
/u01/app/oracle/oradata/orcl/undotbs01.dbf 188743680
/u01/app/oracle/oradata/orcl/users01.dbf 10485760
SQL> select * from v$controlfile;
STATUS NAME IS_REC BLOCK_SIZE FILE_SIZE_BLKS CON_ID
------ ---------- -------------- ---------- ------ ---------- -------------- ----------
null /u01/app/oracle/oradata/orcl/control01.ctl NO 16384 646 0
null /u01/app/oracle/oradata/orcl/control02.ctl NO 16384 646 0
內存及進程結構:
[oracle@db01 ~]$ ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 131076 oracle 600 4096 0
0x00000000 163845 oracle 600 4096 0
0x00000000 196614 oracle 600 4096 0
0xc8f412cc 229383 oracle 600 12288 46
[oracle@db01 ~]$ ps -ef |grep ora_
oracle 2245 1 0 Feb03 ? 00:00:07 ora_pmon_orcl
oracle 2247 1 0 Feb03 ? 00:00:02 ora_clmn_orcl
oracle 2249 1 0 Feb03 ? 00:00:43 ora_psp0_orcl
oracle 2251 1 0 Feb03 ? 00:00:59 ora_vktm_orcl
...
12.1.2 分布式系統(tǒng)體系結構
分布式環(huán)境,多種組合實例和數(shù)據(jù)庫的方式:
- 實時應用群集(Real Appliction Clusters,RAC) : 多個實例打開一個數(shù)據(jù)庫
- 流或GoldenGate : 多個Oracle服務器相互之間傳播事務。
- 數(shù)據(jù)保護: 主數(shù)據(jù)庫更新備用數(shù)據(jù)庫,或它們之間同步。
#是否是RAC (Real Appliction Clusters)
SQL> select parallel from v$instance;
PARALL
------
NO
# DG (Data Guard)
SQL> select protection_level from v$database;
PROTECTION_LEVEL
----------------------------------------
UNPROTECTED
#是否配置了流
select * from dba_streams_adminstrator;
#物理結構
select name,blocks,block_size from v$datafile;
select * from v$tempfile;
select * from v$logfile;
select * from v$controlfile;
SQL> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/system01.dbf
/u01/app/oracle/oradata/orcl/sysaux01.dbf
/u01/app/oracle/oradata/orcl/undotbs01.dbf
/u01/app/oracle/oradata/orcl/mytest.dbf
/u01/app/oracle/oradata/orcl/users01.dbf
--創(chuàng)建表空間
create tablespace example datafile '/u01/app/oracle/oradata/orcl/example.dbf' size 50m;
select file_id,file_name,tablespace_name,autoextensible from dba_data_files;
select tablespace_name,block_size,status,contents,logging from dba_tablespaces;
select * from dba_tablespaces where tablespace_name like 'EXAMPLE%';
12.2 內存結構
Oracle 實例由系統(tǒng)共享內存塊(SGA) + 后臺進程構成。SGA至少包括:如下
- 數(shù)據(jù)庫緩沖區(qū)(Database buffer cache): 用于執(zhí)行SQL的工作區(qū)域。
- 日志緩存區(qū):
- 共享池:
可選項有,Large pool,Java pool,Streams pool。 - 大池 :
- JAVA Pool:
- 流緩沖池:
說明:
- 共享池,大池,流池的大小是動態(tài)的,可以系統(tǒng)自動管理。


查看內存結構:
#查看
SQL> show sga;
Total System Global Area 1610612736 bytes
Fixed Size 8621232 bytes
Variable Size 905970512 bytes
Database Buffers 687865856 bytes
Redo Buffers 8155136 bytes
SQL> select name,value from v$pgastat where name in ('maxinum PGA allowcated','total PGA allocated');
NAME VALUE
----------------------------------------------------- ----------
total PGA allocated 147928064
SQL> select component,current_size,min_size ,max_size from v$sga_dynamic_components order by CURRENT_SIZE desc;
COMPONENT CURRENT_SIZE MIN_SIZE MAX_SIZE
-------------------------------------------------- ------------ ---------- ----------
DEFAULT buffer cache 637534208 587202560 704643072
shared pool 301989888 234881024 301989888
Shared IO Pool 50331648 50331648 50331648
large pool 33554432 33554432 150994944
java pool 16777216 16777216 16777216
DEFAULT 8K buffer cache 0 0 0
DEFAULT 16K buffer cache 0 0 0
DEFAULT 32K buffer cache 0 0 0
Data Transfer Cache 0 0 0
In-Memory Area 0 0 0
In Memory RW Extension Area 0 0 0
In Memory RO Extension Area 0 0 0
ASM Buffer Cache 0 0 0
DEFAULT 2K buffer cache 0 0 0
RECYCLE buffer cache 0 0 0
KEEP buffer cache 0 0 0
streams pool 0 0 0
DEFAULT 4K buffer cache 0 0 0
18 rows selected.
12.2.1 數(shù)據(jù)庫緩沖區(qū)(Database buffer cache)
數(shù)據(jù)庫緩沖區(qū)(Database buffer cache): 用于執(zhí)行SQL的工作區(qū)域。

#
12.2.2 日志緩沖( Redo log buffer)
日志緩沖區(qū):
- 用于短期存儲將寫入到磁盤上的重做日志的變更修改。
-
是一個循環(huán)緩沖區(qū)。
會話服務器進程先寫redo log到日志緩沖區(qū),這樣性能較好。 當會話Commit時,會執(zhí)行日志緩沖區(qū)的寫操作,把日志緩沖刷新到磁盤中。操作由日志后臺寫進程(LGWR)完成。
Redo Log Buffer
12.2.3 共享池 (Shared pool)
共享池 :
- 庫緩存
- 數(shù)據(jù)字典緩存
- SQL查詢和PL/SQL結果緩存.
說明:
- 共享池在實例啟動。 使用LRU(最近最少使用)來分配。
- 大小可以Oracle服務器內部自動調整,也可以手動調整。

1)庫緩存(Library cache)
Library cache存放SQL編譯后的可執(zhí)行代碼。
2)數(shù)據(jù)字典緩存
數(shù)據(jù)字典緩存: 存放最近使用對象的定義,如表索引,用戶和其它元數(shù)據(jù)。此位于SGA的內存中,以便全部會話都可以直接訪問。
表信息等內容會加入到緩存中。 后續(xù)語句分析速度將因此而加快。
3)SQL查詢及函數(shù)結果緩存
存放查詢結果/函數(shù)結果,若有更新則結果失效。
4)設置共享池大小
12.2.4 大池(Large pool)
Large pool是一個可選區(qū),主要是供共享的服務器進程使用。

12.2.5 Java池(Java pool)
若應用程序需要在數(shù)據(jù)庫中運行Java存儲過程時,需要java池。 作為實例化Java對象所需的堆空間。
注意:java代碼在共享池中緩存,與SQL代碼的緩存方式相同。

12.2.6 流池(Streams pool)
流池(Streams pool)重做日志中提取變更向量會使用到。
Oracle 10G后已用較少,很多功能被OGG替換了。

12.2.7 程序全局區(qū)(Program global area,PGA)
PGA是一個私有的內存區(qū),只屬于一個進程,隨進程創(chuàng)建而分配,終止而回收。
- 排序區(qū) (sort area): 處理SQL語句排序。
- 游標狀態(tài)區(qū)(cursor state): SQL當前的狀態(tài)。
- 會話信息區(qū)(session info): 用戶會話時的權限和統(tǒng)計信息。
- 堆棧區(qū)(stack space): 一些會話信息

12.3 后臺進程
后臺進程在啟動實例時啟動,在終止實例時終止運行。
- 系統(tǒng)監(jiān)視器(System Monitor,SMON):
- 進程監(jiān)視器(Process Monitor,PMON):
- 數(shù)據(jù)庫寫入器(Database Writer,DBWn):
- 日志寫入器(Log Writer,LGWR):
- 檢查點進程(Checkpoint Process,CKPT):
其它的還有:
- 可管理監(jiān)視器(Manageablility Monitor,MMON):
- 內存管理器(Memory Manager,MMAN):
- Archiver(ARCn):
- Recoverer(RECO):
進程查看:
當前有哪些進行在運行:
select program,paddr from v$session order by program;
select program,addr from v$process order by program;
SQL> select name,description from v$bgprocess where paddr <>'00' and DESCRIPTION is not null;
NAME DESCRIPTION
---------- --------------------------------------------------------------------------------------------------------------------------------
PMON process cleanup
CLMN process cleanup
PSP0 process spawner 0
VKTM Virtual Keeper of TiMe process
GEN0 generic0
MMAN Memory Manager
...


12.3.1 SMON
系統(tǒng)監(jiān)視器(System Monitor,SMON): 負責先安裝及打開數(shù)據(jù)庫,任務完成后負責內部管理任務,如合并數(shù)據(jù)文件可用空間等。

12.3.2 PMON
進程監(jiān)視器(Process Monitor,PMON): 監(jiān)視所有服務器進程,并檢測會話中的任何問題。 若會話異常終止,PMON將銷毀服務器進程,將其PGA內存返回給操作系統(tǒng)空閑內存池,并回滾未完成事務。

12.3.3 DBWn
數(shù)據(jù)庫寫入器(Database Writer,DBWn): 會話將數(shù)據(jù)改寫寫入數(shù)據(jù)緩沖區(qū),DBWn,將臟緩沖區(qū)數(shù)據(jù)寫入磁盤。

DBWn用極懶算法來執(zhí)行寫入:盡量少的寫。在如下進行寫操作:
- 沒有可用數(shù)據(jù)緩沖區(qū):
- 臟緩沖區(qū)過多:
- 三秒超時: DBWn每3秒對緩沖區(qū)清理一次。
- 遇到檢查點:
檢查點:
- 唯一絕對需要檢查點場景是關閉數(shù)據(jù)庫時,會要將所有緩沖區(qū)數(shù)據(jù)寫入磁盤。 這是完全檢查點。
- 分為 完全檢查點,局部檢查點。局部檢查點權包括一個或多個數(shù)據(jù)文件的塊的所有臟緩沖區(qū)。
alter system checkpoint;
12.3.4 LGWR
LGWR(Log Writer) 將日志緩沖區(qū)的內容寫入到磁盤上的聯(lián)機日志文件中。這過程通常稱為 "日志緩沖區(qū)轉儲";
- 會話發(fā)出Commit: 日志緩沖區(qū)數(shù)據(jù)寫入磁盤,保證事務不丟失。
- 日志緩沖區(qū)占用率達1/3
- DBWn要寫入臟緩沖區(qū):

12.3.5 CKPT
CKPT(Checkpoint Process,CKPT): 不再必須發(fā)出完全檢查點,但是它必須跟蹤增量檢查點的位置,并不斷更新控制文件。

12.3.6 MMON
可管理監(jiān)視器(Manageablility Monitor,MMON): 數(shù)據(jù)庫的自我監(jiān)視和自我調整功能的支持進程。
12.3.7 MMNL
MMNL(Manageablility Monitor Light) 是MMON的輔助進程。
12.3.8 MMAN
內存管理器(Memory Manager,MMAN): 支持內存分配的自動管理。 MMAN觀察PGA和SGA內存的需求,并分配,控制總量在DBA的設置限制內。
12.3.9 LREG
監(jiān)聽注冊LREG(Listener Registration Process): 以前由PMON實現(xiàn),12C新增。

12.3.10 ARCn
Archiver(ARCn): 對數(shù)據(jù)庫來說這是可選的進程,但是對企業(yè)來說是必須的。 做為日志歸檔需要ARCn.
- LGWR 對聯(lián)機日志文件執(zhí)行寫操作。
- ARCn 讀聯(lián)機日志文件。

12.3.11 RECO
Recoverer(RECO): 操作回滾時會用到。

12.3.12 其它后臺進程
SQL> select name,description from v$bgprocess where paddr <>'00' and DESCRIPTION is not null;
NAME DESCRIPTION
---------- ---------------------------------------------------------------
PMON process cleanup
CLMN process cleanup
PSP0 process spawner 0
VKTM Virtual Keeper of TiMe process
GEN0 generic0
MMAN Memory Manager
RECO distributed recovery
GEN1 generic1
DIAG diagnosibility process
OFSD Oracle File Server BG
DBRM DataBase Resource Manager
VKRM Virtual sKeduler for Resource Manager
SVCB services background monitor
PMAN process manager
DIA0 diagnosibility process 0
DBW0 db writer process 0
LGWR Redo etc.
CKPT checkpoint
SMON System Monitor Process
SMCO Space Manager Process
LREG Listener Registration
PXMN PX Monitor
FENC IOServer fence monitor
MMNL Manageability Monitor Process 2
MMON Manageability Monitor Process
TMON Transport Monitor
AQPC AQ Process Coord
CJQ0 Job Queue Coordinator
28 rows selected.
12.4 邏輯和物理存儲結構之間的關系

12.4.1 物理數(shù)據(jù)庫結構
必需的文件:
- 控制文件(controlfile):
- 聯(lián)機重做日志文件(online redo logfile):
- 數(shù)據(jù)文件(datafile):
其它外部文件:
- 初始化參數(shù)文件
- 口令文件:
- 歸檔重做日志文件:
- 日志和跟蹤文件:

1)控制文件
控制文件:包含指向數(shù)據(jù)庫其余部分的指針: 聯(lián)機重做日志文件和數(shù)據(jù)庫數(shù)據(jù)文件,歸檔日志的位軒。 還存儲維護數(shù)據(jù)庫完整性的信息,如各種序列號和時間戳。
- 至少有一個控制文件,建議多個復本。
2)聯(lián)機重做日志文件
重做日志(redo log)按時間順序存儲應用于數(shù)據(jù)庫的一連串變更向量。 重做日志(redo log)包括: 聯(lián)機重做日志: 必需。歸檔日志: 可選。
- 至少需要兩個聯(lián)機重做日志文件組;為了安全,每組至少兩個成員。
3)數(shù)據(jù)文件
數(shù)據(jù)庫創(chuàng)建階段,至少需要創(chuàng)建兩個數(shù)據(jù)文件。
- SYSTEM表空間(存數(shù)據(jù)字典),及 SYSAUX表空間(存數(shù)據(jù)字典輔助數(shù)據(jù)).
- UNDO 表空間:存事務所需的撤消段。
數(shù)據(jù)文件和邏輯文件:
- 數(shù)據(jù)文件是系統(tǒng)管理員看的真實的物理文件。
- 邏輯文件: Database > Tablespce > Segment(段) > Extent 段區(qū)間> Oracle block。

4)其它數(shù)據(jù)庫文件
如下文件實際上也是必需的,但嚴格地講,它們不是數(shù)據(jù)庫的一部分。
- 實例參數(shù)文件(Instance Parameter File):
- 口令文件(Password File):
- 歸檔重做日志文件(Archive Redo Log Files):
- 警報日志和跟蹤文件( Alert Log and Trace Files):
12.4.2 邏輯數(shù)據(jù)庫結構
邏輯文件: Database > Tablespce > Segment(段) > Extent 段區(qū)間> Oracle block。
- Segment(段) 描述任何包括數(shù)據(jù)的結構。 典型的段是包括數(shù)據(jù)行的表,索引,撤消段。 撤消段用于回滾事務。
- Tablespace: 邏輯上是多個段的集合,物理上是一個或多個文件。
- Extent 區(qū)間: 段由Block組成,為了管理方便把塊分組成Extent區(qū)間。
- Block 塊: 一個Block可以包括多個 OS block。



12.4.3 數(shù)據(jù)字典
數(shù)據(jù)字典: 包括描述數(shù)據(jù)庫及其內容的元數(shù)據(jù)。用戶定義,安全信息,完整性約束,性能監(jiān)控信息都是數(shù)據(jù)字典的一部分。
- 數(shù)據(jù)字典做為一組段,存于SYSTEM和SYSAUX表空間。
- 數(shù)據(jù)字典 在創(chuàng)建數(shù)據(jù)庫時生成,無權直接訪問它們。
- 可以通過DDL語言進行維護。如Create Table,即在數(shù)據(jù)字典中insert了記錄。
- 可通過視圖來查看: CDB_,DBA_,ALL_,USER_
示例:
create table tab34 (c1 varchar2(10)) segment creation immediate;
desc dba_extents;
select * from dba_tables where table_name = 'TAB34';
#
select tablespace_name,extent_id,bytes,file_id,block_id from dba_extents where owner='SYSTEM' and UPPER(segment_name) = 'TAB34';
select name from v$datafile where file=#=&file_id;
select * from dba_tablespaces where tablespace_name='USERS';
12.5 其它及總結
12.5.1 ASM(自動存儲管理)



12.5.2 多租戶

12.5.3 Oracle用戶交互





12.6 測試
#
