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

下載本文檔

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

文檔簡(jiǎn)介

Oracle程序員面試分類模擬25簡(jiǎn)答題1.

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

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

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

RMAN具有如下特點(diǎn):

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

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

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

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

5)RMAN會(huì)檢測(cè)和報(bào)告損壞的數(shù)據(jù)塊。

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

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

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

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

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

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

11)可以使用RMAN來(lái)測(cè)試備份而不需要實(shí)際還原它們。

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

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

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

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

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

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

2.

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

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

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

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

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

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

2)并行進(jìn)程PARALLEL:

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

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

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

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

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

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

2)改變表的OWNER:

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

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

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

3.

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

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

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

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

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

5)利用TSPITR,表空間基于時(shí)間點(diǎn)的恢復(fù)技術(shù)來(lái)恢復(fù)。

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

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

4.

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

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

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

SCN的分類

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

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

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

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

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

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

5.

實(shí)例恢復(fù)和介質(zhì)恢復(fù)的區(qū)別是什么?正確答案:Redo日志是Oracle為確保已經(jīng)提交的事務(wù)不會(huì)丟失而建立的一種機(jī)制。實(shí)際上,Redo日志的存在是為兩種場(chǎng)景準(zhǔn)備的,一種稱之為實(shí)例恢復(fù)(InstanceRecovery),一種稱之為介質(zhì)恢復(fù)(MediaRecovery)。

Redo日志的數(shù)據(jù)是按照THREAD來(lái)組織的,對(duì)于單實(shí)例系統(tǒng)來(lái)說(shuō),只有一個(gè)THREAD,對(duì)于RAC系統(tǒng)來(lái)說(shuō),可能存在多個(gè)THREAD,每個(gè)數(shù)據(jù)庫(kù)實(shí)例擁有一組獨(dú)立的Redo日志文件,擁有獨(dú)立的LogBuffer,某個(gè)實(shí)例的變化會(huì)被獨(dú)立記錄到一個(gè)THREAD的Redo日志文件中。

(1)介質(zhì)恢復(fù)介質(zhì)恢復(fù)是基于物理備份恢復(fù)數(shù)據(jù),它是Oracle數(shù)據(jù)庫(kù)出現(xiàn)介質(zhì)故障時(shí)恢復(fù)的重要保障。介質(zhì)恢復(fù)包括塊恢復(fù)、數(shù)據(jù)文件恢復(fù)、表空間恢復(fù)和整個(gè)數(shù)據(jù)庫(kù)的恢復(fù)。介質(zhì)恢復(fù)主要是針對(duì)錯(cuò)誤類型中的介質(zhì)失敗,如果是少量的塊失敗,那么可以使用介質(zhì)恢復(fù)中的塊恢復(fù)來(lái)快速修復(fù);但如果是其他情況的丟失,那么需要根據(jù)具體情況,可使用數(shù)據(jù)文件恢復(fù)、表空間恢復(fù)甚至全庫(kù)恢復(fù),可以參考下表。

數(shù)據(jù)庫(kù)恢復(fù)解決方案

Oracle數(shù)據(jù)庫(kù)的介質(zhì)恢復(fù)實(shí)際上包含了兩個(gè)過(guò)程:數(shù)據(jù)庫(kù)還原(RESTORE)與數(shù)據(jù)庫(kù)恢復(fù)(RECOVER),如下:

1)數(shù)據(jù)庫(kù)還原(RESTORE)是指利用備份的數(shù)據(jù)庫(kù)文件來(lái)替換已經(jīng)損壞的數(shù)據(jù)庫(kù)文件或者將其恢復(fù)到一個(gè)新的位置。RMAN在進(jìn)行還原操作時(shí),會(huì)利用恢復(fù)目錄(有建立恢復(fù)目錄的話就使用目標(biāo)數(shù)據(jù)庫(kù)的控制文件)來(lái)獲取備份信息,并從中選擇最合適的備份進(jìn)行修復(fù)操作。當(dāng)選擇備份時(shí),有以下兩個(gè)原則:①選擇距離恢復(fù)目錄時(shí)刻最近的備份;②優(yōu)先選擇鏡像復(fù)制,其次才是備份集。

2)數(shù)據(jù)庫(kù)恢復(fù)(RECOVER)是指數(shù)據(jù)文件的介質(zhì)恢復(fù),即為修復(fù)后的數(shù)據(jù)文件應(yīng)用聯(lián)機(jī)或歸檔日志,從而將修復(fù)的數(shù)據(jù)庫(kù)文件更新到當(dāng)前時(shí)刻或指定時(shí)刻下的狀態(tài)。在執(zhí)行恢復(fù)數(shù)據(jù)庫(kù)時(shí),需要使用RECOVER命令。

