版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Oracle程序員面試分類模擬40簡答題1.
函數(shù)SUBSTR和INSTR有什么區(qū)別?正確答案:SUBSTR和INSTR都是字符函數(shù),SUBSTR是截取子串,而INSTR的作用是獲取指定字符的位置(江南博哥)。
(1)SUBSTR:截取子串
下標從1開始,這個函數(shù)有三個參數(shù),第一個參數(shù)為目標字符串,第二個參數(shù)是將要輸出的子串的起點,第三個參數(shù)是將要輸出的子串的長度,如果沒有第三個參數(shù),那么余下的字符全部輸出。如果第二個參數(shù)為負數(shù),那么將會從目標字符串的尾部開始向前定位至負數(shù)的絕對值的位置。
(2)INSTR:相當于STRING類中的INDEXOF,求索引
如果需要知道在一個字符串中滿足特定的內(nèi)容的子串位置,那么可以使用INSTR,它的第一個參數(shù)是目標字符串,第二個參數(shù)是匹配的內(nèi)容,第三和第四個參數(shù)是數(shù)字,用以指定開始搜索的起點以及指出第幾個滿足條件的將會被返回。默認第三個與第四個參數(shù)的數(shù)值均為1,如果第三個數(shù)值為負數(shù),那么將會從后向前搜索。如果未匹配到,那么返回0。需要注意的是,無論是從前向后還是從后向前搜索,返回的數(shù)值都是從左到右的數(shù)值。
(3)INSTR的特殊用法下面的2條SQL語句的功能是一樣的:
其結(jié)果為:
(4)SUBSTR和INSTR的聯(lián)合使用
SUBSTR和INSTR這2個函數(shù)常常關(guān)聯(lián)使用,但是如果INSTR匹配不到字符串的話,那么返回的就是0,這樣SUBSTR得到的值就是空值,所以,這個時候就應(yīng)該進行轉(zhuǎn)換,使用DECODE或其他函數(shù)來轉(zhuǎn)化。下面給出一個例子:
2.
Oracle常用替換函數(shù)有哪兩個?正確答案:Oracle常用替換函數(shù)有兩個,分別是REPLACE和TRANSLATE函數(shù)。REPLACE與TRANSLATE都是替代函數(shù),只不過REPLACE針對的是字符串,而TRANSLATE針對的是單個字符,下面分別講解這兩個函數(shù)的用法。
(1)REPLACE函數(shù)該函數(shù)需要三個參數(shù),第一個參數(shù)是需要搜索的字符串,第二個參數(shù)是搜索的內(nèi)容,第三個參數(shù)則是需要替換成的字符串,如果第三個參數(shù)省略,那么默認為空,如果第二個參數(shù)是NULL,那么將只執(zhí)行搜索操作而不會替換任何內(nèi)容。示例如下:
(2)TRANSLATE函數(shù)語法:TRANSLATE(CHAR,F(xiàn)ROM,TO)。
用法:
1)返回將出現(xiàn)在FROM中的每個字符替換為TO中的相應(yīng)字符以后的字符串。
2)如果FROM比TO字符串長,那么在FROM中比TO中多出的字符將會被刪除,或者認為FROM中多出的字符在TO中與空對應(yīng)。
3)三個參數(shù)中有一個是空,返回值也將是空值。
簡單說來,就是將FROM中的字符轉(zhuǎn)換為TO中與之位置對應(yīng)的字符,若TO中找不到與之對應(yīng)的字符,則返回值中的該字符將會被刪除。示例如下:
分析:該語句要將'abcdefga'中的'abc'轉(zhuǎn)換為'wo',由于'abc'中'a'對應(yīng)'wo'中的'w',故將'abcdefga'中的'a'全部轉(zhuǎn)換成'w';而'abc'中'b'對應(yīng)'wo'中的'o',故將'abcdefga'中的'b'全部轉(zhuǎn)換成'o';'abc'中的'c'在'wo'中沒有與之對應(yīng)的字符,故將'abcdefga'中的'c'全部刪除。
3.
說說曾經(jīng)優(yōu)化過的一條SQL語句正確答案:當面試官問到這類問題時,讀者可以根據(jù)自己的經(jīng)驗談?wù)勈亲约菏侨绾蝺?yōu)化曾經(jīng)碰到的SQL語句的即可,下面作者給出一類自己曾遇到過很多次的SQL優(yōu)化的案例。
在SQL優(yōu)化中,有一個很重要的原則就是減少對大表的查詢次數(shù),尤其是要避免在同一個SQL中多次掃描同一張大表,若有這種情況可以考慮SQL改寫,下面給出幾種常見的改寫方式:
先根據(jù)條件提取數(shù)據(jù)到臨時表中,然后再做連接,即利用WITH語句來改寫SQL。
1)有的相似的語句可以用MAX+DECODE函數(shù)來處理。
2)有子查詢的SQL應(yīng)該避免子查詢掃描同一張表。
4.
什么是塊改變跟蹤?正確答案:執(zhí)行增量備份是為了只備份自上一次備份以來更改過的數(shù)據(jù)塊。使用RMAN可創(chuàng)建數(shù)據(jù)文件、表空間或整體數(shù)據(jù)庫的增量備份。在執(zhí)行增量備份時,RMAN將掃描數(shù)據(jù)文件的每個塊以確定自上次備份以來哪些塊發(fā)生過更改。這會減小備份大小,因為只備份更改過的塊。此外,由于減少了需要還原的塊數(shù),因此還會加快恢復(fù)速度。
塊改變跟蹤(BlockChangeTracking)是在使用RMAN執(zhí)行增量備份的情況下,若啟用塊改變跟蹤,則會把自上次備份以來所有塊的改變記錄到文件中,這個文件稱為跟蹤文件,通過后臺進程CTWR(ChangeTrackingWriterProcess)對其進行實時地寫入。這樣在做增量備份時就可以避免掃描所有數(shù)據(jù)文件中的所有塊,而改為參考跟蹤文件,直接訪問需要備份的塊,會大大縮短RMAN備份的時間,從而提高RMAN備份的性能。當然0級備份時還是需要掃描所有的數(shù)據(jù)文件,畢竟需要創(chuàng)建一個基準,以此來判斷哪些塊發(fā)生了改變。因此,通過啟用塊更改跟蹤,可執(zhí)行快速增量備份。
跟蹤文件的維護是完全自動進行的,不需要用戶的干預(yù)。塊改變跟蹤默認是禁用的,如果配置了增量備份,那么建議開啟塊改變跟蹤。數(shù)據(jù)庫在OPEN或者MOUNT狀態(tài)都可以啟用塊改變跟蹤。可以使用如下命令開啟塊改變跟蹤:
如果是RAC環(huán)境,那么跟蹤文件必須放在共享設(shè)備上。如果設(shè)置DB_CREATE_FILE_DEST參數(shù)值,那么可以直接啟用:
若想禁用塊改變跟蹤,則可以使用如下命令:
在V$BLOCK_CHANGE_TRACKING視圖的輸出中會顯示塊更改跟蹤文件的位置、塊更改跟蹤的狀態(tài)(ENABLED/DISABLED)和文件大小(字節(jié)),可以使用如下命令查看是否啟用了塊改變跟蹤:
對V$BACKUP_DATAFILE視圖進行查詢,可顯示塊改變跟蹤功能對最大限度減少增量備份I/O的作用(PCT_READ_FOR_BACKUP列)。若該值比較高時表示RMAN在增量備份期間從數(shù)據(jù)文件中讀取的塊非常多,這時,通過減少增量備份之間的時間間隔可降低這個值。
5.
如何查找最近1min內(nèi),最消耗CPU的SQL語句及會話信息?正確答案:最消耗CPU的SQL語句可以根據(jù)V$ACTIVE_SESSION_HISTORY視圖來獲取,取“SESSION_STATE='ONCPU'”,若查詢最消耗I/O的SQL語句則可以取“WAIT_CLASS='USERI/O'”。
6.
給出下面語句的幾種可能的優(yōu)化思路。
正確答案:優(yōu)化思路有:①采用綁定變量;②使用靜態(tài)SQL:③采用批量提交或循環(huán)外提交;④根據(jù)功能,可以去掉PL/SQL塊,采用直接一次性插入的方式來完成,SQL為“INSERTINTOT_YH_20170705_LHRSELECTROWNUMFROMDUALCONNECTBYLEVEL<=100000;”;⑤采用直接路徑方式,例如,“CREATETABLET_YH_20170705_YH_LHRASSELECTROWNUMXFROMDUALCONNECTBYLEVEL<=100000;”;⑥采用NOLOGGING和PARALLEL的方式,例如,“CREATETABLET_YH_20170705_LHRNOLOGGINGPARALLEL8ASSELECTROWNUMXFROMDUALCONNECTBYLEVEL<=100000;”。
7.
你們公司的數(shù)據(jù)庫有多大?大一點的表有多大?有多少行?正確答案:對于數(shù)據(jù)庫的大小,需要注意的問題是數(shù)據(jù)庫的大小不能以表空間的分配大小而論,而應(yīng)該以表空間的占用空間大小而論,并且需要減掉SYSTEM、SYSAUX、TEMP和Undo這些表空間占用的空間。因為有的系統(tǒng)Undo空間可能分配得很大,比如500G,所以,計算數(shù)據(jù)庫大小的時候應(yīng)該排除這些表空間。
首先查詢表空間的大小,若有如下的結(jié)果:
可以說數(shù)據(jù)庫大約有2205-751-629-14-2=809M,而并非是2.2G。
至于大一點的表有多大?有多少行?這個問題考查DBA對自己所建立的庫的熟悉程度,通過下面的SQL語句可以查詢一個表的大小。
可以看到最大的表是LKILL用戶下的T_KILL表,大約7G,約有4400W條的數(shù)據(jù)量,讀者應(yīng)該以自己實際管理的庫為準。
8.
哪個系統(tǒng)環(huán)境變量對于運行OUI非常重要?正確答案:OUI(OracleUniversalInstaller)是基于Java的圖形用戶界面應(yīng)用程序。運行前可以設(shè)置DISPLAY參數(shù),設(shè)置命令如下:
9.
什么是Quote(q)語法?正確答案:在SQL查詢中,會經(jīng)常需要原樣輸出字符串,如果字符串中含有大量的單引號、雙引號或者特殊字符,那么需要用單引號轉(zhuǎn)義拼接字符串,這樣會非常的麻煩。所以,Oracle提供了一個Q-quote的表達式來原樣輸出字符串。
需要注意以下幾點:
1)Q-quote定界符可以是除了TAB、空格、回車外的任何單字節(jié)或多字節(jié)字符,包括數(shù)字、字母、特殊字符。但'&'不能作為分隔符,因為'&'意思是傳入?yún)?shù)。
2)Q'后跟起始分隔符,起始分隔符后的字符串原樣輸出,起始分隔符必須有配對的結(jié)束分隔符。'['、'('、'{'作為分隔符,必須以']'、')'、'}'結(jié)束。
10.
主庫丟失歸檔,物理DG如何恢復(fù)?正確答案:面試DBA崗位,面試官對于DG環(huán)境常常會問到,若是主庫丟失了歸檔文件,而這些歸檔文件還未來得及傳遞到備庫,則物理備庫是否只能通過重建的方式來恢復(fù)呢?這道面試題是作者親身經(jīng)歷,當時以為只能重建備庫,但最后經(jīng)過查找文檔找到了解決辦法,可以通過對主庫進行基于SCN的增量備份來恢復(fù)物理DG。
全過程簡單有如下幾個步驟:
第一步,主庫創(chuàng)建基于SCN的增量備份:
首先要知道誤刪除或者丟失的歸檔日志是從哪個SCN開始的。視圖V$ARCHIVED_LOG的FIRST_CHANGE#列能夠查到歸檔日志對應(yīng)的起始SCN。可以使用如下SQL查詢最小的SCN:
若最小的SCN為750983,則在主庫上使用BACKUP...INCREMENTALFROMSCN為主庫做一個增量備份,這個操作會將整個庫中SCN大于750983的BLOCK全部備份出來,SQL程序如下:
第二步,將備份的文件復(fù)制到備庫端的空目錄下。
第三步,恢復(fù)備庫的控制文件:
RMAN恢復(fù),恢復(fù)之前將原來的控制文件進行手工的冷備份:
第四步,在備庫執(zhí)行RECOVER操作:
下面開啟備庫的實時應(yīng)用進程:
若需要恢復(fù)的文件比較多,則可以使用視圖V$SESSION_LONGOPS來查詢恢復(fù)的進度。
11.
啟動和關(guān)閉集群的命令是什么?正確答案:關(guān)閉集群命令:crsctlstopcluster-all。
啟動集群命令:crsctlstartcluster-all。
高可用性進程查看命令:ps-ef|repd.bin。
12.
與ASM相關(guān)的有哪些進程?正確答案:ASM實例除了傳統(tǒng)的DBWn、LGWR、CKPT、SMON和PMON等進程還包含幾個新后臺進程,見下表。
新后臺進程
13.
V$SESSION_LONGOPS視圖的作用是什么?正確答案:在Oracle11g之前的版本,長時間運行的SQL可以通過監(jiān)控V$SESSION_LONGOPS來觀察,當某個操作執(zhí)行時間超過6s時,就會被記錄在V$SESSION_LONGOPS中,通常可以監(jiān)控到全表掃描、全索引掃描、哈希連接、并行查詢等操作。
14.
假定SERV表有A、B、C三個字段:SERV(ANUMBER(10),BNUMBER(10),CNUMBER(10))。表SERV的內(nèi)容如下:ABC110702305011080
以下兩段PL/SQL的功能是根據(jù)A列的值,查找出對應(yīng)B列的值賦予變量X,請分別判斷這兩段PL/SQL是否能正常執(zhí)行,若不能正常執(zhí)行,請指出錯誤的原因并修改。
(1)
(2)
正確答案:這兩段程序除了WHERE語句后的值不同以外,其他均一樣。對于程序(1),當A=1時,返回了2行記錄,對于程序(2),當A=2時,返回了1行記錄。對于變量X而言,只能接受一個值,所以,程序2執(zhí)行不報錯,程序(1)執(zhí)行報錯:ORA-01422:exactfetchreturnsmorethanrequestednumberofrows。
對于程序(1)有兩種修改方法,第一種就是將“SELECTBINTOXFROMSERVWHEREA=1;”修改為“SELECTDISTINCTBINTOXFROMSERVWHEREA=1;”。第二種方法就是返回集合類型,修改后的程序塊如下:
15.
如何獲取ADDM報告?正確答案:有兩種辦法可以獲取ADDM報告:
1)采用addmrpt.sql腳本。運行腳本:@?/rdbms/admin/addmrpt.sql。
2)采用DBMS_ADVISOR包:
若普通用戶使用DBMSADVISOR包獲取ADDM報告,則必須使用SYS給這個普通用戶賦予如下權(quán)限:
16.
動態(tài)注冊和靜態(tài)注冊有什么區(qū)別?正確答案:Oracle的注冊就是將數(shù)據(jù)庫作為一個服務(wù)注冊到監(jiān)聽程序,而客戶端不需要知道數(shù)據(jù)庫名和實例名,只需要知道該數(shù)據(jù)庫對外提供的服務(wù)名就可以申請連接到數(shù)據(jù)庫。這個服務(wù)名可能與實例名一樣,也有可能不一樣。在數(shù)據(jù)庫服務(wù)器啟動過程中,數(shù)據(jù)庫服務(wù)器會向監(jiān)聽程序注冊相應(yīng)的服務(wù),根據(jù)注冊方式的不同,目前Oracle支持動態(tài)注冊和靜態(tài)注冊這兩種注冊方式。
動態(tài)注冊是實例啟動的時候PMON進程根據(jù)參數(shù)文件中的NSTANCE_NAME,SERVICE_NAMES兩個參數(shù)將實例和服務(wù)動態(tài)注冊到LISTENER中。動態(tài)注冊默認只注冊到默認的監(jiān)聽器上(名稱為LISTENER、端口為1521),如果要向非默認監(jiān)聽注冊,那么需要配置LOCAL_LISTENER參數(shù)。需要注意的是,動態(tài)注冊默認端口在數(shù)據(jù)庫啟動后大約1min之后才可以查詢(lsnrctstatus),但可以在數(shù)據(jù)庫中使用SQL語句“ALTERSYSTEMREGISTER;”立即注冊數(shù)據(jù)庫。
有兩種使用LOCAL_LISTENER的方式,下面分別介紹。
第一種方式,在Oracle用戶下的$ORACLE_HOME/network/admin/tnsnames.ora文件中配置監(jiān)聽器的名稱,然后配置LOCAL_LISTENER參數(shù)的值,如下:
然后以SYS用戶運行:
第二種方式,直接配置LOCAL_LISTENER參數(shù)的值,如下:
需要注意的是,若LOCAL_LISTENER設(shè)置為空,則下一次數(shù)據(jù)庫啟動的時候會自動配置該參數(shù)的值。
靜態(tài)注冊就是在監(jiān)聽啟動的時候,不管實例啟動了沒有,實例的名字都已經(jīng)注冊到監(jiān)聽中了,主要用于DBA遠程啟動數(shù)據(jù)庫實例。靜態(tài)注冊主要在$ORACLE_HOME/network/admin/listener.ora文件中配置,靜態(tài)注冊的示例如下:
那么,如何查詢某服務(wù)是靜態(tài)注冊還是動態(tài)注冊昵?
可以使用命令lsnrctlstatus來查看某服務(wù)是靜態(tài)注冊還是動態(tài)注冊。實例狀態(tài)為UNKNOWN時表明此服務(wù)是靜態(tài)注冊。這時監(jiān)聽器用來表明它不知道關(guān)于該實例的任何信息,只有當客戶發(fā)出連接請求時,它才檢查該實例是否存在。動態(tài)注冊的數(shù)據(jù)庫通過狀態(tài)信息中的狀態(tài)READY或狀態(tài)BLOCKED(動態(tài)監(jiān)聽在NOMOUNT狀態(tài)下為BLOCKED)來指明。不管何時關(guān)閉數(shù)據(jù)庫,動態(tài)注冊的數(shù)據(jù)庫都會動態(tài)地從監(jiān)聽器注銷,而與之相關(guān)的信息將從狀態(tài)列表中消失。所以,不管數(shù)據(jù)庫是在運行還是已經(jīng)關(guān)閉,監(jiān)聽器總是知道它的狀態(tài)。該信息將被用于連接請求的回退和負載平衡。
17.
RAC節(jié)點被踢出可能有哪些原因?正確答案:可能的原因包括服務(wù)器負載嚴重或內(nèi)核HANG住、網(wǎng)絡(luò)心跳丟失、磁盤心跳丟失、CSSD進程HANG住。
18.
如何將一個IP地址分解為4個字段?正確答案:使用Oracle的正則表達式函數(shù)REGEXP_SUBSTR,如下:
19.
實例恢復(fù)和介質(zhì)恢復(fù)的區(qū)別是什么?正確答案:Redo日志是Oracle為確保已經(jīng)提交的事務(wù)不會丟失而建立的一種機制。實際上,Redo日志的存在是為兩種場景準備的,一種稱之為實例恢復(fù)(InstanceRecovery),一種稱之為介質(zhì)恢復(fù)(MediaRecovery)。
Redo日志的數(shù)據(jù)是按照THREAD來組織的,對于單實例系統(tǒng)來說,只有一個THREAD,對于RAC系統(tǒng)來說,可能存在多個THREAD,每個數(shù)據(jù)庫實例擁有一組獨立的Redo日志文件,擁有獨立的LogBuffer,某個實例的變化會被獨立記錄到一個THREAD的Redo日志文件中。
(1)介質(zhì)恢復(fù)介質(zhì)恢復(fù)是基于物理備份恢復(fù)數(shù)據(jù),它是Oracle數(shù)據(jù)庫出現(xiàn)介質(zhì)故障時恢復(fù)的重要保障。介質(zhì)恢復(fù)包括塊恢復(fù)、數(shù)據(jù)文件恢復(fù)、表空間恢復(fù)和整個數(shù)據(jù)庫的恢復(fù)。介質(zhì)恢復(fù)主要是針對錯誤類型中的介質(zhì)失敗,如果是少量的塊失敗,那么可以使用介質(zhì)恢復(fù)中的塊恢復(fù)來快速修復(fù);但如果是其他情況的丟失,那么需要根據(jù)具體情況,可使用數(shù)據(jù)文件恢復(fù)、表空間恢復(fù)甚至全庫恢復(fù),可以參考下表。
數(shù)據(jù)庫恢復(fù)解決方案
Oracle數(shù)據(jù)庫的介質(zhì)恢復(fù)實際上包含了兩個過程:數(shù)據(jù)庫還原(RESTORE)與數(shù)據(jù)庫恢復(fù)(RECOVER),如下:
1)數(shù)據(jù)庫還原(RESTORE)是指利用備份的數(shù)據(jù)庫文件來替換已經(jīng)損壞的數(shù)據(jù)庫文件或者將其恢復(fù)到一個新的位置。RMAN在進行還原操作時,會利用恢復(fù)目錄(有建立恢復(fù)目錄的話就使用目標數(shù)據(jù)庫的控制文件)來獲取備份信息,并從中選擇最合適的備份進行修復(fù)操作。當選擇備份時,有以下兩個原則:①選擇距離恢復(fù)目錄時刻最近的備份;②優(yōu)先選擇鏡像復(fù)制,其次才是備份集。
2)數(shù)據(jù)庫恢復(fù)(RECOVER)是指數(shù)據(jù)文件的介質(zhì)恢復(fù),即為修復(fù)后的數(shù)據(jù)文件應(yīng)用聯(lián)機或歸檔日志,從而將修復(fù)的數(shù)據(jù)庫文件更新到當前時刻或指定時刻下的狀態(tài)。在執(zhí)行恢復(fù)數(shù)據(jù)庫時,需要使用RECOVER命令。
還原是將某個時間點的數(shù)據(jù)文件的副本再復(fù)制回去,還原后的數(shù)據(jù)庫處于不一致的狀態(tài),或不是最新的狀態(tài),還需要執(zhí)行恢復(fù)操作?;謴?fù)就是使用歸檔日志文件和聯(lián)機Redo日志文件將不一致的數(shù)據(jù)庫應(yīng)用到一致性狀態(tài)。需要注意的是,還原只是建立在數(shù)據(jù)庫備份的基礎(chǔ)版本上,例如,如果數(shù)據(jù)庫備份包括0級備份和很多1級備份,還原只是應(yīng)用0級備份,恢復(fù)過程會根據(jù)情況自動應(yīng)用1級備份或Redo日志將數(shù)據(jù)庫恢復(fù)到一致性的狀態(tài)。
數(shù)據(jù)庫的恢復(fù)過程根據(jù)恢復(fù)數(shù)據(jù)的程度又分為完全恢復(fù)(CompleteRecovery)和不完全恢復(fù)(IncompleteRecovery),如下圖所示。
完全恢復(fù)和不完全恢復(fù)
1)完全恢復(fù)是一種沒有數(shù)據(jù)丟失的恢復(fù)方式,能夠恢復(fù)到最新的聯(lián)機Redo日志中已提交的數(shù)據(jù)。在傳統(tǒng)恢復(fù)方式中,因介質(zhì)失敗破壞了數(shù)據(jù)文件之后,可以在數(shù)據(jù)庫、表空間和數(shù)據(jù)文件上執(zhí)行完全介質(zhì)恢復(fù)。
2)不完全恢復(fù)是一種與完全恢復(fù)相反的恢復(fù)方式,是一種丟失數(shù)據(jù)的恢復(fù)方式,也稱為數(shù)據(jù)庫基于時間點恢復(fù)(Point-in-TimeRecovery),是將整個數(shù)據(jù)庫恢復(fù)到之前的某個時間點、日志序列號或者SCN號。通常情況下,若FLASHBACKDATABASE沒有啟用或者變得無效,則可以執(zhí)行不完全恢復(fù)撤銷一個用戶錯誤。不完全恢復(fù)不一定在原有的數(shù)據(jù)庫環(huán)境執(zhí)行,可以在測試環(huán)境下執(zhí)行不完全恢復(fù),將找回的數(shù)據(jù)再重新導(dǎo)入生產(chǎn)庫中。不完全恢復(fù)根據(jù)備份情況恢復(fù)到與指定時間、日志序列號和SCN具有一致性的數(shù)據(jù),之后的數(shù)據(jù)都將丟失。執(zhí)行不完全恢復(fù)一方面可能是因為歸檔日志、聯(lián)機日志的丟失,另一方面可能是因為在某個時刻錯誤地操作了數(shù)據(jù),過了一段時間之后才發(fā)現(xiàn)問題,而其他的恢復(fù)手段都無法恢復(fù)數(shù)據(jù),這時也不得不使用不完全恢復(fù)來找回數(shù)據(jù)。執(zhí)行不完全恢復(fù)必須從備份中還原所有的數(shù)據(jù)文件,備份文件必須是要恢復(fù)的時間點之前創(chuàng)建的。當恢復(fù)完成后,使用RESTLOGS選項打開數(shù)據(jù)庫,將重新初始化聯(lián)機Redo日志,創(chuàng)建一個新的日志序列號流,日志序列號從1開始,RESETLOGS之后的SCN還是在遞增。
如果是完全恢復(fù),那么數(shù)據(jù)庫就是最新的一致性狀態(tài);如果是不完全恢復(fù),那么數(shù)據(jù)庫就是非最新的一致性狀態(tài)。對于非歸檔模式的數(shù)據(jù)庫來說,不能執(zhí)行不完全恢復(fù)。不完全恢復(fù)意味著會缺失一些事務(wù)處理;即恢復(fù)目標時間和當前時間之間所做的所有數(shù)據(jù)修改都會丟失。在很多情況下,這正是想要的結(jié)果,因為可能需要撤消對數(shù)據(jù)庫進行的一些更改。恢復(fù)到過去的某一時間點是刪除誤更改的一種方法。
不完全恢復(fù)的選項見下表。
不完全恢復(fù)的選項
不完全恢復(fù)的幾種類型見下表。
不完全恢復(fù)的幾種類型
綜上所述,恢復(fù)的分類如下圖所示。
恢復(fù)的分類
(2)實例恢復(fù)實例恢復(fù)可確保數(shù)據(jù)庫在一個實例失敗后仍能回到一致性的狀態(tài)。Redo日志記錄了對實例的所有更改。單實例數(shù)據(jù)庫擁有一個重做線程,而一個RAC數(shù)據(jù)庫擁有多個重做線程,且RAC數(shù)據(jù)庫的每個實例擁有一個重做線程。當事務(wù)提交時,LGWR將內(nèi)存中的重做條目和事務(wù)SCN同時寫入聯(lián)機Redo日志。但是,DBWn進程只在最有利的時機將已修改的數(shù)據(jù)塊寫入數(shù)據(jù)文件。所以,未提交的更改可能會暫時存在于數(shù)據(jù)文件中,而已提交的更改也可能還不在數(shù)據(jù)文件中。
當數(shù)據(jù)庫突然崩潰,而還沒有來得及將BufferCache里的臟塊刷新到數(shù)據(jù)文件里,同時在實例文件崩潰時正在運行著的事務(wù)被突然中斷,則事務(wù)為中間狀態(tài),也就是既沒有提交也沒有回滾。這時數(shù)據(jù)文件里的內(nèi)容不能體現(xiàn)實例崩潰時的狀態(tài)。這樣關(guān)閉的數(shù)據(jù)庫是不一致的。當下次啟動實例時,Oracle會由SMON進程自動進行實例恢復(fù)。實例啟動時,SMON進程會去檢查控制文件中所記錄的、每個在線的、可讀寫的數(shù)據(jù)文件的EndSCN號。在數(shù)據(jù)庫正常運行過程中,該EndSCN號始終為NULL,而當數(shù)據(jù)庫正常關(guān)閉時,會進行完全檢查,并用檢查點SCN號更新該字段,所以可以通過EndSCN號是否為NULL來判斷是不是需要實例恢復(fù)。在數(shù)據(jù)庫實例崩潰時,Oracle還來不及更新該字段,則該字段仍然為NULL。當數(shù)據(jù)庫再次啟動時,SMON進程發(fā)現(xiàn)該字段為空時,就知道實例在上次沒有正常關(guān)閉,于是由SMON進程就開始進行實例恢復(fù)了。
對于單實例的數(shù)據(jù)庫而言,實例恢復(fù)一般是在數(shù)據(jù)庫實例異常故障后、數(shù)據(jù)庫重啟時進行,當數(shù)據(jù)庫執(zhí)行了SHUTDOWNABORT或者由于操作系統(tǒng)、主機等原因“宕機”重啟后,在執(zhí)行ALTERDATABASEOPEN的時候,就會自動做實例恢復(fù)。在RAC環(huán)境中,如果某個實例“宕機”了,那么剩下的實例將會代替損壞的實例做實例恢復(fù)。除非是所有的實例都“宕機”了,這樣的話,第一個執(zhí)行ALTERDATABASEOPEN的實例將會做實例恢復(fù)。這也是在RAC環(huán)境中,Redo日志是實例私有的組件,但是Redo日志的文件必須存放在共享存儲上的原因。
實例恢復(fù)使用檢查點來確定必須將哪些更改應(yīng)用到數(shù)據(jù)文件。檢查點位置始終保證所有比其SCN低的檢查點所對應(yīng)的已提交更改都已保存到數(shù)據(jù)文件。
在實例恢復(fù)期間,數(shù)據(jù)庫必須應(yīng)用檢查點位置和重做線程結(jié)尾之間發(fā)生的更改。如下圖所示,某些更改可能已經(jīng)寫入數(shù)據(jù)文件。但是,只有其SCN低于檢查點位置的更改,才保證已被寫到了磁盤上。
應(yīng)用檢查點位置和重做線程結(jié)尾之間發(fā)生的更改
在實例發(fā)生異常終止的情況下,數(shù)據(jù)庫處于以下的狀態(tài):
1)事務(wù)提交的數(shù)據(jù)塊只寫入聯(lián)機Redo日志中,沒有更新到數(shù)據(jù)文件(那么未寫入數(shù)據(jù)文件的更新必須重新寫入數(shù)據(jù)文件)。
2)由于DBWn進程是異步向磁盤寫入數(shù)據(jù)的,所以,數(shù)據(jù)文件中可能包含沒有被提交但已經(jīng)寫入數(shù)據(jù)文件的改變,這些改變必須回滾到之前的狀態(tài),以確保數(shù)據(jù)的一致性。
實例恢復(fù)利用聯(lián)機Redo日志文件解決第一個問題,利用Undo數(shù)據(jù)同步數(shù)據(jù)文件解決第二個問題,從而確保數(shù)據(jù)庫數(shù)據(jù)的一致性。因此,實例恢復(fù)過程會經(jīng)歷兩個階段:前滾(RollingForward)和回滾(RollingBack),如下圖所示。
實例恢復(fù)過程
1)實例恢復(fù)的第一階段稱為前滾(RollingForward)或者緩存恢復(fù)(CacheRecovery)。前滾會將數(shù)據(jù)文件還原到實例出現(xiàn)錯誤之前所處的狀態(tài)。SMON進程在進行實例恢復(fù)時,會從控制文件中獲得檢查點位置(CheckpointPosition,即檢查點隊列頭),然后SMON進程到聯(lián)機Redo日志文件中找到該檢查點位置,再從該檢查點位置開始往下應(yīng)用所有的Redo日志條目,從而在BufferCache里又恢復(fù)了實例崩潰那個時間點的狀態(tài)。這個過程稱為前滾。因為回滾數(shù)據(jù)記錄在聯(lián)機Redo日志中,所以,前滾也會重新生成相應(yīng)的Undo段。前滾完成之后就可以確保聯(lián)機Redo日志中所有已提交的事務(wù)操作的數(shù)據(jù)寫回到數(shù)據(jù)文件中。但是,這些數(shù)據(jù)文件可能還包含未提交的更改,要么是在實例失敗前保存到數(shù)據(jù)文件中的,或者是在前滾過程中引入的。如果正在執(zhí)行的檢查點還未完全執(zhí)行完畢時發(fā)生實例失敗,前滾過程可能需要通過多個聯(lián)機Redo日志文件才能使數(shù)據(jù)恢復(fù)到之前時間的狀態(tài)。
2)實例恢復(fù)的第二階段稱為回滾(RollingBack)或者事務(wù)恢復(fù)(TransactionRecovery)。前滾之后,任何未提交的更改必須被撤銷。Oracle數(shù)據(jù)庫使用檢查點位置,保證每個低于其SCN的已提交更改都已保存到磁盤。Oracle數(shù)據(jù)庫應(yīng)用Undo塊,以回滾數(shù)據(jù)塊中在實例失敗前寫入的或前滾過程中引入的未提交更改。這一階段稱為回滾或事務(wù)恢復(fù)。在前滾完畢以后,BufferCache里既有崩潰時已經(jīng)提交還沒有寫入數(shù)據(jù)文件的臟塊,還有事務(wù)被突然終止,而導(dǎo)致的既沒有提交又沒有回滾的事務(wù)的臟塊。前滾一旦完畢,SMON進程立即打開數(shù)據(jù)庫。但是,這時的數(shù)據(jù)庫中還含有那些中間狀態(tài)的、既沒有提交又沒有回滾的臟塊,這種臟塊是不能存在于數(shù)據(jù)庫中的,因為它們并沒有被提交,必須被回滾。在打開數(shù)據(jù)庫以后,SMON進程會在后臺進行回滾。有時,新事務(wù)可以自己回滾個別塊以獲取所需的數(shù)據(jù),而不必等待SMON進程來回滾這些已終止的事務(wù)。在數(shù)據(jù)庫打開以后,SMON進程還沒來得及回滾這些中間狀態(tài)的數(shù)據(jù)塊時,就有用戶進程發(fā)出讀取這些數(shù)據(jù)塊的請求。這時,服務(wù)器進程將會把這些塊返回給用戶之前,由服務(wù)器進程負責進行回滾,回滾完畢后,將數(shù)據(jù)塊的內(nèi)容返回給用戶。Oracle數(shù)據(jù)庫應(yīng)用Undo塊回滾在數(shù)據(jù)塊中未提交的改變,這些數(shù)據(jù)塊是在實例失
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 安全生產(chǎn)清潔制度
- 安全生產(chǎn)體系管理制度
- 成品生產(chǎn)管理制度
- 鍍膜開機生產(chǎn)規(guī)章制度
- 圖書生產(chǎn)制度
- 安全生產(chǎn)周報告制度
- 生產(chǎn)車間安全責任制度
- 生產(chǎn)衛(wèi)生安全管理制度
- 生產(chǎn)加工過程記錄制度
- 采石礦山安全生產(chǎn)制度
- 個人經(jīng)濟糾紛起訴狀6篇
- 口腔修復(fù)學:全口義齒課件
- 膜式壁制造及檢驗工藝演示文稿
- 紅壤區(qū)貧瘠農(nóng)田土壤快速培肥技術(shù)規(guī)程
- 證券市場基礎(chǔ)知識講義全
- 宣城硅鑫新材料有限公司年產(chǎn)1.17萬噸特種硅油系列產(chǎn)品項目環(huán)境影響報告書
- 心肺復(fù)蘇操作考核評分表 (詳)
- 公園建設(shè)項目環(huán)境影響報告書
- 員工就業(yè)規(guī)則
- SS3和SS4簡明電路圖教案
- 路面施工風險告知書
評論
0/150
提交評論