Oracle程序員面試分類模擬25_第1頁
Oracle程序員面試分類模擬25_第2頁
Oracle程序員面試分類模擬25_第3頁
Oracle程序員面試分類模擬25_第4頁
Oracle程序員面試分類模擬25_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

Oracle程序員面試分類模擬25簡答題1.

RMAN、NBU備份分別是什么?正確答案:(1)RMAN為了更好地實現(xiàn)數(shù)據(jù)庫的備份和恢復(fù)工作,Oracle提供了恢復(fù)管理器(RecoveryMan(江南博哥)ager,簡寫為RMAN)。RMAN是一個可以用來備份、恢復(fù)和還原數(shù)據(jù)庫的應(yīng)用程序,是隨Oracle服務(wù)器軟件一同安裝的Oracle工具軟件,通過執(zhí)行相應(yīng)的RMAN命令可以實現(xiàn)備份和恢復(fù)操作。RMAN可以用來備份和恢復(fù)數(shù)據(jù)庫文件、歸檔日志、控制文件和系統(tǒng)參數(shù)文件,也可以用來執(zhí)行完全或不完全的數(shù)據(jù)庫恢復(fù)。

在Oracle數(shù)據(jù)庫中,通過RMAN工具,可以將數(shù)據(jù)備份到磁盤或磁帶上。在需要時,可以通過RMAN工具將備份的文件進行恢復(fù)。使用RMAN可以減少DBA在對數(shù)據(jù)庫進行備份與恢復(fù)時產(chǎn)生的錯誤,提高備份與恢復(fù)的效率。在默認(rèn)情況下,標(biāo)準(zhǔn)版和企業(yè)版的Oracle都會安裝RMAN程序。

RMAN有三種不同的用戶接口:COMMANDLINE方式、GUI方式(集成在OEM中的備份管理器)和API方式(用于集成到第三方的備份軟件中)。

RMAN具有如下特點:

1)功能類似物理備份,但比物理備份強大很多。

2)可以把備份打包成備份集,也可以按固定大小分割備份集。

3)備份與恢復(fù)的過程可以自動管理。

4)可以使用腳本(存在RecoveryCatalog中)。

5)RMAN會檢測和報告損壞的數(shù)據(jù)塊。

6)可以跳過未使用的數(shù)據(jù)塊。

在執(zhí)行RMAN備份時,RMAN不會備份從未被寫入的數(shù)據(jù)塊。而傳統(tǒng)的備份方法無法知道已經(jīng)使用了哪些數(shù)據(jù)塊。

7)備份壓縮,也可以壓縮空塊。RMAN使用一種Oracle特有的二進制壓縮模式來節(jié)省備份設(shè)備上的空間。盡管傳統(tǒng)的備份方法也可以使用操作系統(tǒng)的壓縮技術(shù),但RMAN使用的壓縮算法是定制的,能夠最大程度地壓縮數(shù)據(jù)塊中一些典型的數(shù)據(jù)。

8)執(zhí)行增量備份,可以在塊級別上實現(xiàn)增量。如果不使用增量備份,那么每次RMAN都備份已使用塊;如果使用增量備份,那么每次RMAN都備份上次備份以來變化的數(shù)據(jù)塊,這樣可以節(jié)省大量的磁盤空間、I/O時間、CPU時間和備份時間。

9)塊級別的恢復(fù)??梢灾贿€原或修復(fù)標(biāo)識為損壞的少量數(shù)據(jù)塊。在RMAN修復(fù)損壞的數(shù)據(jù)塊時,表空間的其他部分以及表空間中的對象仍可以聯(lián)機。

10)在備份時不需要將表空間置于熱備份模式。

11)可以使用RMAN來測試備份而不需要實際還原它們。

RMAN可以用來備份:①數(shù)據(jù)庫:包括數(shù)據(jù)文件、控制文件、SPFILE(ServerParameterFile)文件;②表空間;③歸檔文件;④備份集。

RMAN不能用來備份:①聯(lián)機日志文件(OnlineRedoLogs);②非READ/WRITE狀態(tài)的可傳輸表空間;③PFILE(ParameterFile)文件。

(2)NBUNBU(NetBackup)是VERITAS公司提供的企業(yè)級備份管理軟件,它支持多種操作系統(tǒng),包括UNIX、Windows、OS/2(OperatingSystem/2)以及Mac等。目前,NBU是國際上使用最廣的備份管理軟件。

NBU采用全圖形的管理方式,同時提供命令行接口,適應(yīng)不同的用戶需求。它提供了眾多的性能調(diào)整功能,從管理角度看,其高性能特征十分明顯。如提供多作業(yè)共享磁帶機、大作業(yè)并行數(shù)據(jù)流備份、完善的監(jiān)控報警、動態(tài)備份速度調(diào)整等能力,為用戶的集中式存儲管理提供了靈活和卓有成效的手段。

NBU還能與BMR(BootMasterRecord,主引導(dǎo)記錄)集成在一起為用戶提供關(guān)鍵業(yè)務(wù)系統(tǒng)的智能災(zāi)難恢復(fù),即無需安裝系統(tǒng),只需執(zhí)行一條命令就能達到全自動系統(tǒng)恢復(fù),整個過程也無需人工干預(yù),是個簡單易行的“傻瓜”過程。NBU簡化了用戶的恢復(fù)操作,盡快將應(yīng)用投入使用,大大減少了用戶因停機帶來的巨大損失。

通過管理界面,管理員可以設(shè)置網(wǎng)絡(luò)自動備份策略,這些備份可以是完全備份,也可以是增量備份。管理員也可以手動備份客戶端數(shù)據(jù)??蛻舳擞脩艨梢詮目蛻舳藗浞?、恢復(fù)和歸檔自己的數(shù)據(jù)。同時,NBU還可以管理存儲設(shè)備。

2.

物理備份和邏輯備份分別是什么?正確答案:物理備份是指將數(shù)據(jù)庫的所有物理文件完整復(fù)制到備份位置的一個過程。物理備份是所有物理文件的一個副本,例如,數(shù)據(jù)文件、控制文件、歸檔日志等。該副本能被存儲在本地磁盤或磁帶。物理備份是備份或恢復(fù)的基礎(chǔ),包括冷備份(非歸檔模式)和熱備份(歸檔模式)。物理備份既可以在數(shù)據(jù)庫打開的狀態(tài)下進行也可在數(shù)據(jù)庫關(guān)閉的狀態(tài)下進行,但是邏輯備份和恢復(fù)則只能在數(shù)據(jù)庫打開的狀態(tài)下進行。

邏輯備份是指使用工具exp或expdp將數(shù)據(jù)庫對象的結(jié)構(gòu)和數(shù)據(jù)導(dǎo)出到二進制文件的過程。當(dāng)數(shù)據(jù)庫對象被誤操作而損壞后,就可以使用工具imp或impdp利用備份的文件把數(shù)據(jù)對象導(dǎo)入到數(shù)據(jù)庫中進行恢復(fù)。邏輯備份是對物理備份的方式的一種補充,多用于數(shù)據(jù)遷移。數(shù)據(jù)庫備份分類如下圖所示

