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