還原是將某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)文件的副本再?gòu)?fù)制回去,還原后的數(shù)據(jù)庫(kù)處于不一致的狀態(tài),或不是最新的狀態(tài),還需要執(zhí)行恢復(fù)操作?;謴?fù)就是使用歸檔日志文件和聯(lián)機(jī)Redo日志文件將不一致的數(shù)據(jù)庫(kù)應(yīng)用到一致性狀態(tài)。需要注意的是,還原只是建立在數(shù)據(jù)庫(kù)備份的基礎(chǔ)版本上,例如,如果數(shù)據(jù)庫(kù)備份包括0級(jí)備份和很多1級(jí)備份,還原只是應(yīng)用0級(jí)備份,恢復(fù)過(guò)程會(huì)根據(jù)情況自動(dòng)應(yīng)用1級(jí)備份或Redo日志將數(shù)據(jù)庫(kù)恢復(fù)到一致性的狀態(tài)。

數(shù)據(jù)庫(kù)的恢復(fù)過(guò)程根據(jù)恢復(fù)數(shù)據(jù)的程度又分為完全恢復(fù)(CompleteRecovery)和不完全恢復(fù)(IncompleteRecovery),如下圖所示。

完全恢復(fù)和不完全恢復(fù)

1)完全恢復(fù)是一種沒(méi)有數(shù)據(jù)丟失的恢復(fù)方式,能夠恢復(fù)到最新的聯(lián)機(jī)Redo日志中已提交的數(shù)據(jù)。在傳統(tǒng)恢復(fù)方式中,因介質(zhì)失敗破壞了數(shù)據(jù)文件之后,可以在數(shù)據(jù)庫(kù)、表空間和數(shù)據(jù)文件上執(zhí)行完全介質(zhì)恢復(fù)。

2)不完全恢復(fù)是一種與完全恢復(fù)相反的恢復(fù)方式,是一種丟失數(shù)據(jù)的恢復(fù)方式,也稱為數(shù)據(jù)庫(kù)基于時(shí)間點(diǎn)恢復(fù)(Point-in-TimeRecovery),是將整個(gè)數(shù)據(jù)庫(kù)恢復(fù)到之前的某個(gè)時(shí)間點(diǎn)、日志序列號(hào)或者SCN號(hào)。通常情況下,若FLASHBACKDATABASE沒(méi)有啟用或者變得無(wú)效,則可以執(zhí)行不完全恢復(fù)撤銷一個(gè)用戶錯(cuò)誤。不完全恢復(fù)不一定在原有的數(shù)據(jù)庫(kù)環(huán)境執(zhí)行,可以在測(cè)試環(huán)境下執(zhí)行不完全恢復(fù),將找回的數(shù)據(jù)再重新導(dǎo)入生產(chǎn)庫(kù)中。不完全恢復(fù)根據(jù)備份情況恢復(fù)到與指定時(shí)間、日志序列號(hào)和SCN具有一致性的數(shù)據(jù),之后的數(shù)據(jù)都將丟失。執(zhí)行不完全恢復(fù)一方面可能是因?yàn)闅w檔日志、聯(lián)機(jī)日志的丟失,另一方面可能是因?yàn)樵谀硞€(gè)時(shí)刻錯(cuò)誤地操作了數(shù)據(jù),過(guò)了一段時(shí)間之后才發(fā)現(xiàn)問(wèn)題,而其他的恢復(fù)手段都無(wú)法恢復(fù)數(shù)據(jù),這時(shí)也不得不使用不完全恢復(fù)來(lái)找回?cái)?shù)據(jù)。執(zhí)行不完全恢復(fù)必須從備份中還原所有的數(shù)據(jù)文件,備份文件必須是要恢復(fù)的時(shí)間點(diǎn)之前創(chuàng)建的。當(dāng)恢復(fù)完成后,使用RESTLOGS選項(xiàng)打開(kāi)數(shù)據(jù)庫(kù),將重新初始化聯(lián)機(jī)Redo日志,創(chuàng)建一個(gè)新的日志序列號(hào)流,日志序列號(hào)從1開(kāi)始,RESETLOGS之后的SCN還是在遞增。