數(shù)據(jù)庫備份分類

下面以數(shù)據(jù)庫工具數(shù)據(jù)泵expdp/impdp為例說明,給出數(shù)據(jù)泵的一些常用語法命令:

(1)導(dǎo)出數(shù)據(jù)

1)按用戶導(dǎo)出:

2)并行進程PARALLEL:

3)按表名導(dǎo)出:

4)按查詢條件導(dǎo)出:

5)按表空間導(dǎo)出:

6)導(dǎo)出整個數(shù)據(jù)庫:

(2)導(dǎo)入數(shù)據(jù)

1)導(dǎo)入指定用戶下:

2)改變表的OWNER:

3)導(dǎo)入表空間:

4)導(dǎo)入數(shù)據(jù)庫:

5)追加數(shù)據(jù):

3.

在開發(fā)或維護過程中誤操作TRUNCATE(清空)了一張表,如何恢復(fù)?正確答案:這個時候應(yīng)該由簡到難地回答,可以按照如下的步驟進行回答:

1)是否有測試庫,測試的表數(shù)據(jù)和當(dāng)前數(shù)據(jù)是否一致,若一致,則可以考慮從測試庫把表數(shù)據(jù)導(dǎo)入到被刪除的庫中。

2)是否有exp或expdp邏輯備份,若有,則可以導(dǎo)入到被刪除的庫中。

3)是否有RMAN備份,若有,則可以將數(shù)據(jù)恢復(fù)到其他地方,然后將數(shù)據(jù)庫exp出來,最后導(dǎo)入到被刪除的庫中。

4)數(shù)據(jù)庫是否開啟了閃回,如果開了閃回則可以利用閃回數(shù)據(jù)庫的特性找回數(shù)據(jù)。

5)利用TSPITR,表空間基于時間點的恢復(fù)技術(shù)來恢復(fù)。

6)是否有歸檔,若有則可以采用LogMiner進行日志挖掘。

7)若以上這些辦法都不能恢復(fù),則可以嘗試無備份情況下的恢復(fù),這里推薦兩種辦法,fy_recover_data包和gdul工具,關(guān)于這兩種工具的具體使用案例可以參考作者的博客。

4.

Oracle的SCN是什么?正確答案:SCN(SystemChangeNumber,系統(tǒng)改變號)是一個由系統(tǒng)內(nèi)部維護的序列號,SCN在數(shù)據(jù)庫全局是唯一的。當(dāng)系統(tǒng)需要更新的時候自動增加,它是系統(tǒng)中維持?jǐn)?shù)據(jù)的一致性和順序恢復(fù)的重要標(biāo)志,是數(shù)據(jù)庫中非常重要的一種數(shù)據(jù)結(jié)構(gòu)。在數(shù)據(jù)庫中,SCN作為一種時鐘機制來標(biāo)記數(shù)據(jù)庫動作,比如,當(dāng)事務(wù)發(fā)生時,數(shù)據(jù)庫會用一個SCN來標(biāo)記它。

在數(shù)據(jù)庫中,SCN可以說是無處不在,例如數(shù)據(jù)文件頭、控制文件、數(shù)據(jù)塊頭、日志文件等都標(biāo)記著SCN。也正因為如此,數(shù)據(jù)庫的一致性維護和SCN密切相關(guān)。不管是數(shù)據(jù)的備份還是恢復(fù)都離不開SCN。由于SCN描述的是數(shù)據(jù)一致性的狀態(tài),所以,它會在各種涉及數(shù)據(jù)一致性的場合中起到重要作用。

(1)SCN的分類不管什么時候,SCN所指代的都是數(shù)據(jù)庫的某個一致性的狀態(tài)。SCN按照其代表的意義不同可以分為4類,系統(tǒng)檢查點SCN(SystemCheckpointSCN)、文件檢查點SCN(DatafileCheckpointSCN)、開始SCN(StartSCN)和結(jié)束SCN(StopSCN),參考下表。

SCN的分類

(2)如何查看系統(tǒng)當(dāng)前SCNOracle數(shù)據(jù)庫提供了兩種直接查看系統(tǒng)當(dāng)前SCN的方法,一個是通過查詢V$DATABASE中的CURRENT_SCN列,另外一個就是通過DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER得到,如下:

一般情況下,SCN1列和SCN2列的結(jié)果一致,但在系統(tǒng)比較繁忙的時候,可能SCN2比SCN1稍微大一點。

(3)SCN與時間的相互轉(zhuǎn)換一個SCN值總是發(fā)生在某一個特定的時刻,只不過由于粒度的不一樣,通常會存在多個SCN對應(yīng)同一個時間戳的情況。Oracle10g提供了兩個新函數(shù)用于SCN和時間戳進行相互轉(zhuǎn)換,這兩個函數(shù)分別是SCN_TO_TIMESTAMP和TIMESTAMP_TO_SCN,通過對SCN和時間戳進行轉(zhuǎn)換,極大地方便了Oracle的很多備份和恢復(fù)過程:

1)SCN_TO_TIMESTAMP(scnnumber):將SCN轉(zhuǎn)換成時間戳。

2)TIMESTAMP_TO_SCN(timestamp):將時間戳轉(zhuǎn)換成SCN。

通過以上這兩個函數(shù),最終Oracle將SCN和時間的關(guān)系建立起來,在Oracle10g之前,是沒有辦法通過函數(shù)轉(zhuǎn)換得到SCN和時間的對應(yīng)關(guān)系的,一般可以通過LogMiner分析日志獲得。但是這兩種函數(shù)轉(zhuǎn)換要依賴于數(shù)據(jù)庫內(nèi)部表SMON_SCN_TIME,對于久遠的SCN則不能轉(zhuǎn)換。

5.

實例恢復(fù)和介質(zhì)恢復(fù)的區(qū)別是什么?正確答案:Redo日志是Oracle為確保已經(jīng)提交的事務(wù)不會丟失而建立的一種機制。實際上,Redo日志的存在是為兩種場景準(zhǔn)備的,一種稱之為實例恢復(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ù)目錄的話就使用目標(biāo)數(shù)據(jù)庫的控制文件)來獲取備份信息,并從中選擇最合適的備份進行修復(fù)操作。當(dāng)選擇備份時,有以下兩個原則:①選擇距離恢復(fù)目錄時刻最近的備份;②優(yōu)先選擇鏡像復(fù)制,其次才是備份集。

2)數(shù)據(jù)庫恢復(fù)(RECOVER)是指數(shù)據(jù)文件的介質(zhì)恢復(fù),即為修復(fù)后的數(shù)據(jù)文件應(yīng)用聯(lián)機或歸檔日志,從而將修復(fù)的數(shù)據(jù)庫文件更新到當(dāng)前時刻或指定時刻下的狀態(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)建的。當(dā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ù)目標(biāo)時間和當(dāng)前時間之間所做的所有數(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ù)庫的每個實例擁有一個重做線程。當(dāng)事務(wù)提交時,LGWR將內(nèi)存中的重做條目和事務(wù)SCN同時寫入聯(lián)機Redo日志。但是,DBWn進程只在最有利的時機將已修改的數(shù)據(jù)塊寫入數(shù)據(jù)文件。所以,未提交的更改可能會暫時存在于數(shù)據(jù)文件中,而已提交的更改也可能還不在數(shù)據(jù)文件中。

