數(shù)據(jù)庫恢復在數(shù)據(jù)恢復中,是一個大板塊,一般只有上規(guī)模的數(shù)據(jù)恢復公司才能有實力進行數(shù)據(jù)庫恢復,對數(shù)據(jù)恢復工程師要求很高,特別是對各種數(shù)據(jù)庫的底層存儲結構很熟悉,數(shù)據(jù)庫恢復工作才能得心應手。今天筆者主要說說數(shù)據(jù)庫恢復之ORACLE體系結構(一),希望對數(shù)據(jù)恢復恢復工程師對數(shù)據(jù)庫深入研究有幫助。
1、ORACLE 實例
System Global Area(SGA) 和 Background Process 被成為數(shù)據(jù)庫的實例。
2、ORACLE 數(shù)據(jù)庫
一系列物理文件的集合(數(shù)據(jù)文件,控制文件,聯(lián)機日志,參數(shù)文件等)
3、系統(tǒng)全局共享區(qū)System Global Area(SGA)
System Global Area 是一塊巨大的共享內(nèi)存區(qū)域,他被看做是Oracle 數(shù)據(jù)庫的一個大緩沖池,這里的數(shù)據(jù)可以被ORACLE的各個進程共用。其大小可以通過如下語句查看:SQL> select * from v$sga;
NAME VALUE
-------------------- ---------
Fixed Size 39816
Variable Size 259812784
Database Buffers 1.049E+09
Redo Buffers 327680
更詳細的信息可以參考V$sgastat、V$buffer_pool
主要包括以下幾個部分:
a、 共享池(Shared pool)
共享池是SGA中最關鍵的內(nèi)存片段,特別是在性能和可伸縮性上。一個太小的共享池會扼殺性能,使系統(tǒng)停止,太大的共享池也會有同樣的效果,將會消耗大量的CPU來管這個共享池。不正確的使用共享池只會帶來災難。共享池主要又可以分為以下兩個部分:
·SQL語句緩沖(Library Cache)
當一個用戶提交一個SQL語句,Oracle會將這句SQL進行分析(parse),這個過程類似于編譯,會耗費相對較多的時間。在分析完這個SQL,Oracle會把他的分析結果給保存Shared pool的Library Cache中,當數(shù)據(jù)庫第二次執(zhí)行該SQL時,Oracle自動跳過這個分析過程,從而減少了系統(tǒng)運行的時間。這也是為什么第一次運行的SQL 比第二次運行的SQL要慢一點的原因。
下面舉例說明parse的時間
SQL> select count(*) fromscpass ;
COUNT(*)
----------
243
Elapsed: 00:00:00.08
這是在Share_pool 和Data buffer 都沒有數(shù)據(jù)緩沖區(qū)的情況下所用的時間
SQL> alter system flush SHARED_POOL;
System altered.
清空Share_pool,保留Data buffer
SQL> select count(*) from scpass;
COUNT(*)
----------
243
Elapsed: 00:00:00.02
SQL> select count(*) from scpass;
COUNT(*)
----------
243
Elapsed: 00:00:00.00
從兩句SQL 的時間差上可以看出該SQL 的Parse 時間約為00:00:00.02
對于保存在共享池中的SQL語句,可以從V$Sqltext、v$Sqlarea中查詢到,對于編程者來說,要盡量提高語句的重用率,減少語句的分析時間。一個設計的差的應用程序可以毀掉整個數(shù)據(jù)庫的Share pool,提高SQL語句的重用率必須先養(yǎng)成良好的變成習慣,盡量使用Bind變量。
·數(shù)據(jù)字典緩沖區(qū)(Data Dictionary Cache)
顯而易見,數(shù)據(jù)字典緩沖區(qū)是ORACLE特地為數(shù)據(jù)字典準備的一塊緩沖池,供ORACLE內(nèi)部使用,沒有什么可以說的。
b、塊緩沖區(qū)高速緩存(Database Buffer Cache)
這些緩沖是對應所有數(shù)據(jù)文件中的一些被使用到的數(shù)據(jù)塊。讓他們能夠在內(nèi)存中進行操作。在這個級別里沒有系統(tǒng)文件,,戶數(shù)據(jù)文件,臨時數(shù)據(jù)文件,回滾段文件之分。也就是任何文件的數(shù)據(jù)塊都有可能被緩沖。數(shù)據(jù)庫的任何修改都在該緩沖里完成,并由DBWR進程將修改后的數(shù)據(jù)寫入磁盤。
這個緩沖區(qū)的塊基本上在兩個不同的列表中管理。一個是塊的“臟”表(Dirty List),需要用數(shù)據(jù)庫塊的書寫器(DBWR)來寫入,另外一個是不臟的塊的列表(Free List),一般的情況下,是使用最近最少使用(Least Recently Used,LRU)算法來管理。
塊緩沖區(qū)高速緩存又可以細分為以下三個部分(Default pool,Keep pool,Recycle pool)。如果不是人為設置初始化參數(shù)(Init.ora),ORACLE將默認為Default pool。
由于操作系統(tǒng)尋址能力的限制,不通過特殊設置,在32位的系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達到1.7G,在64位系統(tǒng)上,塊緩沖區(qū)高速緩存最大可以達到10G。
c、重做日志緩沖區(qū)(Redo log buffer)
重做日志文件的緩沖區(qū),對數(shù)據(jù)庫的任何修改都按順序被記錄在該緩沖,然后由LGWR進程將它寫入磁盤。這些修改信息可能是DML語句,如(Insert,Update,Delete),或DDL語句,如(Create,Alter,Drop等)。
重做日志緩沖區(qū)的存在是因為內(nèi)存到內(nèi)存的操作比較內(nèi)存到硬盤的速度快很多,所以重作日志緩沖區(qū)可以加快數(shù)據(jù)庫的操作速度,但是考慮的數(shù)據(jù)庫的一致性與可恢復性,數(shù)據(jù)在重做日志緩沖區(qū)中的滯留時間不會很長。所以重作日志緩沖區(qū)一般都很小,大于3M之后的重作日志緩沖區(qū)已經(jīng)沒有太大的實際意義。
d、Java程序緩沖區(qū)(Java Pool)
Java 的程序區(qū),Oracle 8I 以后,Oracle 在內(nèi)核中加入了對Java的支持。該程序緩沖區(qū)就是為Java 程序保留的。如果不用Java程序沒有必要改變該緩沖區(qū)的默認大小。
e、大池(Large Pool)
大池的得名不是因為大,而是因為它用來分配大塊的內(nèi)存,處理比共享池更大的內(nèi)存,在8.0開始引入。
下面對象使用大池:
·MTS——在SGA的Large Pool中分配UGA
·語句的并行查詢(Parallel Executeion of Statements)——允許進程間消息緩沖區(qū)的分配,用來協(xié)調(diào)并行查詢服務器
·備份(Backup)——用于RMAN磁盤I/O緩存
4、后臺進程(Background process)
后臺進程是Oracle的程序,用來管理數(shù)據(jù)庫的讀寫,恢復和監(jiān)視等工作。Server Process主要是通過他和user process進行聯(lián)系和溝通,并由他和user process進行數(shù)據(jù)的交換。在Unix機器上,Oracle后臺進程相對于操作系統(tǒng)進程,也就是說,一個Oracle后臺進程將啟動一個操作系統(tǒng)進程;在Windows機器上,Oracle后臺進程相對于操作系統(tǒng)線程,打開任務管理器,我們只能看到一個ORACLE.EXE的進程,但是通過另外的工具,就可以看到包含在這里進程中的線程。
在Unix上可以通過如下方法查看后臺進程:
ps –ef | grep ora_
# ps -ef | grep ora_ | grep XCLUAT
oracle 29431 1 0 Sep 02 ? 2:02 ora_dbwr_SID
oracle 29444 1 0 Sep 02 ? 0:03 ora_ckpt_SID
oracle 29448 1 0 Sep 02 ? 2:42 ora_smon_SID
oracle 29442 1 0 Sep 02 ? 3:25 ora_lgwr_SID
oracle 29427 1 0 Sep 02 ? 0:01 ora_pmon_SID
a、Oracle系統(tǒng)有5 個基本進程他們是
DBWR(數(shù)據(jù)文件寫入進程)
LGWR(日志文件寫入進程)
SMON(系統(tǒng)監(jiān)護進程)
PMON(用戶進程監(jiān)護進程)
CKPT(檢查點進程,同步數(shù)據(jù)文件, 日志文件,控制文件)
b、DBWR
將修改過的數(shù)據(jù)緩沖區(qū)的數(shù)據(jù)寫入對應數(shù)據(jù)文件
維護系統(tǒng)內(nèi)的空緩沖區(qū)
這里指出幾個容易錯誤的概念:
·當一個更新提交后,DBWR把數(shù)據(jù)寫到磁盤并返回給用戶提交完成.
·DBWR會觸發(fā)CKPT 后臺進程
·DBWR不會觸發(fā)LGWR 進程
上面的概念都是錯誤的.
DBWR是一個很底層的工作進程,他批量的把緩沖區(qū)的數(shù)據(jù)寫入磁盤。和任何前臺用戶的進程幾乎沒有什么關系,也不受他們的控制。至于DBWR會不會觸發(fā)LGWR和CKPT進程。
DBWR工作的主要條件如下
·DBWR 超時
·系統(tǒng)中沒有多的空緩沖區(qū)用來存放數(shù)據(jù)
·CKPT 進程觸發(fā)DBWR 等
c、LGWR
將重做日志緩沖區(qū)的數(shù)據(jù)寫入重做日志文件,LGWR是一個必須和前臺用戶進程通信的進程。當數(shù)據(jù)被修改的時候,系統(tǒng)會產(chǎn)生一個重做日志并記錄在重做日志緩沖區(qū)內(nèi)。這個重做日志可以類似的認為是以下的一個結構:
SCN=000000001000
數(shù)據(jù)塊ID
對象ID=0801
數(shù)據(jù)行=02
修改后的數(shù)據(jù)=0011
提交的時候,LGWR必須將被修改的數(shù)據(jù)的重做日志緩沖區(qū)內(nèi)數(shù)據(jù)寫入日志數(shù)據(jù)文件,然后再通知前臺進程提交成功,并由前臺進程通知用戶。從這點可以看出LGWR承擔了維護系統(tǒng)數(shù)據(jù)完整性的任務。
LGWR 工作的主要條件如下
·用戶提交
·有1/3 重做日志緩沖區(qū)未被寫入磁盤
·有大于1M 重做日志緩沖區(qū)未被寫入磁盤
·超時
·DBWR需要寫入的數(shù)據(jù)的SCN號大于LGWR 記錄的SCN號,DBWR 觸發(fā)LGWR寫入
d、SMON
工作主要包含
·清除臨時空間
·在系統(tǒng)啟動時,完成系統(tǒng)實例恢復
·聚結空閑空間
·從不可用的文件中恢復事務的活動
·OPS中失敗節(jié)點的實例恢復
·清除OBJ$表
·縮減回滾段
·使回滾段脫機
e、PMON
主要用于清除失效的用戶進程,釋放用戶進程所用的資源。如PMON將回滾未提交的工作,釋放鎖,釋放分配給失敗進程的SGA資源。
f、CKPT
同步數(shù)據(jù)文件,日志文件和控制文件,由于DBWR/LGWR的工作原理,造成了數(shù)據(jù)文件,日志文件,控制文件的不一至,這就需要CKPT進程來同步。CKPT會更新數(shù)據(jù)文件/控制文件的頭信息。
CKPT工作的主要條件如下
·在日志切換的時候
·數(shù)據(jù)庫用immediate ,transaction , normal 選項shutdown 數(shù)據(jù)庫的時候
·根據(jù)初始話文件LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_IO_TARGET 的設置的數(shù)值來確定
·用戶觸發(fā)
以下進程的啟動需要手工配置
g、ARCH
當數(shù)據(jù)庫以歸檔方式運行的時候,Oracle會啟動ARCH進程,當重做日志文件被寫滿時,日志文件進行切換,舊的重做日志文件就被ARCH進程復制到一個/多個特定的目錄/遠程機器。這些被復制的重做日志文件被叫做歸檔日志文件。
h、RECO
負責解決分布事物中的故障。Oracle可以連接遠程的多個數(shù)據(jù)庫,當由于網(wǎng)絡問題,有些事物處于懸而未決的狀態(tài)。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 語句傳遞給服務進程
5、一個貫穿數(shù)據(jù)庫全局的概念----系統(tǒng)改變號SCN(System Change Number)
系統(tǒng)改變號,一個由系統(tǒng)內(nèi)部維護的序列號。當系統(tǒng)需要更新的時候自動增加,他是系統(tǒng)中維持數(shù)據(jù)的一致性和順序恢復的重要標志。
a. 查詢語句不會使SCN增加,就算是同時發(fā)生的更新,數(shù)據(jù)庫內(nèi)部對應的SCN也是不同的。這樣一來就保證了數(shù)據(jù)恢復時候的順序。
b. 維持數(shù)據(jù)的一致性
限于篇幅,請讀者續(xù)看數(shù)據(jù)庫恢復之ORACLE體系結構(二)的內(nèi)容。