如果是完全恢復(fù),那么數(shù)據(jù)庫(kù)就是最新的一致性狀態(tài);如果是不完全恢復(fù),那么數(shù)據(jù)庫(kù)就是非最新的一致性狀態(tài)。對(duì)于非歸檔模式的數(shù)據(jù)庫(kù)來(lái)說(shuō),不能執(zhí)行不完全恢復(fù)。不完全恢復(fù)意味著會(huì)缺失一些事務(wù)處理;即恢復(fù)目標(biāo)時(shí)間和當(dāng)前時(shí)間之間所做的所有數(shù)據(jù)修改都會(huì)丟失。在很多情況下,這正是想要的結(jié)果,因?yàn)榭赡苄枰废麑?duì)數(shù)據(jù)庫(kù)進(jìn)行的一些更改?;謴?fù)到過(guò)去的某一時(shí)間點(diǎn)是刪除誤更改的一種方法。

不完全恢復(fù)的選項(xiàng)見(jiàn)下表。

不完全恢復(fù)的選項(xiàng)

不完全恢復(fù)的幾種類型見(jiàn)下表。

不完全恢復(fù)的幾種類型

綜上所述,恢復(fù)的分類如下圖所示。

恢復(fù)的分類

(2)實(shí)例恢復(fù)實(shí)例恢復(fù)可確保數(shù)據(jù)庫(kù)在一個(gè)實(shí)例失敗后仍能回到一致性的狀態(tài)。Redo日志記錄了對(duì)實(shí)例的所有更改。單實(shí)例數(shù)據(jù)庫(kù)擁有一個(gè)重做線程,而一個(gè)RAC數(shù)據(jù)庫(kù)擁有多個(gè)重做線程,且RAC數(shù)據(jù)庫(kù)的每個(gè)實(shí)例擁有一個(gè)重做線程。當(dāng)事務(wù)提交時(shí),LGWR將內(nèi)存中的重做條目和事務(wù)SCN同時(shí)寫(xiě)入聯(lián)機(jī)Redo日志。但是,DBWn進(jìn)程只在最有利的時(shí)機(jī)將已修改的數(shù)據(jù)塊寫(xiě)入數(shù)據(jù)文件。所以,未提交的更改可能會(huì)暫時(shí)存在于數(shù)據(jù)文件中,而已提交的更改也可能還不在數(shù)據(jù)文件中。

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

對(duì)于單實(shí)例的數(shù)據(jù)庫(kù)而言,實(shí)例恢復(fù)一般是在數(shù)據(jù)庫(kù)實(shí)例異常故障后、數(shù)據(jù)庫(kù)重啟時(shí)進(jìn)行,當(dāng)數(shù)據(jù)庫(kù)執(zhí)行了SHUTDOWNABORT或者由于操作系統(tǒng)、主機(jī)等原因“宕機(jī)”重啟后,在執(zhí)行ALTERDATABASEOPEN的時(shí)候,就會(huì)自動(dòng)做實(shí)例恢復(fù)。在RAC環(huán)境中,如果某個(gè)實(shí)例“宕機(jī)”了,那么剩下的實(shí)例將會(huì)代替損壞的實(shí)例做實(shí)例恢復(fù)。除非是所有的實(shí)例都“宕機(jī)”了,這樣的話,第一個(gè)執(zhí)行ALTERDATABASEOPEN的實(shí)例將會(huì)做實(shí)例恢復(fù)。這也是在RAC環(huán)境中,Redo日志是實(shí)例私有的組件,但是Redo日志的文件必須存放在共享存儲(chǔ)上的原因。

實(shí)例恢復(fù)使用檢查點(diǎn)來(lái)確定必須將哪些更改應(yīng)用到數(shù)據(jù)文件。檢查點(diǎn)位置始終保證所有比其SCN低的檢查點(diǎn)所對(duì)應(yīng)的已提交更改都已保存到數(shù)據(jù)文件。

在實(shí)例恢復(fù)期間,數(shù)據(jù)庫(kù)必須應(yīng)用檢查點(diǎn)位置和重做線程結(jié)尾之間發(fā)生的更改。如下圖所示,某些更改可能已經(jīng)寫(xiě)入數(shù)據(jù)文件。但是,只有其SCN低于檢查點(diǎn)位置的更改,才保證已被寫(xiě)到了磁盤(pán)上。

應(yīng)用檢查點(diǎn)位置和重做線程結(jié)尾之間發(fā)生的更改

在實(shí)例發(fā)生異常終止的情況下,數(shù)據(jù)庫(kù)處于以下的狀態(tài):