當(dāng)數(shù)據(jù)庫突然崩潰,而還沒有來得及將BufferCache里的臟塊刷新到數(shù)據(jù)文件里,同時在實例文件崩潰時正在運行著的事務(wù)被突然中斷,則事務(wù)為中間狀態(tài),也就是既沒有提交也沒有回滾。這時數(shù)據(jù)文件里的內(nèi)容不能體現(xiàn)實例崩潰時的狀態(tài)。這樣關(guān)閉的數(shù)據(jù)庫是不一致的。當(dāng)下次啟動實例時,Oracle會由SMON進程自動進行實例恢復(fù)。實例啟動時,SMON進程會去檢查控制文件中所記錄的、每個在線的、可讀寫的數(shù)據(jù)文件的EndSCN號。在數(shù)據(jù)庫正常運行過程中,該EndSCN號始終為NULL,而當(dāng)數(shù)據(jù)庫正常關(guān)閉時,會進行完全檢查,并用檢查點SCN號更新該字段,所以可以通過EndSCN號是否為NULL來判斷是不是需要實例恢復(fù)。在數(shù)據(jù)庫實例崩潰時,Oracle還來不及更新該字段,則該字段仍然為NULL。當(dāng)數(shù)據(jù)庫再次啟動時,SMON進程發(fā)現(xiàn)該字段為空時,就知道實例在上次沒有正常關(guān)閉,于是由SMON進程就開始進行實例恢復(fù)了。

對于單實例的數(shù)據(jù)庫而言,實例恢復(fù)一般是在數(shù)據(jù)庫實例異常故障后、數(shù)據(jù)庫重啟時進行,當(dāng)數(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ù)器進程負(fù)責(zé)進行回滾,回滾完畢后,將數(shù)據(jù)塊的內(nèi)容返回給用戶。Oracle數(shù)據(jù)庫應(yīng)用Undo塊回滾在數(shù)據(jù)塊中未提交的改變,這些數(shù)據(jù)塊是在實例失敗之前或者前滾期間被寫入的?;貪L會將已執(zhí)行但尚未提交的更改返回到初始狀態(tài)?;貪L完成之后,整個實例恢復(fù)才算完成,而Redo和Undo的丟失或者損壞都可能導(dǎo)致實例恢復(fù)失敗。Oracle數(shù)據(jù)庫可以根據(jù)需要同時回滾多個事務(wù)。

總結(jié)一下,前滾和回滾是Oracle數(shù)據(jù)庫實例發(fā)生意外崩潰,重新啟動的時候,由SMON進行的自動恢復(fù)的過程。所謂的前滾是應(yīng)用Redo來恢復(fù)BufferCache的數(shù)據(jù),將BufferCache恢復(fù)到Crash之前狀態(tài),所以此時BufferCache中既有崩潰時已經(jīng)提交但還沒有寫入數(shù)據(jù)文件的臟塊,還有事務(wù)被突然終止而導(dǎo)致的既沒有提交又沒有回滾的事務(wù)的臟塊(也就是沒有COMMIT,但是DBWn已經(jīng)將改變的數(shù)據(jù)刷新到底層磁盤)。前滾完成之后就可以確保聯(lián)機Redo日志中所有已提交的事務(wù)操作的數(shù)據(jù)寫回到數(shù)據(jù)文件中。接下來,前滾之后,任何未提交的更改必須被撤銷,而回滾是在數(shù)據(jù)庫做完前滾操作后并打開數(shù)據(jù)庫的情況下完成的,SMON會利用Undo信息將未提交的事務(wù)全部進行I司滾。具體來說,SMON進程在完成前滾后,查看Undo段頭(Undo段的第1個數(shù)據(jù)塊)記錄的事務(wù)表(每個事務(wù)在使用Undo塊時,首先要在該Undo塊所在的Undo段頭記錄一個條目,該條目里記錄了該事務(wù)相關(guān)的信息,其中包括是否提交等),將其中既沒有提交也沒有回滾,而是在實例崩潰時被異常終止的事務(wù)全部回滾。

那么,為什么數(shù)據(jù)庫的實例恢復(fù)是先前滾再回滾呢?回滾段實際上也是以回滾表空間的形式存在的,既然是表空間,那么肯定就有對應(yīng)的數(shù)據(jù)文件,同時在BufFerCache中就會存在映像塊,這一點和其他表空間的數(shù)據(jù)文件相同。當(dāng)發(fā)生DML操作時,既要生成Redo(針對DML操作本身的RedoEntry)也要生成Undo(用于回滾該DML操作,記錄在Undo表空間中),但是既然Undo信息是使用回滾表空間來存放的,那么該DML操作對應(yīng)的Undo信息(在BufferCache生成對應(yīng)中的UndoBlock)就會首先生成其對應(yīng)的Redo信息(UndoBlock'sRedoEntry)并寫入LogBuffer中。這樣做的原因是因為BufferCache中的有關(guān)Undo表空間的塊也可能因為數(shù)據(jù)庫故障而丟失,為了保障在下一次啟動時能夠順利進行回滾,首先就必須使用Redo日志來恢復(fù)Undo段(實際上是先回復(fù)BufferCache中的臟數(shù)據(jù)塊,然后由Checkpoint寫入Undo段中),在數(shù)據(jù)庫OPEN以后再使用Undo信息來進行回滾,達到一致性的目的,生成完UndoBlock'sRedoEntry后才輪到該DML語句對應(yīng)的RedoEntry,最后再修改BufferCache中的BLOCK,該BLOCK同時變?yōu)榕K數(shù)據(jù)塊。實際上,簡單點說Redo的作用就是記錄所有的數(shù)據(jù)庫更改,包括Undo表空間在內(nèi)。

最后,有關(guān)實例恢復(fù)和介質(zhì)恢復(fù)的區(qū)別見下表。

實例恢復(fù)和介質(zhì)恢復(fù)的區(qū)別

6.

DELETE了一條數(shù)據(jù)并且提交了,該如何找回?正確答案:在Oracle中可以通過閃回技術(shù)來找回已經(jīng)刪除并且提交了的數(shù)據(jù)。當(dāng)然,除了閃回技術(shù)外還可以采用LogMiner(使用該工具可以輕松獲得Redo日志文件包含歸檔日志文件中的具體內(nèi)容)進行日志挖掘,找出其撤銷SQL并執(zhí)行就可以找回DELETE語句刪除的數(shù)據(jù)。

7.

