一ORACLE實例
ORACLE 實例——包括內存結構與後台進程
System Global Area(SGA) 和 Background Process 稱為數據庫的實例
ORACLE 數據庫——物理操作系統文件的集合
一系列物理文件的集合(數據文件控制文件聯機日志參數文件等)
系統全局共享區System Global Area(SGA)
System Global Area 是一塊巨大的共享內存區域他被看做是Oracle 數據庫的一個大緩沖池這裡的數據可以被ORACLE的各個進程共用其大小可以通過如下語句查看
SQL> select * from v$sga;
NAME VALUE
Fixed Size
Variable Size
Database Buffers E+
Redo Buffers
更詳細的信息可以參考V$sgastatV$buffer_pool
主要包括以下幾個部分
a 共享池(Shared pool)
共享池是SGA中最關鍵的內存片段特別是在性能和可伸縮性上一個太小的共享池會扼殺性能使系統停止太大的共享池也會有同樣的效果將會消耗大量的CPU來管理這個共享池不正確的使用共享池只會帶來災難共享池主要又可以分為以下兩個部分
SQL語句緩沖(Library Cache)
當一個用戶提交一個SQL語句Oracle會將這句SQL進行分析(parse)這個過程類似於編譯會耗費相對較多的時間在分析完這個SQLOracle會把他的分析結果給保存在Shared pool的Library Cache中當數據庫第二次執行該SQL時Oracle自動跳過這個分析過程從而減少了系統運行的時間這也是為什麼第一次運行的SQL 比第二次運行的SQL要慢一點的原因
下面舉例說明parse的時間
SQL> select count(*) fromscpass ;
COUNT(*)
Elapsed: ::
這是在Share_pool 和Data buffer 都沒有數據緩沖區的情況下所用的時間
SQL> alter system flush SHARED_POOL;
System altered
清空Share_pool保留Data buffer
SQL> select count(*) from scpass ;
COUNT(*)
Elapsed: ::
SQL> select count(*) from scpass ;
COUNT(*)
Elapsed: ::
從兩句SQL 的時間差上可以看出該SQL 的Parse 時間約為::
對於保存在共享池中的SQL語句可以從V$Sqltextv$Sqlarea中查詢到對於編程者來說要盡量提高語句的重用率減少語句的分析時間一個設計的差的應用程序可以毀掉整個數據庫的Share pool提高SQL語句的重用率必須先養成良好的變成習慣盡量使用Bind變量
數據字典緩沖區(Data Dictionary Cache)
顯而易見數據字典緩沖區是ORACLE特地為數據字典准備的一塊緩沖池供ORACLE內部使用沒有什麼可以說的
b塊緩沖區高速緩存(Database Buffer Cache)
這些緩沖是對應所有數據文件中的一些被使用到的數據塊讓他們能夠在內存中進行操作在這個級別裡沒有系統文件戶數據文件臨時數據文件回滾段文件之分也就是任何文件的數據塊都有可能被緩沖數據庫的任何修改都在該緩沖裡完成並由DBWR進程將修改後的數據寫入磁盤
這個緩沖區的塊基本上在兩個不同的列表中管理一個是塊的髒表(Dirty List)需要用數據庫塊的書寫器(DBWR)來寫入另外一個是不髒的塊的列表(Free List)一般的情況下是使用最近最少使用 (Least Recently UsedLRU)算法來管理塊緩沖區高速緩存又可以細分為以下三個部分(Default poolKeep poolRecycle pool)如果不是人為設置初始化參數(Initora)ORACLE將默認為Default pool由於操作系統尋址能力的限制不通過特殊設置在位的系統上塊緩沖區高速緩存最大可以達到G在位系統上塊緩沖區高速緩存最大可以達到G
c重做日志緩沖區(Redo log buffer)
重做日志文件的緩沖區對數據庫的任何修改都按順序被記錄在該緩沖然後由LGWR進程將它寫入磁盤這些修改信息可能是DML語句如(InsertUpdateDelete)或DDL語句如(CreateAlterDrop等) 重做日志緩沖區的存在是因為內存到內存的操作比較內存到硬盤的速度快很多所以重作日志緩沖區可以加快數據庫的操作速度但是考慮的數據庫的一致性與可恢復性數據在重做日志緩沖區中的滯留時間不會很長所以重作日志緩沖區一般都很小大於M之後的重作日志緩沖區已經沒有太大的實際意義
dJava程序緩沖區(Java Pool)
Java 的程序區Oracle I 以後Oracle 在內核中加入了對Java的支持該程序緩沖區就是為Java 程序保留的如果不用Java程序沒有必要改變該緩沖區的默認大小
e大池(Large Pool)
大池的得名不是因為大而是因為它用來分配大塊的內存處理比共享池更大的內存在開始引入
下面對象使用大池
MTS——在SGA的Large Pool中分配UGA
語句的並行查詢(Parallel Executeion of Statements)——允許進程間消息緩沖區的分配用來協調 並行查詢服務器
備份(Backup)——用於RMAN磁盤I/O緩存
後台進程(Background process)
後台進程是Oracle的程序用來管理數據庫的讀寫恢復和監視等工作Server Process主要是通過他和user process進行聯系和溝通並由他和user process進行數據的交換在Unix機器上Oracle後台進程相對於操作系統進程也就是說一個Oracle後台進程將啟動一個操作系統進程;在Windows機器上 Oracle後台進程相對於操作系統線程打開任務管理器我們只能看到一個ORACLEEXE的進程但是通過另外的工具就可以看到包含在這裡進程中的線程
在Unix上可以通過如下方法查看後台進程
ps –ef | grep ora_
# ps ef | grep ora_ | grep XCLUAT
oracle Sep : ora_dbwr_SID
oracle Sep : ora_ckpt_SID
oracle Sep : ora_smon_SID
oracle Sep : ora_lgwr_SID
oracle Sep : ora_pmon_SID
aOracle系統有 個基本進程他們是
DBWR(數據文件寫入進程)
LGWR(日志文件寫入進程)
SMON(系統監護進程)
PMON(用戶進程監護進程)
CKPT(檢查點進程同步數據文件 日志文件控制文件)
服務進程用戶進程服務
用戶進程在客戶端負責將用戶的SQL語句傳遞給服務進程並從服務器段拿回查詢數據
bDBWR
負責將更改的數據從數據庫緩沖區高速緩存寫入數據文件
cLGWR
將重做日志緩沖區中的更改寫入在線重做日志文件LGWR是一個必須和前台用戶進程通信的進程當數據被修改的時候系統會產生一個重做日志並記錄在重做日志緩沖區內這個重做日志可以類似的認為是以下的一個結構:
SCN=
數據塊ID
對象ID=
數據行=
修改後的數據=
提交的時候LGWR必須將被修改的數據的重做日志緩沖區內數據寫入日志數據文件然後再通知前台進程提交成功並由前台進程通知用戶從這點可以看出LGWR承擔了維護系統數據完整性的任務
LGWR 工作的主要條件如下
用戶提交
有/ 重做日志緩沖區未被寫入磁盤
有大於M 重做日志緩沖區未被寫入磁盤
超時
DBWR需要寫入的數據的SCN號大於LGWR 記錄的SCN號DBWR 觸發LGWR寫入
dSMON 檢查數據庫的一致性如有必要還會在數據庫打開時啟動數據庫的恢復
工作主要包含
清除臨時空間
在系統啟動時完成系統實例恢復
聚結空閒空間
從不可用的文件中恢復事務的活動
OPS中失敗節點的實例恢復
清除OBJ$表
縮減回滾段
使回滾段脫機
ePMON負責在一個Oracle 進程失敗時清理資源
主要用於清除失效的用戶進程釋放用戶進程所用的資源如PMON將回滾未提交的工作釋放鎖釋放分配給失敗進程的SGA資源
fCKPT
同步數據文件日志文件和控制文件由於DBWR/LGWR的工作原理造成了數據文件日志文件控制文件的不一至這就需要CKPT進程來同步CKPT會更新數據文件/控制文件的頭信息
CKPT工作的主要條件如下
在日志切換的時候
數據庫用immediate transaction normal 選項shutdown 數據庫的時候
根據初始話文件LOG_CHECKPOINT_INTERVALLOG_CHECKPOINT_TIMEOUTFAST_START_IO_TARGET 的設置的數值來確定
用戶觸發
以下進程的啟動需要手工配置
gARCH在每次日志切換時把已滿的日志組進行備份或歸檔
當數據庫以歸檔方式運行的時候Oracle會啟動ARCH進程當重做日志文件被寫滿時日志文件進行切換舊的重做日志文件就被ARCH進程復制到一個/多個特定的目錄/遠程機器這些被復制的重做日志文件被叫做歸檔日志文件
hRECO
負責解決分布事物中的故障Oracle可以連接遠程的多個數據庫當由於網絡問題有些事物處於懸而未決的狀態RECO進程試圖建立與遠程服務器的通信當故障消除後RECO進程自動解決所有懸而未決的會話
i服務進程Server Process
服務進程的分類
專用服務進程(Dedicated Server Process)
一個服務進程對應一個用戶進程
共享服務進程(MultiTreaded Server Process)
一個服務進程對應多個用戶進程輪流為用戶進程服務
PGA & UGA
PGA = Process Global Area
UGA = User Global Area
他保存了用戶的變量權限堆棧排序空間等用戶信息對於專用服務器進程UGA在PGA中分配對於多線程進程UGA在Large pool中分配
j用戶進程User Process
在客戶端將用戶的SQL 語句傳遞給服務進程
一個貫穿數據庫全局的概念系統改變號SCN(System Change Number)
系統改變號一個由系統內部維護的序列號當系統需要更新的時候自動增加他是系統中維持數據的一致性和順序恢復的重要標志
a 查詢語句不會使SCN增加就算是同時發生的更新數據庫內部對應的SCN也是不同的這樣一來就保證了數據恢復時候的順序
b 維持數據的一致性當一
二ORACLE 數據庫
ORACLE數據庫的組成——物理操作系統文件的集合主要包括以下幾種
控制文件(參數文件initora記錄了控制文件的位置)
控制文件包括如下主要信息
數據庫的名字檢查點信息數據庫創建的時間戳
所有的數據文件聯機日志文件歸檔日志文件信息
備份信息等
有了這些信息Oracle就知道那些文件是數據文件現在的重做日志文件是哪些這些都是系統啟動和運行的基本條件所以他是Oracle運行的根本如果沒有控制文件系統是不可能啟動的控制文件是非常重要的一般采用多個鏡相復制來保護控制文件或采用RAID來保護控制文件控制文件的丟失將使數據庫的恢復變的很復雜
控制文件信息可以從V$Controlfile中查詢獲得
數據文件(數據文件的詳細信息記載在控制文件中)
可以通過如下方式查看數據文件
SQL> select name from v$datafile;
NAME
/u/dbf/PROD/system_dbf
/u/dbf/PROD/temp_dbf
/u/dbf/PROD/users_dbf
/u/dbf/PROD/rbs_dbf
/u/dbf/PROD/applsys_indx_dbf
/u/dbf/PROD/applsys_data_dbf
從以上可以看出數據文件大致可以分為以下幾類
i 系統數據文件(system_dbf)
存放系統表和數據字典一般不放用戶的數據但是用戶腳本如過程函數包等卻是保存在數據字典中的
名詞解釋數據字典 數據字典是一些系統表或視圖他存放系統的信息他包括數據庫版本數據文件信息表與索引等段信息系統的運行狀態等各種和系統有關的信息和用戶腳本信息數據庫管理員可以通過對數據字典的查詢就可以了解到Oracle的運行狀態
ii 回滾段文件(rbs_dbf)
如果數據庫進行對數據的修改那麼就必須使用回滾段回滾段是用來臨時存放修改前的數據(Before Image)回滾段通常都放在一個單獨的表空間上(回滾表空間)避免表空間碎片化這個表空間包含的數據文件就是回滾數據文件
iii 臨時數據文件(temp_dbf)
主要存放用戶的排序等臨時數據與回滾段相似臨時段也容易引起表空間碎片化而且沒有辦法在一個永久表空間上開辟臨時段所以就必須有一個臨時表空間它所包含的數據文件就是臨時數據文件主要用於不能在內存上進行的排序操作我們必須為用戶指定一個臨時表空間
iv 用戶數據文件(/applsys_data_dbf applsys_indx_dbf)
存放用戶數據這裡列舉了兩類常見的用戶型數據一般數據和索引數據一般來說如果條件許可的話可以考慮放在不同的磁盤上
重做日志文件(聯機重做日志)
用戶對數據庫進行的任何操作都會記錄在重做日志文件在了解重做日志之前必須了解重做日志的兩個概念重做日志組和重做日志組成員(Member)一個數據庫中至少要有兩個日志組文件一組寫完後再寫另一組即輪流寫每個日志組中至少有一個日志成員一個日志組中的多個日志成員是鏡相關系有利於日志文件的保護因為日志文件的損壞特別是當前聯機日志的損壞對數據庫的影響是巨大的
聯機日志組的交換過程叫做切換需要特別注意的是日志切換在一個優化效果不好的數據庫中會引起臨時的掛起掛起大致有兩種情況
在歸檔情況下需要歸檔的日志來不及歸檔而聯機日志又需要被重新利用
檢查點事件還沒有完成(日志切換引起檢查點)而聯機日志需要被重新利用
解決這種問題的常用手段是
i增加日志組
ii增大日志文件成員大小
通過v$log可以查看日志組v$logfile可以查看具體的成員文件
歸檔日志文件
Oracle可以運行在兩種模式之中歸檔模式和不歸檔模式如果不用歸檔模式當然你就不會有歸檔日志但是你的系統將不會是一個實用系統特別是不能用於生產系統因為你可能會丟失數據但是在歸檔模式中為了保存用戶的所有修改在重做日志文件切換後和被覆蓋之間系統將他們另外保存成一組連續的文件系列該文件系列就是歸檔日志文件
有人或許會說歸檔日志文件占領我大量的硬盤空間其實具體想一想你是願意浪費一點磁盤空間來保護你的數據還是願意丟失你的數據呢?顯而義見我們需要保證我們的數據的安全性其實歸檔並不是一直占領你的磁盤空間你可以把她備份到磁帶上或則刪除上一次完整備份前的所有日志文件
初始化參數文件
initSIDora或initora文件因為版本的不一樣其位置也可能會不一樣在i中通常位於$ORACLE_HOME/admin//Pfile下初始化文件記載了許多數據庫的啟動參數如內存控制文件進程數等在數據庫啟動的時候加載(Nomount時加載)初始化文件記錄了很多重要參數對數據庫的性能影響很大如果不是很了解不要輕易亂改寫否則會引起數據庫性能下降
其他文件
i 密碼文件
用於Oracle 的具有sysdba權限用戶的認證
ii 日志文件
報警日志文件(alertlog或alrtora)
記錄數據庫啟動關閉和一些重要的出錯信息數據庫管理員應該經常檢查這個文件並對出現的問題作出即使的反應你可以通過以下SQL 找到他的路徑select value from v$PARAMETER where name =background_dump_dest;
後台或用戶跟蹤文件
系統進程或用戶進程出錯前寫入的信息一般不可能讀懂可以通過ORACLE的TKPROF工具轉化為可以讀懂的格式對於系統進程產生的跟蹤文件與報警日志文件的路徑一樣用戶跟蹤文件的路徑你可以通過以下SQL找到他的路徑select value from v$PARAMETER where name =user_dump_dest;
三ORACLE邏輯結構
表空間(tablespace)
表空間是數據庫中的基本邏輯結構一系列數據文件的集合一個表空間可以包含多個數據文件但是一個數據文件只能屬於一個表空間
段(Segment)
段是對象在數據庫中占用的空間雖然段和數據庫對象是一一對應的但段是從數據庫存儲的角度來看的一個段只能屬於一個表空間當然一個表空間可以有多個段
表空間和數據文件是物理存儲上的一對多的關系表空間和段是邏輯存儲上的一對多的關系段不直接和數據文件發生關系一個段可以屬於多個數據文件關於段可以指定擴展到哪個數據文件上面
段基本可以分為以下四種
數據段(Data Segment)
索引段(Index Segment)
回滾段(Rollback Segment)
臨時段(Temporary Segment)
區間(Extent)
關於Extent的翻譯有多種解釋有的譯作擴展有的譯作盤區我這裡通常譯為區間在一個段中可以存在多個區間區間是為數據一次性預留的一個較大的存儲空間直到那個區間被用滿數據庫會繼續申請一個新的預留存儲空間即新的區間一直到段的最大區間數(Max Extent)或沒有可用的磁盤空間可以申請 在ORACLEi以上版本理論上一個段可以無窮個區間但是多個區間對ORACLE卻是有性能影響的ORACLE建議把數據分布在盡量少的區間上以減少ORACLE的管理與磁頭的移動
Oracle數據塊(Block)
ORACLE最基本的存儲單位他是OS數據塊的整數倍ORACLE的操作都是以塊為基本單位一個區間可以包含多個塊(如果區間大小不是塊大小的整數倍ORACLE實際也擴展到塊的整數倍)
基本表空間介紹
a 系統表空間
主要存放數據字典和內部系統表基表
查看數據數據字典的SQL
select * from dict
查看內部系統表的SQL
select * from v$fixed_view_definition
DBA對系統的系統表中的數據字典必須有一個很深刻的了解他們必須准備一些基礎的SQL語句通過這些SQL可以立即了解系統的狀況和數據庫的狀態這些基本的SQL包括
系統的剩余空間
系統的SGA
狀態系統的等待
用戶的權限
當前的用戶鎖
緩沖區的使用狀況等
在成為DBA 的道路上我們不建議你過分的依賴於OEM/Quest 等優秀的數據庫管理工具因為他們不利於你對數據數據字典的理解SQL語句可以完成幾乎全部的數據庫管理工作
大量的讀少量的寫是該表空間的一個顯著的特點
b 臨時表空間
臨時表空間顧名思義是用來存放臨時數據的例如排序操作的臨時空間他的空間會在下次系統啟動的時候全部被釋放
c 回滾段表空間
i 回滾段在系統中的作用
當數據庫進行更新插入刪除等操作的時候新的數據被更新到原來的數據文件而舊的數據(Before Image)就被放到回滾段中如果數據需要回滾那麼可以從回滾段將數據再復制到數據文件中來完成數據的回滾在系統恢復的時候 回滾段可以用來回滾沒有被commit 的數據解決系統的一至性
回滾段在什麼情況下都是大量的寫一般是少量讀因此建議把回滾段單獨出來放在一個單獨的設備(如單獨的磁盤或RAID)以減少磁盤的IO爭用
ii 回滾段的工作方式
一個回滾表空間可以被劃分成多個回滾段
一個回滾段可以保存多個會話的數據
回滾段是一個圓形的數據模型
假設回滾段由 個區間組成他們的使用順序就是區間à區間à區間à區間à區間也就是說區間是可以循環使用的當區間到區間的時候區間裡面的會話還沒有結束 區間用完後就不能再用區間這時系統必須分配區間來繼續為其他會話服務服務
我們分析一個Update 語句的完成
① 用戶提交一個Update 語句
② Server Process 檢查內存緩沖
如果沒有該數據塊的緩沖則從磁盤讀入
i 如果沒有內存的有效空間DBWR被啟動將未寫入磁盤的髒緩沖寫入磁盤
ii 如果有有效空間則讀入
③ 在緩沖內更新數據
i 申請一個回滾段入口將舊數據寫如回滾段
ii 加鎖並更新數據
iii 並在同時將修改記錄在Redo log buffer中
From:http://tw.wingwit.com/Article/program/Oracle/201311/16697.html