1)事務(wù)提交的數(shù)據(jù)塊只寫(xiě)入聯(lián)機(jī)Redo日志中,沒(méi)有更新到數(shù)據(jù)文件(那么未寫(xiě)入數(shù)據(jù)文件的更新必須重新寫(xiě)入數(shù)據(jù)文件)。

2)由于DBWn進(jìn)程是異步向磁盤(pán)寫(xiě)入數(shù)據(jù)的,所以,數(shù)據(jù)文件中可能包含沒(méi)有被提交但已經(jīng)寫(xiě)入數(shù)據(jù)文件的改變,這些改變必須回滾到之前的狀態(tài),以確保數(shù)據(jù)的一致性。

實(shí)例恢復(fù)利用聯(lián)機(jī)Redo日志文件解決第一個(gè)問(wèn)題,利用Undo數(shù)據(jù)同步數(shù)據(jù)文件解決第二個(gè)問(wèn)題,從而確保數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性。因此,實(shí)例恢復(fù)過(guò)程會(huì)經(jīng)歷兩個(gè)階段:前滾(RollingForward)和回滾(RollingBack),如下圖所示。

實(shí)例恢復(fù)過(guò)程

1)實(shí)例恢復(fù)的第一階段稱為前滾(RollingForward)或者緩存恢復(fù)(CacheRecovery)。前滾會(huì)將數(shù)據(jù)文件還原到實(shí)例出現(xiàn)錯(cuò)誤之前所處的狀態(tài)。SMON進(jìn)程在進(jìn)行實(shí)例恢復(fù)時(shí),會(huì)從控制文件中獲得檢查點(diǎn)位置(CheckpointPosition,即檢查點(diǎn)隊(duì)列頭),然后SMON進(jìn)程到聯(lián)機(jī)Redo日志文件中找到該檢查點(diǎn)位置,再?gòu)脑摍z查點(diǎn)位置開(kāi)始往下應(yīng)用所有的Redo日志條目,從而在BufferCache里又恢復(fù)了實(shí)例崩潰那個(gè)時(shí)間點(diǎn)的狀態(tài)。這個(gè)過(guò)程稱為前滾。因?yàn)榛貪L數(shù)據(jù)記錄在聯(lián)機(jī)Redo日志中,所以,前滾也會(huì)重新生成相應(yīng)的Undo段。前滾完成之后就可以確保聯(lián)機(jī)Redo日志中所有已提交的事務(wù)操作的數(shù)據(jù)寫(xiě)回到數(shù)據(jù)文件中。但是,這些數(shù)據(jù)文件可能還包含未提交的更改,要么是在實(shí)例失敗前保存到數(shù)據(jù)文件中的,或者是在前滾過(guò)程中引入的。如果正在執(zhí)行的檢查點(diǎn)還未完全執(zhí)行完畢時(shí)發(fā)生實(shí)例失敗,前滾過(guò)程可能需要通過(guò)多個(gè)聯(lián)機(jī)Redo日志文件才能使數(shù)據(jù)恢復(fù)到之前時(shí)間的狀態(tài)。