如果執(zhí)行了rm-rf操作刪除了所有的基于FS的數(shù)據(jù)文件,但是數(shù)據(jù)庫還處于OPEN狀態(tài),那么,在這種情況下如何快速地恢復(fù)數(shù)據(jù)庫呢?正確答案:這里的前提條件是沒有任何可用的RMAN備份、數(shù)據(jù)庫冷備份等,也就是說,沒有任何備份。在這種情況下可以通過系統(tǒng)的文件句柄號來恢復(fù)數(shù)據(jù)文件。整個恢復(fù)過程可以簡單分為如下幾步:

(1)找到被刪除文件的文件句柄所在的目錄首先通過命令“ps-ef|grepora_lgwr”找到LGWR的進程號。假設(shè)這里的進程號為31863,則被刪除的文件句柄在/proc/31863/fd目錄下。

(2)采用操作系統(tǒng)cp命令復(fù)制文件句柄到原數(shù)據(jù)庫文件路徑假設(shè)這里看到的是如下的情況,被刪除的文件末尾一般都有deleted標(biāo)識。

執(zhí)行cp命令,復(fù)制數(shù)據(jù)文件到原路徑:

需要注意的是,最好使用Oracle用戶去執(zhí)行cp命令。如果使用root用戶執(zhí)行cp命令的話,那么Oracle進程是沒有權(quán)限操作的。當(dāng)然也可以在使用root用戶復(fù)制完數(shù)據(jù)文件后,再執(zhí)行賦權(quán)操作,命令如下:

但是一定要注意,必須要等全部數(shù)據(jù)文件恢復(fù)后才可以執(zhí)行chown操作。因為一旦執(zhí)行了該操作,原來的ora進程就會停止,那么就不能恢復(fù)所有的數(shù)據(jù)文件了。

(3)其他檢查工作,例如數(shù)據(jù)檢查、備份等最后需要特別注意的是,當(dāng)執(zhí)行操作系統(tǒng)命令rm的時候,切記不可隨意加-rf參數(shù),就算一定要用,也要再三確定后才能執(zhí)行,否則對于數(shù)據(jù)庫而言,可以說是災(zāi)難性的。由于rm操作是在數(shù)據(jù)庫OPEN狀態(tài)下直接進行了破壞性操作,對于RedoBuffer還來不及寫入聯(lián)機Redo日志文件的那部分操作,肯定是會丟失的。因為通過文件句柄號恢復(fù)出來的日志文件中,并不一定包含數(shù)據(jù)庫的最新變更。即便如此,本小節(jié)對于rm-rf誤操作的恢復(fù),還是有一定意義的,至少可以在沒有任何備份的情況下,多了一項保障來拯救數(shù)據(jù)庫。最后再次強調(diào)一下,執(zhí)行rm-rf后,千萬不要著急地關(guān)閉數(shù)據(jù)庫重啟,否則在沒有任何備份的情況下基本上是很難恢復(fù)數(shù)據(jù)文件的。

8.

在丟失歸檔的情況下如何進行數(shù)據(jù)文件的恢復(fù)正確答案:如果一個表空問的數(shù)據(jù)文件損壞,在有備份的情況下,那么可以使用數(shù)據(jù)文件的備份進行還原,但是還需要歸檔文件進行恢復(fù),才能使數(shù)據(jù)文件到達一個最新的一致性狀態(tài),從而才能打開數(shù)據(jù)庫。如果需要的歸檔文件無法提供,比如被刪除了,那么在這種情況下如何打開數(shù)據(jù)庫呢?

在這種情況下由于缺少歸檔,數(shù)據(jù)庫無法恢復(fù),但是如果與該表空問相關(guān)的數(shù)據(jù)改變很少或者基本沒有改變的情況下可以通過改變數(shù)據(jù)文件頭的SCN號,讓其和SystemCheckpointSCN和DatafileCheckpointSCN號一致,就可以讓Oracle避開對該文件的檢查,Oracle就不會去做介質(zhì)恢復(fù),而只做實例恢復(fù),這樣就可以實現(xiàn)完全恢復(fù),及時打開數(shù)據(jù)庫。

一般來說,推進數(shù)據(jù)文件頭的SCN號有兩種處理辦法:第一,利用BBED(BlockBrowerandEditor)修改數(shù)據(jù)文件頭,推進SCN號來打開數(shù)據(jù)庫。第二,設(shè)置隱含參數(shù)“_ALLOW_RESETLOGS_CORRUPTION”為TRUE來打開數(shù)據(jù)庫,該參數(shù)默認(rèn)為FALSE,待數(shù)據(jù)庫打開后,要將該參數(shù)從參數(shù)文件中去掉,命令如下:

9.

數(shù)據(jù)文件OFFLINE之后必須要做的一件事是什么?正確答案:數(shù)據(jù)文件OFFLNE之后必須要做的一件事就是立刻執(zhí)行一次RECOVER操作,這樣在無論過了多久之后,在ONLINE該數(shù)據(jù)文件的時候就不需要執(zhí)行RECOVER操作了。

10.

差異增量備份和累積增量備份的區(qū)別是什么?正確答案:數(shù)據(jù)庫備份可以分為完全備份和增量備份。完全數(shù)據(jù)文件備份是包含文件中所有已用數(shù)據(jù)塊的備份。RMAN將所有塊復(fù)制到備份集或映像副本中,僅跳過從未使用的數(shù)據(jù)文件塊。完全映像副本可準(zhǔn)確地再現(xiàn)整個文件的內(nèi)容。完全備份不能成為增量備份策略的一部分;它也不能作為后續(xù)增量備份的基礎(chǔ)。

增量備份就是將那些與前一次備份相比發(fā)生變化的數(shù)據(jù)塊復(fù)制到備份集中。通過RMAN可以為單獨的數(shù)據(jù)文件、表空間或者整個數(shù)據(jù)庫進行增量備份。增量備份是0級備份,其中包含數(shù)據(jù)文件中除從未使用的塊之外的所有塊;或者是1級備份,其中僅包含自上次備份以來更改過的那些塊。0級增量備份在物理上與完全備份完全一樣。唯一區(qū)別是0級備份可用作1級備份的基礎(chǔ),但完全備份不可用作1級備份的基礎(chǔ)。要使用增量備份,必須先執(zhí)行0級增量備份。

通過BACKUP命令中的INCREMENTAL關(guān)鍵字可指定增量備份,可以指定INCREMENTALLEVEL[0|1]。在RMAN中建立的增量備份可以具有不同的級別,每個級別都使用一個不小于0的整數(shù)來標(biāo)識,也就是在BACKUP命令中使用LEVEL關(guān)鍵字指定的,例如LEVEL=0表示備份級別為0,LEVEL=1表示備份級別為1。每次進行增量備份僅操作那些發(fā)生了“變化”的數(shù)據(jù)塊。RMAN中增量備份有兩種:差異增量備份(DIFFERENTIAL)和累計增量備份(CUMULATIVE),它們的區(qū)別見下表。

差異增量備份和累積增量備份的區(qū)別

差異增量備份和累計增量備份如下圖所示。

差異增量備份和累計增量備份

1)執(zhí)行0級增量備份的命令為:RMAN>BACKUPINCREMENTALLEVEL0DATABASE;。

2)執(zhí)行差異增量備份的命令為:RMAN>BACKUPINCREMENTALLEVEL1DATABASE;。

3)執(zhí)行累積增量備份的命令為:RMAN>BACKUPINCREMENTALLEVEL1CUMULATIVEDATABASE;。

可以對處于NOARCHIVELOG模式的數(shù)據(jù)庫執(zhí)行任何類型的備份(完全或增量)。當(dāng)然,前提條件是數(shù)據(jù)庫處于未打開狀態(tài)。需要注意的是,數(shù)據(jù)庫只能恢復(fù)到上次備份時的狀態(tài)。只有當(dāng)數(shù)據(jù)庫處于ARCHIVELOG模式時,才可以將其恢復(fù)到上次提交事務(wù)處理時的狀態(tài)。

11.

什么是塊改變跟蹤?正確答案:執(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備份的性能。當(dāng)然0級備份時還是需要掃描所有的數(shù)據(jù)文件,畢竟需要創(chuàng)建一個基準(zhǔn),以此來判斷哪些塊發(fā)生了改變。因此,通過啟用塊更改跟蹤,可執(zhí)行快速增量備份。

跟蹤文件的維護是完全自動進行的,不需要用戶的干預(yù)。塊改變跟蹤默認(rèn)是禁用的,如果配置了增量備份,那么建議開啟塊改變跟蹤。數(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ù)文件中讀取的塊非常多,這時,通過減少增量備份之間的時間間隔可降低這個值。

12.

RMAN中關(guān)于備份或歸檔文件狀態(tài)OBSOLETE和EXPIRED的區(qū)別是什么?正確答案:OBSOLETE:是指根據(jù)保留策略來確定該備份是否在恢復(fù)的時候需要。若不再需要或有更新的備份來替代,則該備份集被置為OBSOLETE,即廢棄的備份集或鏡像副本。OBSOLETE可以理解為過期的備份集。

EXPIRED:是指執(zhí)行CROSSCHECK時,根據(jù)恢復(fù)目錄或控制文件中記錄的備份信息來定位備份集或鏡像副本,若找不到對應(yīng)的文件,則這些文件的狀態(tài)被置為EXPIRED。EXPIRED可以理解為失效的備份集,即物理文件丟失。

如果在備份過程中,歸檔文件被手動通過rm命令刪除,那么會報錯:RMAN-06059。解決辦法就是在RMAN中校驗歸檔文件后再刪除失效的歸檔文件,如下:

13.

如何處理Oracle中的壞塊?正確答案:(1)壞塊的簡介Oracle數(shù)據(jù)文件的壞塊可以分為物理壞塊和邏輯壞塊。物理壞塊指的是塊格式本身已經(jīng)損壞,塊內(nèi)的數(shù)據(jù)沒有任何意義。邏輯壞塊指的是塊內(nèi)的數(shù)據(jù)在邏輯上存在問題,比如說索引塊的索引值沒有按順序排列導(dǎo)致的邏輯壞塊。物理壞塊一般是由于內(nèi)存問題、OS問題、I/O子系統(tǒng)問題或硬件引起的,邏輯壞塊一般是由Oracle系統(tǒng)Bug等原因引起的。

壞塊通常是通過Oracle的ORA-01578錯誤報告出來的,詳細的損壞描述會在告警日志中打印出來,“oerrora”對該錯誤的解釋如下:

可能的報錯如下:

那么何時進行數(shù)據(jù)塊的一致性檢查呢?當(dāng)一個數(shù)據(jù)塊被讀或?qū)懙臅r候,將對塊進行一致性檢查,檢查的內(nèi)容包括塊的版本、塊在BlockBuffer中的數(shù)據(jù)塊地址,然后根據(jù)要求進行校驗(checksum)。

塊的一致性檢查由DB_BLOCK_CHECKSUM和DB_BLOCK_CHECKING兩個初始化參數(shù)控制。DB_BLOCK_CHECKSUM是一種物理檢查,只有在寫入(DBWn常規(guī)寫或用戶進程直接路徑寫入)數(shù)據(jù)文件時,根據(jù)一個CHECKSUM算法計算數(shù)據(jù)塊的校驗和,然后寫入數(shù)據(jù)塊的一個特定位置,在讀取塊時再進行檢驗,主要是為了防止I/O硬件和I/O子系統(tǒng)的錯誤。DB_BLOCK_CHECKrNG參數(shù)主要用于數(shù)據(jù)塊的邏輯一致性檢查,但只是在塊內(nèi),不包括塊間的邏輯檢查,用于防止在內(nèi)存中損壞或數(shù)據(jù)損壞。

(2)壞塊的檢測方法壞塊的檢測方法見下表。

壞塊的檢測方法

(3)BMR恢復(fù)壞塊如果數(shù)據(jù)庫只有很少的數(shù)據(jù)塊被破壞,那么使用塊介質(zhì)恢復(fù)(BlockMediaRecovery,BMR)是較好的塊恢復(fù)方法。BMR只能用于恢復(fù)物理損壞(PhysicalCorruptions),在數(shù)據(jù)文件聯(lián)機時即可恢復(fù)相關(guān)壞塊。BMR主要使用BLOCKRECOVER命令進行恢復(fù)壞塊,該命令有以下三種使用方式:

1)使用“BLOCKRECOVERCORRUPTIONLIST;”命令恢復(fù)在V$DATABASE_BLOCK_CORRUPTION視圖中報告的所有塊。

2)使用“BLOCKRECOVERDATAFILE1BLOCKIO;”命令恢復(fù)單個塊,需要指定文件號和塊號。

3)使用“BLOCKRECOVERTABLESPACETS_USERDBAXXX;”命令恢復(fù)某個表空間的壞塊,需要指定表空間和數(shù)據(jù)塊地址。

下面給出幾個恢復(fù)示例:

1)恢復(fù)3個數(shù)據(jù)文件的損壞塊:

2)從數(shù)據(jù)文件復(fù)制中恢復(fù)一系列塊:

3)從指定的TAG備份中恢復(fù)塊:

4)從用于恢復(fù)數(shù)據(jù)到兩天以前的備份中還原、恢復(fù)SYSTEM表空間中的兩個塊:

5)運行備份驗證數(shù)據(jù)庫,修復(fù)在V$DATABASE_BLOCK_CORRUPTION中記錄的所有損壞塊:

(4)如何確定壞塊的對象名根據(jù)絕對文件號和塊號確定數(shù)據(jù)塊對象的SQL語句如下:

如下的SQL可以確定段占用的數(shù)據(jù)塊:

關(guān)于壞塊需要注意以下幾點:

1)對于受損的數(shù)據(jù)塊,僅壞塊上的數(shù)據(jù)無法被查詢或讀取,其余正常塊的數(shù)據(jù)依舊可以使用。

2)對于受損的表對象進行聚合等相關(guān)運算時會收到錯誤提示,因為壞塊上的數(shù)據(jù)無法被統(tǒng)計。