2)實(shí)例恢復(fù)的第二階段稱為回滾(RollingBack)或者事務(wù)恢復(fù)(TransactionRecovery)。前滾之后,任何未提交的更改必須被撤銷。Oracle數(shù)據(jù)庫(kù)使用檢查點(diǎn)位置,保證每個(gè)低于其SCN的已提交更改都已保存到磁盤(pán)。Oracle數(shù)據(jù)庫(kù)應(yīng)用Undo塊,以回滾數(shù)據(jù)塊中在實(shí)例失敗前寫(xiě)入的或前滾過(guò)程中引入的未提交更改。這一階段稱為回滾或事務(wù)恢復(fù)。在前滾完畢以后,BufferCache里既有崩潰時(shí)已經(jīng)提交還沒(méi)有寫(xiě)入數(shù)據(jù)文件的臟塊,還有事務(wù)被突然終止,而導(dǎo)致的既沒(méi)有提交又沒(méi)有回滾的事務(wù)的臟塊。前滾一旦完畢,SMON進(jìn)程立即打開(kāi)數(shù)據(jù)庫(kù)。但是,這時(shí)的數(shù)據(jù)庫(kù)中還含有那些中間狀態(tài)的、既沒(méi)有提交又沒(méi)有回滾的臟塊,這種臟塊是不能存在于數(shù)據(jù)庫(kù)中的,因?yàn)樗鼈儾](méi)有被提交,必須被回滾。在打開(kāi)數(shù)據(jù)庫(kù)以后,SMON進(jìn)程會(huì)在后臺(tái)進(jìn)行回滾。有時(shí),新事務(wù)可以自己回滾個(gè)別塊以獲取所需的數(shù)據(jù),而不必等待SMON進(jìn)程來(lái)回滾這些已終止的事務(wù)。在數(shù)據(jù)庫(kù)打開(kāi)以后,SMON進(jìn)程還沒(méi)來(lái)得及回滾這些中間狀態(tài)的數(shù)據(jù)塊時(shí),就有用戶進(jìn)程發(fā)出讀取這些數(shù)據(jù)塊的請(qǐng)求。這時(shí),服務(wù)器進(jìn)程將會(huì)把這些塊返回給用戶之前,由服務(wù)器進(jìn)程負(fù)責(zé)進(jìn)行回滾,回滾完畢后,將數(shù)據(jù)塊的內(nèi)容返回給用戶。Oracle數(shù)據(jù)庫(kù)應(yīng)用Undo塊回滾在數(shù)據(jù)塊中未提交的改變,這些數(shù)據(jù)塊是在實(shí)例失敗之前或者前滾期間被寫(xiě)入的?;貪L會(huì)將已執(zhí)行但尚未提交的更改返回到初始狀態(tài)。回滾完成之后,整個(gè)實(shí)例恢復(fù)才算完成,而Redo和Undo的丟失或者損壞都可能導(dǎo)致實(shí)例恢復(fù)失敗。Oracle數(shù)據(jù)庫(kù)可以根據(jù)需要同時(shí)回滾多個(gè)事務(wù)。

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

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

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

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

6.

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

7.

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

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

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

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

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

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

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

8.

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

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

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

9.

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

10.

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

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

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

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

差異增量備份和累計(jì)增量備份如下圖所示。

差異增量備份和累計(jì)增量備份

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

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

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

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

11.

什么是塊改變跟蹤?正確答案:執(zhí)行增量備份是為了只備份自上一次備份以來(lái)更改過(guò)的數(shù)據(jù)塊。使用RMAN可創(chuàng)建數(shù)據(jù)文件、表空間或整體數(shù)據(jù)庫(kù)的增量備份。在執(zhí)行增量備份時(shí),RMAN將掃描數(shù)據(jù)文件的每個(gè)塊以確定自上次備份以來(lái)哪些塊發(fā)生過(guò)更改。這會(huì)減小備份大小,因?yàn)橹粋浞莞倪^(guò)的塊。此外,由于減少了需要還原的塊數(shù),因此還會(huì)加快恢復(fù)速度。

塊改變跟蹤(BlockChangeTracking)是在使用RMAN執(zhí)行增量備份的情況下,若啟用塊改變跟蹤,則會(huì)把自上次備份以來(lái)所有塊的改變記錄到文件中,這個(gè)文件稱為跟蹤文件,通過(guò)后臺(tái)進(jìn)程CTWR(ChangeTrackingWriterProcess)對(duì)其進(jìn)行實(shí)時(shí)地寫(xiě)入。這樣在做增量備份時(shí)就可以避免掃描所有數(shù)據(jù)文件中的所有塊,而改為參考跟蹤文件,直接訪問(wèn)需要備份的塊,會(huì)大大縮短RMAN備份的時(shí)間,從而提高RMAN備份的性能。當(dāng)然0級(jí)備份時(shí)還是需要掃描所有的數(shù)據(jù)文件,畢竟需要?jiǎng)?chuàng)建一個(gè)基準(zhǔn),以此來(lái)判斷哪些塊發(fā)生了改變。因此,通過(guò)啟用塊更改跟蹤,可執(zhí)行快速增量備份。

跟蹤文件的維護(hù)是完全自動(dòng)進(jìn)行的,不需要用戶的干預(yù)。塊改變跟蹤默認(rèn)是禁用的,如果配置了增量備份,那么建議開(kāi)啟塊改變跟蹤。數(shù)據(jù)庫(kù)在OPEN或者M(jìn)OUNT狀態(tài)都可以啟用塊改變跟蹤??梢允褂萌缦旅铋_(kāi)啟塊改變跟蹤:

如果是RAC環(huán)境,那么跟蹤文件必須放在共享設(shè)備上。如果設(shè)置DB_CREATE_FILE_DEST參數(shù)值,那么可以直接啟用:

若想禁用塊改變跟蹤,則可以使用如下命令:

在V$BLOCK_CHANGE_TRACKING視圖的輸出中會(huì)顯示塊更改跟蹤文件的位置、塊更改跟蹤的狀態(tài)(ENABLED/DISABLED)和文件大小(字節(jié)),可以使用如下命令查看是否啟用了塊改變跟蹤:

對(duì)V$BACKUP_DATAFILE視圖進(jìn)行查詢,可顯示塊改變跟蹤功能對(duì)最大限度減少增量備份I/O的作用(PCT_READ_FOR_BACKUP列)。若該值比較高時(shí)表示RMAN在增量備份期間從數(shù)據(jù)文件中讀取的塊非常多,這時(shí),通過(guò)減少增量備份之間的時(shí)間間隔可降低這個(gè)值。

12.

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

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

如果在備份過(guò)程中,歸檔文件被手動(dòng)通過(guò)rm命令刪除,那么會(huì)報(bào)錯(cuò):RMAN-06059。解決辦法就是在RMAN中校驗(yàn)歸檔文件后再刪除失效的歸檔文件,如下:

13.

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

壞塊通常是通過(guò)Oracle的ORA-01578錯(cuò)誤報(bào)告出來(lái)的,詳細(xì)的損壞描述會(huì)在告警日志中打印出來(lái),“oerrora”對(duì)該錯(cuò)誤的解釋如下:

可能的報(bào)錯(cuò)如下:

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

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

(2)壞塊的檢測(cè)方法壞塊的檢測(cè)方法見(jiàn)下表。

壞塊的檢測(cè)方法

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2)對(duì)于受損的表對(duì)象進(jìn)行聚合等相關(guān)運(yùn)算時(shí)會(huì)收到錯(cuò)誤提示,因?yàn)閴膲K上的數(shù)據(jù)無(wú)法被統(tǒng)計(jì)。

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

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

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

14.

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

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

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

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

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

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

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

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

2)DBMSLOGIMNR包,它有3個(gè)存儲(chǔ)過(guò)程:

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

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

③END_LOGMNR()存儲(chǔ)過(guò)程用來(lái)終止分析會(huì)話,它將回收LogMiner所占用的內(nèi)存。

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

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

2)V$LOGMNR_DICTIONARY:因?yàn)長(zhǎng)OGMINER可以有多個(gè)字典文件,所以該視圖顯示字典文件信息。

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需要訪問(wèn)一個(gè)數(shù)據(jù)庫(kù)字典。LogMiner使用該字典將Oracle內(nèi)部的對(duì)象標(biāo)識(shí)符和數(shù)據(jù)類型轉(zhuǎn)換為對(duì)象名稱和外部的數(shù)據(jù)格式。沒(méi)有字典,LogMiner將使用十六進(jìn)制字符顯示內(nèi)部對(duì)象ID。

例如,對(duì)于如下的SQL語(yǔ)句:

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

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

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

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

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

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

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

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

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

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

需要注意的是,將字典文件提取為Redo文件的時(shí)候需要開(kāi)啟附加日志,如下:

在這些Redo日志被歸檔之后,可以通過(guò)查詢V$ARCHIVED_LOG視圖來(lái)查詢:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4)開(kāi)始LogMiner:執(zhí)行DBMS_LOGMNR.START_LOGMNR來(lái)啟動(dòng)LogMiner。

5)查詢V$LOGIMNR_CONTENTS視圖。

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

15.

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

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

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

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

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

進(jìn)行編譯:

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

輸入如下命令即可進(jìn)入BBED的界面:

16.

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

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

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

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

(2)NAME:對(duì)象名稱。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用DBMS_METADATA.GET_DDL需要注意以下問(wèn)題:

1)DBMS_METADATA.GET_DDL()包內(nèi)的參數(shù)都要大寫(xiě),否則會(huì)報(bào)出ORA-31600:invalidinputvaluetableforparameterOBJECT_TYPEinfunctionGET_DDL的錯(cuò)誤。

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

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

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

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

查看expddl_lhr.sql文件即可獲取DDL語(yǔ)句。

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

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

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

17.

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

(1)獲取基本信息:導(dǎo)出的版本、時(shí)間、導(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ù)庫(kù)的字符集相同,那么將不顯示“serveruses”和“importserveruses”行。如果沒(méi)有顯示“exportclient”行,那么說(shuō)明當(dāng)前dmp文件的字符集和當(dāng)前的NLS_LANG環(huán)境變量的值相同。無(wú)論是使用exp還是imp工具都會(huì)顯示當(dāng)前的NLS_LANG環(huán)境變量的值(表現(xiàn)為“Exportdone”、“importdone”)。

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論