3)可以基于RMAN的備份文件實現(xiàn)塊介質(zhì)恢復(fù),其數(shù)據(jù)文件無需OFFLINE,成本損失最小,影響最小。

4)對于多個數(shù)據(jù)塊的損壞,先執(zhí)行BACKUPVALIDATE校驗數(shù)據(jù)庫或相應(yīng)的數(shù)據(jù)文件以便標(biāo)記受損的壞塊后,填充V$DATABASE_BLOCK_CORRUPTION后再使用命令“BLOCKRECOVERCORRUPTIONLIST;”一次性恢復(fù)所有的壞塊。

5)在默認(rèn)情況下,存在壞塊的數(shù)據(jù)文件無法成功備份,也會導(dǎo)致自動備份腳本失敗。

14.

LogMiner是什么?其有哪些用途?請簡述LogMiner的使用過程。正確答案:眾所周知,所有對用戶數(shù)據(jù)和數(shù)據(jù)字典的改變都記錄在Oracle的Redo日志中,因此,Redo日志包含了所有進行恢復(fù)操作所需要的信息。但是,原始的Redo日志文件無法看懂,所以,Oracle從8i版本以后提供了一個非常有用的分析工具,稱為LogMiner。使用該工具可以輕松獲得Redo日志文件(包含歸檔日志文件)中的具體內(nèi)容。特別是該工具可以分析出所有對于數(shù)據(jù)庫的DML操作(INSERT、UPDATE、DELETE等)語句。Oracle9i版本后可以分析DDL語句,另外還可分析得到一些必要的回滾SQL語句。LogMiner一個最重要的用途就是不用全部恢復(fù)數(shù)據(jù)庫就可以恢復(fù)數(shù)據(jù)庫的某個變化。該工具特別適用于調(diào)試、審計或者回退某個特定的事務(wù)。

LogMiner工具既可以用來分析在線日志,也可以用來分析離線日志文件,既可以分析本身自己數(shù)據(jù)庫的重作日志文件,也可以用來分析其他數(shù)據(jù)庫的重做日志文件。當(dāng)分析其他數(shù)據(jù)庫的重做日志文件時,需要注意的是,LogMiner必須使用被分析數(shù)據(jù)庫實例產(chǎn)生的字典文件,而不是安裝LogMiner的數(shù)據(jù)庫產(chǎn)生的字典文件,另外,必須保證安裝LogMiner數(shù)據(jù)庫的字符集和被分析數(shù)據(jù)庫的字符集相同。源數(shù)據(jù)庫(SourceDatabase)平臺必須和分析數(shù)據(jù)庫(MiningDatabase)平臺一樣。

Oracle通過LogMiner工具對Redo日志進行挖掘,顯示出一系列可讀的信息,該過程稱為日志挖掘。LogMiner通過V$LOGMNR_CONTENTS視圖顯示Redo日志中的信息。

總的說來,LogMiner工具的主要用途有:①跟蹤數(shù)據(jù)庫的變化:可以離線地跟蹤數(shù)據(jù)庫的變化,而不會影響在線系統(tǒng)的性能;②回退數(shù)據(jù)庫的變化:回退特定的變化數(shù)據(jù),減少Point-In-TimeRecovery的執(zhí)行;③優(yōu)化和擴容計劃:可通過分析日志文件中的數(shù)據(jù)以分析數(shù)據(jù)的增長模式;④確定數(shù)據(jù)庫的邏輯損壞時間:準(zhǔn)確定位操作執(zhí)行的時間和SCN;⑤確定事務(wù)級要執(zhí)行的精細邏輯恢復(fù)操作,可以取得相應(yīng)的Undo操作;⑥執(zhí)行后續(xù)審計。

(1)安裝LogMiner工具在默認(rèn)情況下,Oracle已經(jīng)安裝了LogMiner工具。若是沒有安裝,則可以運行下面兩個腳本:

這兩個腳本必須均以SYS用戶身份運行。其中第一個腳本用來創(chuàng)建DBMS_LOGMNR包,該包用來分析日志文件。第二個腳本用來創(chuàng)建DBMS_LOGMNR_D包,該包用來創(chuàng)建數(shù)據(jù)字典文件。若要使普通用戶具有日志挖掘的權(quán)限,則可以執(zhí)行如下的SQL進行賦權(quán):

腳本執(zhí)行完畢后,LogMiner包含兩個PL/SQL包和幾個視圖:

1)DBMS_LOGMNR_D包,包括一個用于提取數(shù)據(jù)字典信息的過程,即DBMS_LOGMNR_D.BUILD()過程,還包含一個重建LogMiner表的過程,DBMS_LOGMNR_D.SET_TABLESPACE。在默認(rèn)情況下,LogMiner的表是建在SYSTEM表空間下的。

2)DBMSLOGIMNR包,它有3個存儲過程:

①ADD_LOGFILE(NAMEVARCHAR2,OPTIONSNUMBER)用來添加或刪除用于分析的日志文件。

②START_LOGMNR(START_SCNNUMBER,END_SCNNUMBER,START_TIMENUMBER,END_TIMENUMBER,DICTFILENAMEVARCHAR2,OPTIONSNUMBER)用來開啟日志分析,同時確定分析的時間或SCN窗口以及確認(rèn)是否使用提取出來的數(shù)據(jù)字典信息。

③END_LOGMNR()存儲過程用來終止分析會話,它將回收LogMiner所占用的內(nèi)存。

與LogMiner相關(guān)的數(shù)據(jù)字典視圖:

1)V$LOGHIST:顯示歷史日志文件的一些信息。

2)V$LOGMNR_DICTIONARY:因為LOGMINER可以有多個字典文件,所以該視圖顯示字典文件信息。

3)V$LOGMNR_PARAMETERS:顯示LOGMINER的參數(shù)。

4)V$LOGMNR_LOGS:顯示用于分析的日志列表信息。

5)V$LOGMNR_CONTENTS:LOGMINER結(jié)果。

(2)LogMiner的數(shù)據(jù)字典為了完全地轉(zhuǎn)換Redo日志中的內(nèi)容,LogMiner需要訪問一個數(shù)據(jù)庫字典。LogMiner使用該字典將Oracle內(nèi)部的對象標(biāo)識符和數(shù)據(jù)類型轉(zhuǎn)換為對象名稱和外部的數(shù)據(jù)格式。沒有字典,LogMiner將使用十六進制字符顯示內(nèi)部對象ID。

例如,對于如下的SQL語句:

在沒有數(shù)據(jù)字典的情況下,LogMiner將顯示為:

LogMiner提供了3種提取字典文件的方式:

1)將字典文件提取為一個FlatFile(平面文件或中間接口文件)。

2)將字典文件提取為Redo日志。

3)使用OnlineCatalog(聯(lián)機日志)。

下面分別介紹這3種方式:

1)將字典文件提取為一個FlatFile(平面文件或中間接口文件)。為了將數(shù)據(jù)庫字典信息提取為FlatFile,需要使用帶有STORE_IN_FLAT_FILE參數(shù)的DBMS_LOGMNR_D.BUILD程序。DBMS_LOGMNR_月份D.BUILD程序需要訪問一個能夠放置字典文件的目錄。因為PL/SQL程序通常不能直接訪問用戶目錄,必須手動指定一個由DBMS_LOGMNR_D.BUILD程序使用的目錄。為了指定該目錄,必須修改初始化文件中的UTL_FILE_DIR參數(shù):

然后重新啟動數(shù)據(jù)庫。確保在創(chuàng)建FlatFile文件的過程中,不能有DDL操作被執(zhí)行。在創(chuàng)建FlatFile文件時,數(shù)據(jù)庫必須處于OPEN狀態(tài),然后執(zhí)行DMBS_LOGMNR_D.BUILD程序:

腳本執(zhí)行完成后會在/home/oracle下生成一個dictionary.ora的文本文件。該文件中包含一系列的建表語句和插入語句。

2)將字典文件提取為Redo日志。為了將字典文件提取為Redo日志,數(shù)據(jù)庫必須處于OPEN狀態(tài),并且處于歸檔模式。將字典提取為Redo日志的過程中,數(shù)據(jù)庫系統(tǒng)不能有DDL語句被執(zhí)行。為了將字典提取為Redo日志,需要使用帶有STORE_IN_REDO_FILES參數(shù)的DBMS_LOGMNR_D.BUILD程序:

需要注意的是,將字典文件提取為Redo文件的時候需要開啟附加日志,如下:

在這些Redo日志被歸檔之后,可以通過查詢V$ARCHIVED_LOG視圖來查詢:

如果將字典信息提取為Redo文件,那么在使用DBMD_LOGMNR.ADD_LOGFILE指定所需要分析的日志文件時,需要將這些包含字典信息的Redo文件也添加進去。同時在使用START_LOGMNR開始分析時,需要指定DICT_FROM_REDO_LOGS的參數(shù)。

3)使用OnlineCatalog(聯(lián)機日志)。為了使LogMiner直接使用數(shù)據(jù)庫當(dāng)前使用的字典,在開始LogMiner時可以指定將聯(lián)機目錄作為字典源:

使用聯(lián)機目錄,意味著不需要再提取字典文件,它是開始分析日志的最快的方式。除了可以分析聯(lián)機Redo日志外,還可以在和產(chǎn)生歸檔日志文件相同的系統(tǒng)上分析歸檔日志文件。然而,記住聯(lián)機目錄只能重建應(yīng)用于表的最新版本上的SQL語句。一旦表被修改,聯(lián)機目錄就無法反映出表之前的版本。這就意味著LogMiner不能重建執(zhí)行于表的舊版本上的SQL語句。

(3)跟蹤DDL語句當(dāng)LogMiner被啟動時,它會自動創(chuàng)建自己的內(nèi)部字典。如果源字典是FlatFile字典或Redo日志中的字典,則可以使用DDL_DICT_TRACKING參數(shù)來跟蹤DDL語句。DDL跟蹤默認(rèn)是關(guān)閉的。為了打開這一功能,可以在啟動LogMiner時使用DDL_DICT_TRACKING參數(shù):

當(dāng)使用DDL_DICT_TRACKING時,需要注意如下幾點:

1)當(dāng)使用聯(lián)機目錄(Onlinecatalog)時,也就是當(dāng)使用DICT_FROM_ONLINE_CATALOG參數(shù)時,是不能使用DDL_DICT_TRACKING選項的。

2)使用DDL_DICT_TRACKING時,要求數(shù)據(jù)庫處于OPEN狀態(tài)。

3)盡量為LogMiner的表提供一個單獨的表空間。默認(rèn)情況下LogMiner的表是創(chuàng)建在SYSTEM表空間中的。使用DBMS_LOGMNR_D.SET_TABLESPACE可以在一個單獨的表空間中重建這些LogMiner的表:SQL>EXECUTEDBMS_LOGMNR_D.SET_TABLESPACE('logmnrts$');.

(4)過濾LogMiner返回的數(shù)據(jù)可以使用COMMITTED_DATA_ONLY參數(shù)來只顯示那些被提交的事務(wù):

當(dāng)使用這一參數(shù)時,LogMiner將所有的DML操作按照事務(wù)的關(guān)系組合在一起。這些事務(wù)按照它們被提交的順序顯示出來??梢允褂肧KIP_CORRUPTION參數(shù)來忽略Redo日志中的所有錯誤:

可以使用STARTTIME和ENDTIME參數(shù)按照時間過濾數(shù)據(jù),還可以使用STARTSCN和ENDSCN參數(shù)按照SCN(SystemChangeNumber)來過濾數(shù)據(jù)。

(5)典型的LogMiner步驟一個典型的LogMiner的操作包含如下步驟:

1)進行初始化設(shè)置:開啟附加日志,設(shè)置LogMiner的表空間,設(shè)置UTL_FILE_DIR參數(shù)的值。

2)提取一個字典:將字典文件提取為FlatFile或Redo日志,或者直接使用OnlineCatalog。

3)指定需要分析的Redo日志文件:利用DBMS_LOGMNR.ADD_LOGFILE來添加日志。

4)開始LogMiner:執(zhí)行DBMS_LOGMNR.START_LOGMNR來啟動LogMiner。

5)查詢V$LOGIMNR_CONTENTS視圖。

6)結(jié)束LogMiner:通過執(zhí)行EXECUTEDBMS_LOGMNR.END_LOGMNR來結(jié)束分析。

15.

什么是BBED?它有哪些作用?正確答案:BBED(BlockBrowerandEditor)是用來直接查看和修改Oracle數(shù)據(jù)塊的一個內(nèi)部工具,它可以直接修改Oracle數(shù)據(jù)文件塊的內(nèi)容,在一些極端恢復(fù)場景下比較有用。因為該工具不被Oracle服務(wù)支持,所以,默認(rèn)是沒有生成可執(zhí)行文件的,在使用前需要編譯生成。

雖然BBED可以在數(shù)據(jù)庫打開的狀態(tài)下進行修改,但是建議在做任何修改操作之前先關(guān)閉數(shù)據(jù)庫,這樣可以避免CHECKPONT進程重寫B(tài)BED對BLOCK的修改,也避免Oracle在BBED修改完成之前讀BLOCK或聲明BLOCK為CORRUPT,從而導(dǎo)致一系列的ORA-600內(nèi)部錯誤。

BBED的默認(rèn)密碼為blockedit。

在Oracle11g下,BBED的編譯文件需要從Oracle10g下復(fù)制。Oracle10g可直接編譯。需要復(fù)制如下5個文件:

復(fù)制到Oracle11g下后進行賦權(quán)操作:

進行編譯:

編譯成功后,編輯文件/home/oracle/file.txt:

輸入如下命令即可進入BBED的界面:

16.

如何導(dǎo)出存儲過程、函數(shù)、包和觸發(fā)器的定義語句?如何導(dǎo)出表的結(jié)構(gòu)?如何導(dǎo)出索引的創(chuàng)建語句?正確答案:總體來說有兩種方式來獲取,第一,利用系統(tǒng)包DBMS_METADATA包中的GET_DDL函數(shù)來獲取,第二,利用exp或expdp來獲取。

下面來看第一種方式,如何利用系統(tǒng)包DBMS_METADATA包中的GET_DDL函數(shù)來獲取對象的定義語句。下面是該函數(shù)的入?yún)⒑统鰠ⅲ?/p>

其詳細參數(shù)如下:

(1)OBJECT_TYPE:需要返回原數(shù)據(jù)的DDL語句的對象類型。

(2)NAME:對象名稱。

(3)SCHEMA:對象所在的SCHEMA,默認(rèn)為當(dāng)前用戶所在SCHEMA。

(4)VERSION:對象原數(shù)據(jù)的版本。

(5)MODEL:原數(shù)據(jù)的類型默認(rèn)為ORACLE。

(6)TRANSFORM:默認(rèn)值為DDL。

(7)RETURNS:對象的原數(shù)據(jù)默認(rèn)以CLOB類型返回。

一般情況下,只需要給出OBJECT_TYPE、NAME和SCHEMA3個參數(shù)即可。

1)查看創(chuàng)建表SQL語句:

2)查看創(chuàng)建索引的SQL語句:

3)查看創(chuàng)建主鍵的SQL語句:

4)查看創(chuàng)建外鍵的SQL語句:

5)查看創(chuàng)建視圖(VIEW)的SQL語句:

6)查看創(chuàng)建存儲過程(PROCEDURE)的SQL語句:

7)查看創(chuàng)建觸發(fā)器(TRIGGER)的SQL語句:

8)查看創(chuàng)建函數(shù)(FUNCTION)的SQL語句:

9)查看創(chuàng)建包(PACKAGE)的SQL語句:

10)查看創(chuàng)建序列(SEQUENCE)的SQL語句:

11)查看創(chuàng)建同義詞(SYNONYM)的SQL語句:

12)查看創(chuàng)建表空間(TABLESPACE)的SQL語句:

13)查看創(chuàng)建角色(ROLE)的SQL語句:

14)查看創(chuàng)建用戶(USER)的SQL語句:

15)得到一個用戶下的所有表、索引、存儲過程、函數(shù)的DDL語句:

若想去掉表的存儲參數(shù)(例如,INITIAL、NEXT、FREELISTS等參數(shù)),則可以使用DBMSMETADATA包中的函數(shù)SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',FALSE)來完成。

使用DBMS_METADATA.GET_DDL需要注意以下問題:

1)DBMS_METADATA.GET_DDL()包內(nèi)的參數(shù)都要大寫,否則會報出ORA-31600:invalidinputvaluetableforparameterOBJECT_TYPEinfunctionGET_DDL的錯誤。

2)是否查的當(dāng)前用戶的DDL語句,若不是則需要加上對象的屬主信息,即SCHEMA參數(shù)。

3)若在SQL*Plus中顯示不全,則需要setlong9999。

現(xiàn)在來回答本題目中的問題,代碼如下:

下面介紹第二種導(dǎo)出元數(shù)據(jù)的方法,就是采用exp或expdp命令。數(shù)據(jù)泵工具(impdp)提供了SQLFILE的命令行選項,只獲取DDL語句,并未真正地執(zhí)行數(shù)據(jù)導(dǎo)入。另外,若單純?yōu)榱藢?dǎo)出DDL語句則司‘以在使用expdp導(dǎo)出的時候使用CONTENT=METADATA_ONLY和EXCLUDE=STATISTICS選項,這樣導(dǎo)出的DMP文件比較小。如下:

查看expddl_lhr.sql文件即可獲取DDL語句。

imp工具使用SHOW=YLOG=GET_DDL.sql的方式,可以看到清晰的DDL腳本,同時也不會真正地執(zhí)行數(shù)據(jù)導(dǎo)入。另外,若單純?yōu)榱藢?dǎo)出DDL語句則可以在使用exp導(dǎo)出的時候使用ROWS=N選項,這樣導(dǎo)出的DMP文件比較小。如下:

查看get_ddl.sql文件即可獲取DDL語句。不過對于exp生成的DDL語句不能直接使用,需要使用SHELL腳本(腳本參考隨書提供的pdf文檔)做相應(yīng)的處理后才能使用。另外,使用imp工具的indexfle選項也可以把dmp文件中的表和索引的創(chuàng)建語句導(dǎo)出而不導(dǎo)入任何對象,命令如下:

生成的get_ti_ddl.sql文件中的創(chuàng)建表的SQL語句可以用vi命令或者文本工具來處理,處理之后就可以直接使用了。

17.

可以從dmp文件獲取哪些信息?正確答案:在開發(fā)中常常碰到,需要導(dǎo)入dmp文件到現(xiàn)有數(shù)據(jù)庫。這里的dmp文件可能來自于其他系統(tǒng),所以,一般情況下是不知道導(dǎo)出程序(exp)的版本、導(dǎo)出時間或者導(dǎo)出模式等信息的。那么如何從現(xiàn)有的dmp文件中獲取到這些信息呢?下面作者將一一講解。

(1)獲取基本信息:導(dǎo)出的版本、時間、導(dǎo)出的用戶

下面的示例中,exp_ddl_lhr_02.dmp是生成的dmp文件:

(2)獲取dmp文件中的表信息下面的示例中,exp_ddl_lhr_02.dmp是生成的dmp文件:

(3)解析dmp文件生成parfile文件下面的示例中,exp_ddl_lhr_03.dmp是生成的dmp文件:

(4)如何查看dmp文件的字符集有兩種辦法可以查看dmp文件的字符集,第一種辦法為imp導(dǎo)入命令查看,示例如下:

如果NLS_LANG的值和當(dāng)前數(shù)據(jù)庫的字符集相同,那么將不顯示“serveruses”和“importserveruses”行。如果沒有顯示“exportclient”行,那么說明當(dāng)前dmp文件的字符集和當(dāng)前的NLS_LANG環(huán)境變量的值相同。無論是使用exp還是imp工具都會顯示當(dāng)前的NLS_LANG環(huán)境變量的值(表現(xiàn)為“Exportdone”、“importdone”)。

第二種查看dmp文件字符集的辦法是,以十六進制的方式打開dmp文件,然后查看第2和第3個字節(jié)。如下:

然后在數(shù)據(jù)庫中可以查到十六進制0369代表的字符集:

以上結(jié)果說明dmp文件的字符集是UTF8。常用的US7ASCII、ZHS16GBK和AL32UTF8對應(yīng)的字符集ID如下:

若dmp文件在Windows平臺下,則可以使用軟件UltraEdit(UE)、EditPlus或Pilotedit等文本編輯工具以十六進制的方式打開dmp文件查看。其中,軟件Pilotedit可以輕松打開GB以上大小的文件。示例如下:

需要注意的是,十六進制在Linux和Windows下順序不同。

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論