在Oracle數據庫中,控制文件是一個(gè)很?。ù笮∫话阍?0MB范圍內)的二進(jìn)制文件,含有數據庫的結構信息,包括數據文件和日志文件的信息??梢詫⒖刂莆募斫鉃槲锢頂祿斓囊粋€(gè)元數據存儲庫??刂莆募跀祿靹?chuàng )建時(shí)被自動(dòng)創(chuàng )建,并在數據庫發(fā)生物理變化時(shí)更新??刂莆募徊粩喔?,并且在任何時(shí)候都要保證控制文件是可用的。只有Oracle進(jìn)程才能夠安全地更新控制文件的內容,所以,任何時(shí)候都不要試圖手動(dòng)編輯控制文件。
由于控制文件在數據庫中的重要地位,所以保護控制文件的安全非常重要,為此Oracle系統提供了備份文件和多路復用的機制。當控制文件損壞時(shí),用戶(hù)可以通過(guò)先前的備份來(lái)恢復控制文件。系統還提供了手工創(chuàng )建控制文件和把控制文件備份成文本文件的方式,從而使用戶(hù)能夠更加靈活地管理和保護控制文件。
控制文件中記錄了對應數據庫的結構信息(如,數據文件和日志文件的名稱(chēng)、位置等信息)和數據庫當前的參數設置,其中主要包含如下內容:
SQL> alter system set control_files= 2 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\CONTROL01.CTL', 3 'E:\APP\ADMINISTRATOR\FLASH_RECOVERY_AREA\ORCL\CONTROL02.CTL', 4 'D:\OracleFiles\ControlFiles\CONTROL03.CTL' 5 scope=spfile;在上面的代碼中,前兩個(gè)控制文件是在創(chuàng )建數據庫時(shí)自動(dòng)創(chuàng )建的,第3個(gè)控制文件是用戶(hù)將要手動(dòng)添加的(用于實(shí)現多路復用的功能),并且它位于不同的磁盤(pán)上(為了降低故障率),但目前還沒(méi)有創(chuàng )建該文件,用戶(hù)需要關(guān)閉數據庫,然后通過(guò)手動(dòng)復制來(lái)創(chuàng )建它。
2.復制控制文件
在CONTROL_FILES參數進(jìn)行設置后,需要創(chuàng )建第3個(gè)控制文件,以達到復用控制文件的目的,具體步驟如下:
(1)退出SQL*Plus環(huán)境。
(2)選擇“開(kāi)始”/“控制面板”/“管理工具”/“組件服務(wù)”項,打開(kāi)Windows的“組件服務(wù)”窗口,在該窗口的中間部分找到OracleServiceORCL和OracleDBConsoleORCL服務(wù),手動(dòng)將這些服務(wù)停止

(3)找到CONTROL_FILES參數中所指定的第一個(gè)控制文件,然后將這個(gè)控制文件拷貝到CONTROL_FILES參數中新增加的目錄下,并按照參數的設置重新命名(這里重命名為CONTROL03.CTL,注意:它就是CONTROL01.CTL的多路復用控制文件)

(4)啟動(dòng)“組件服務(wù)”窗口中的OracleServiceORCL和OracleDBConsoleORCL服務(wù),打開(kāi)SQL*Plus環(huán)境,通過(guò)查詢(xún)數據字典V$CONTROLFILE來(lái)確認添加的控制文件是否已經(jīng)起作用,代碼如下:SQL> select name as 控制文件 from V$CONTROLFILE;

創(chuàng )建控制文件
在一般情況下,若使用了多路復用控制文件,并將各個(gè)控制文件分別存儲在不同的磁盤(pán)中,則全部控制文件丟失或損壞的可能性將非常小。如果突發(fā)意外,而導致數據庫的所有控制文件全部丟失或損壞,唯一的補救方法就是手工創(chuàng )建一個(gè)新的控制文件。手工創(chuàng )建控制文件使用CREATE CONTROLFILE語(yǔ)句
create controlfilereuse database db_namelogfilegroup 1 redofiles_list1group 2 redofiles_list2group 3 redofiles_list3...datafiledatafile1datafile2datafile3…maxlogfiles max_value1maxlogmembers max_value2maxinstances max_value3maxdatafiles max_value4noresetlogs|resetlogsarchivelog|noarchivelog;參數說(shuō)明如下:
db_name:數據庫名稱(chēng),通常是orcl。 redofiles_list1:重做日志組中的重做日志文件列表1,列表中的重做日志文件可以有多個(gè),其下面兩個(gè)個(gè)列表與此相同。 datafile1:數據文件路徑,其下面兩個(gè)個(gè)列表與此相同。 max_value1:最大的重做日志文件數,這是一個(gè)永久性的參數。 max_value2:最大的重做日志組成員數,這是一個(gè)永久性的參數。 max_value3:最大實(shí)例數,這是一個(gè)永久性的參數。 max_value4:最大數據文件數,這是一個(gè)永久性的參數。
在上面的語(yǔ)法中,提到了永久性參數這個(gè)概念,它是在創(chuàng )建數據庫時(shí)設置的參數,主要包括數據庫名稱(chēng)、MAXLOGFILES、MAXLOGMEMBERS、MAXINSTANCES等。
注意:若數據庫管理員需要改變數據庫的某個(gè)永久性參數,那么必須重新創(chuàng )建控制文件。
備份和恢復控制文件
為了提高數據庫的可靠性,降低由于丟失控制文件而造成災難性后果的可能性,DBA需要進(jìn)場(chǎng)對控制文件進(jìn)行備份。特別是當修改了數據庫結構之后,需要立即對控制文件進(jìn)行備份。
1.備份控制文件
備份控制文件需要使用到ALTER DATABASE BACKUP CONTROLFILE語(yǔ)句。有兩種備份方式:一種是備份為二進(jìn)制文件,另一種是備份為腳本文件。
備份為二進(jìn)制文件:備份為二進(jìn)制文件需要使用“alter dabase backup controlfile”語(yǔ)句。
---- 將數據庫的控制文件備份為一個(gè)二進(jìn)制文件,即復制當前的控制文件SQL> alter database backup controlfile 2 to 'D:\OracleFiles\ControlFiles\control_file1.bkp';備份為腳本文件:備份為腳本文件實(shí)際上就是備份為可讀的文本文件,同樣使用“alter dabase backup controlfile”語(yǔ)句。
刪除控制文件
如果控制文件的位置不在適合時(shí),可以從數據庫中刪除控制文件,其操作過(guò)程如下。
(1)關(guān)閉數據庫(shutdown)。
(2)編輯初始化參數CONTROL_FILES,清除掉打算要刪除的控制文件的名稱(chēng)。
(3)重新啟動(dòng)數據庫(startup)。
上面的第二部操作,僅僅是在初始化參數CONTROL_FILES中刪除了指定的控制文件,但物理磁盤(pán)上的控制文件還是存在的,用于也可以在這個(gè)操作之后,手動(dòng)清除磁盤(pán)上的物理文件。
注意:不能夠將控制文件全部刪除,至少保留兩個(gè)或兩個(gè)以上,否則數據庫將無(wú)法啟動(dòng)。
查詢(xún)控制文件的信息
控制文件是一個(gè)二進(jìn)制文件,其中被分隔成許多部分,分別記錄各種類(lèi)型的信息。每一類(lèi)信息成為一個(gè)記錄文檔段??刂莆募拇笮≡趧?chuàng )建時(shí)即被確定,其中各個(gè)記錄文檔段大小也是固定的。例如,在創(chuàng )建數據庫時(shí)通過(guò)MAXLOGFILES子句設定數據庫中最多的重做日志文件數量,那么在控制文件中就會(huì )為L(cháng)OGFILE記錄文檔分配相應的存儲空間。
查詢(xún)Oracle數據庫的控制文件信息,可以使用若干個(gè)數據字典視圖,與控制文件信息相關(guān)的常用數據字典視圖如表所示。

使用v$controlfile_record_section視圖查看控制文件中記錄文檔段的類(lèi)型、文檔段中每條記錄的大小、記錄文檔中最多能夠存儲的條目數、已經(jīng)創(chuàng )建的數目等信息
SQL> select type,record_size,records_total,records_used from v$controlfile_record_section;
type列表示記錄文檔段的類(lèi)型,這里以TABLESPACE為例,該數據庫最多可以擁有200個(gè)表空間(RECORDS_TOTAL列),而現在系統中已經(jīng)創(chuàng )建了9個(gè)(RECORDS_USED列)。管理重做日志文件重做日志文件用于記載事務(wù)操作所引起的數據變化,當執行DDL或DML操作時(shí),由LGWR進(jìn)程將緩沖區中與該事物相關(guān)的重做記錄全部寫(xiě)入重做日志文件。當丟失或損壞數據庫中的數據時(shí),Oracle會(huì )根據重做日志文件中的記錄恢復丟失的數據。
1.日志文件的內容及數據恢復
重做日志文件由重做記錄組成,重做記錄又稱(chēng)為重做條目,它由一組變更向量組成。每個(gè)變更向量都記錄了數據庫中某個(gè)數據塊所做的修改。比如,用戶(hù)執行了一條UPDATE語(yǔ)句對某個(gè)表的一條記錄進(jìn)行修改,同時(shí)生成一個(gè)條重做記錄。這條重做記錄可能有多個(gè)變更向量組成,在這些變更向量中記錄了所有被這條語(yǔ)句修改過(guò)的數據塊中的信息,被修改的數據塊包括表中存儲這條記錄的數據塊,以及回滾段中存儲的相應回滾條目的數據塊。如果由于某種原因導致這條UPDATE語(yǔ)句執行失敗,這時(shí)事務(wù)就可以通過(guò)與這條UPDATE語(yǔ)句對應的重做記錄找到被修改之前的結果,然后將其復制到各個(gè)數據塊中,從而完成數據恢復。
利用重做記錄,不僅能夠恢復對數據文件所做的修改操作,還能夠恢復對回退段所做的修改操作。因此,重做日志文件不僅可以保護數據,還能夠保護回退段數據。在進(jìn)行數據庫恢復時(shí),Oracle會(huì )讀取每個(gè)變更向量,然后將其中記錄的修改信息重新應用到相應的數據塊上。
重做記錄將以循環(huán)方式在SGA區的重做日志高速緩沖區中進(jìn)行緩存,并且由后臺進(jìn)程LGWR寫(xiě)入到重做日志文件中。當一個(gè)事務(wù)被提交時(shí),LGWR進(jìn)程將與該事物相關(guān)的所有重做記錄全部寫(xiě)入重做日志文件組中,同時(shí)生成一個(gè)“系統變更碼”(SCN)。系統變更碼SCN會(huì )隨著(zhù)重做記錄一起保存到重做日志文件組中,以標識與重做記錄相關(guān)的事務(wù)。只有當某個(gè)視圖所產(chǎn)生的重做記錄全部被寫(xiě)入重做日志文件后,Oracle才會(huì )認為該事務(wù)提交成功。
2.寫(xiě)入重做日志文件
在Oracle中,用戶(hù)對數據庫所做的修改首先被保存在內存沖,這樣可以提高數據庫的性能,因為對內存中的數據進(jìn)行操作要比對磁盤(pán)中的數據進(jìn)行操作快的多。Oracle每隔一段時(shí)間(日志信息存放超過(guò)3秒鐘)或滿(mǎn)足特定條件時(shí)(當發(fā)生提交命令、或者重做日志緩沖區的信息滿(mǎn)1/3)就會(huì )啟動(dòng)LGWR進(jìn)程將內存中的重做日志記錄保存到重做日志文件中。因此,即使發(fā)生故障導致數據庫崩潰,Oracle也可以利用重做日志文件來(lái)恢復丟失的數據。
在創(chuàng )建Oracle數據庫的過(guò)程中,默認創(chuàng )建3個(gè)重做日志文件組,每個(gè)日志文件組中包含兩個(gè)日志文件成員,并且每個(gè)日志文件組都有內部序號,Oracle按照序號從小到大的順序向日志文件組中寫(xiě)入日志信息。當一個(gè)重做日志文件組寫(xiě)滿(mǎn)后,后臺進(jìn)程LGWR開(kāi)始寫(xiě)入下一個(gè)重做日志文件組;當LGWR進(jìn)程將所有的日志文件都寫(xiě)過(guò)一遍之后,它將再次轉向第一個(gè)日志文件組重新覆蓋。當前正在被LGWR進(jìn)程寫(xiě)入日志記錄的某組重做日志文件被稱(chēng)為“聯(lián)機重做日志文件”(Online Redo Log File),圖11-12顯示了重做日志的循環(huán)寫(xiě)入方式。

vcq9z/LK/b7dv+LW0MztvNPQwrXE1tjX9sjV1r7X6bvys8nUsaOsu/LV37jEseTW2Nf2yNXWvs7EvP61xMP7s8bT68671sOjrNLUvLDJvrP91tDX98jV1r7X6bvys8nUsaGjwe3N4qOs0OjSqtei0uK1xMrHo7q21NPa1tjX9sjV1r7OxLz+tcTV4tCpyNWzo86su6S5pNf3o6zQ6NKq08O7p77f09BBTFRFUiBEQVRBQkFTRc+1zbPIqM/eo6y908/CwLS+zb2rvbK94sjnus621NbY1/bI1da+zsS8/r340NDV4tCpyNWzo86su6Sy2df3oaM8YnIgLz4NCjGjrsztvNPQwrXE1tjX9sjV1r7OxLz+1+k8YnIgLz4NCtTaT3JhY2xlyv2+3b/itcTI1bOjudzA7dbQo6zOqsHLt8DWubrzzKi9+LPMTEdXUrXItP3QtMjryNXWvtfpo6zK/b7dv+K53MDt1LGx2NDr0aHU8brPysq1xMjV1r7X6bj2yv2ho9T2vNPW2Nf2yNXWvs7EvP7X6b/J0tTKudPDQUxURVIgREFUQUJBU0UgQUREIExPR0ZJTEXT777kPC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cHJlIGNsYXNzPQ=='brush:sql;'>-----在system模式下,向數據庫中添加一個(gè)新的重做日志文件組SQL> alter database add logfile 2 ('D:\OracleFiles\LogFiles\REDO4_A.LOG', 3 'E:\OracleFiles\LogFiles\REDO4_B.LOG') 4 size 20M;在上面新增的重做日志組中有兩個(gè)日志成員,它們分別位于不同的磁盤(pán)分區,大小均為20M,通常情況下,重做日志文件的大小最好在10MB到50MB之間,Oracle默認的日志文件大小是50MB。另外,上面的例子中并沒(méi)有為新創(chuàng )建的重做日志組指定組編號,這種情況下,Oracle會(huì )自動(dòng)為新建的重做日志組設置編號,一般在當前最大組號之后遞增。
如果需要為新創(chuàng )建的重做日志組指定編號,則需要在A(yíng)LTER DATABASE ADD LOGFILE語(yǔ)句后添加GROUP關(guān)鍵字
-----向數據庫中添加一個(gè)新的重做日志文件組,并指定組編號為5SQL> alter database add logfile group 5 2 ('D:\OracleFiles\LogFiles\REDO5_A.LOG', 3 'E:\OracleFiles\LogFiles\REDO5_B.LOG') 4 size 20M;使用日志組編號可以更加方便地管理重做日志組,但是日志組編號必須是連續的,不能跳躍,比如,1、3、5、7這樣不連續的編號是不可以的,否則將會(huì )耗費數據庫控制文件的空間。
------向數據庫中添加一個(gè)單一的重做日志文件,并覆蓋已存的同名日志文件SQL> alter database add logfile 'D:\OracleFiles\LogFiles\REDO6.LOG’ reuse;如果要創(chuàng )建的日志文件已經(jīng)存在,則必須在A(yíng)LTER DATABASE ADD LOGFILE語(yǔ)句后面使用REUSE關(guān)鍵字,這樣就可以覆蓋已有的操作系統文件。在使用了REUSE的情況下,不能再使用SIZE子句設置重做日志文件的大小,重做日志文件的大小將由已存在日志文件的大小決定。
2.創(chuàng )建日志成員文件
如果某個(gè)日志組中的所有日志成員都被損壞了,那么當后臺進(jìn)程LGWR切換到該日志組時(shí),Oracle會(huì )停止工作,并對該數據庫執行不完全恢復,為此數據庫管理員需要向該日志組中添加一個(gè)或多個(gè)日志成員。
為重做日志組添加新的成員,需要使用ALTER DATABASE ADD LOG MEMBER語(yǔ)句
------為第4個(gè)重做日志文件組添加一個(gè)新的日志文件成員SQL> alter database add logfile member 2 'E:\OracleFiles\LogFiles\REDO4_C.LOG' to group 4;另外,還可以通過(guò)指定重做日志組中其他成員的名稱(chēng),以確定要添加的新日志成員所屬于的重做日志組
------通過(guò)指定第5個(gè)重做日志組中的一個(gè)成員,來(lái)向該組中添加一個(gè)新的重做日志文件SQL> alter database add logfile member 2 'D:\OracleFiles\LogFiles\REDO1_new.LOG' to ('E:\app\Administrator\oradata\orcl\REDO01.LOG') ;在上面的代碼中,需要注意的是:在關(guān)鍵字“to”的左側是新增加的日志成員的名稱(chēng),而在其右側則是要參照的日志成員名稱(chēng),并且該日志成員的路徑需要使用括號括起來(lái)。
刪除重做日志
在某些情況下,數據庫管理員可能需要刪除重做日志的某個(gè)完整的組,或減少某個(gè)日志組中的成員。比如,存放某個(gè)日志文件的磁盤(pán)被損壞,就需要刪除該損壞磁盤(pán)的日志文件,以防止Oracle將重做記錄寫(xiě)入到不可訪(fǎng)問(wèn)的文件中。刪除重做日志需要使用ALTER DATABASE語(yǔ)句,執行該語(yǔ)句要求用戶(hù)具有ALTER DATABASE系統權限。
1.刪除日志成員
要刪除一個(gè)日志成員文件,可以使用“ALTER DATABASE DROP LOGFILE MEMBER”語(yǔ)句
---在system模式下,除“E:\OracleFiles\LogFiles\REDO4_C.LOG”重做日志文SQL> alter database drop logfile member 2 'E:\OracleFiles\LogFiles\REDO4_C.LOG';說(shuō)明: 上面的語(yǔ)句只是在數據字典和控制文件中將重做日志文件成員刪除,而對應的物理文件并沒(méi)有刪除,若要刪除,可以采取手動(dòng)刪除的方式。
2.刪除日志文件組
如果某個(gè)日志文件組不再需要使用,可以將整個(gè)日志組刪除;或者當日志組大小不合適時(shí),由于已經(jīng)存在的日志組的大小不能改變,就需要重新建立日志組,在重新建立日志組之前,就需要刪除大小不合適的原日志組。刪除一個(gè)日志組時(shí),其中的成員文件也將被刪除。在刪除日志組時(shí),必須要注意以下幾點(diǎn):
無(wú)論日志組中有多少個(gè)成員,一個(gè)數據庫至少需要兩個(gè)日志組,刪除時(shí)不能超過(guò)這個(gè)限制。 只能刪除處于INACTIVE狀態(tài)的日志組。如果要刪除處于CURRENT狀態(tài)的重做日志組,必須執行一個(gè)手工切換日志,將它切換到INACTIVE狀態(tài)。 如果數據庫處于歸檔模式,在刪除重做日志組之前必須確定它已經(jīng)被歸檔。
說(shuō)明: 用戶(hù)可以通過(guò)查詢(xún)V$LOG數據字典視圖來(lái)查看重做日志文件組的狀態(tài)以及它們是否已經(jīng)歸檔。
若要刪除一個(gè)重做日志組,需要使用帶有 ALTER DATABASE DROP LOGFILE語(yǔ)句。 ----刪除數據庫中編號為5的日志組SQL> alter database drop logfile group 5;與刪除指定的日志文件相同,刪除日志文件組也只是在數據字典和控制文件中將日志文件組的信息刪除,而對應的物理文件并沒(méi)有刪除,若要刪除,可以采取手動(dòng)刪除的方式。
3.清空重做日志文件
清空重做日志文件實(shí)際上就是將日志文件中的內容清空,這相當于刪除原有的日志文件,重新創(chuàng )建新的日志文件。即使數據庫只有兩個(gè)重做日志文件組,甚至要清空的重做日志組處于CURRENT狀態(tài),也都可以成功執行清空操作。
清空日志文件,需要使用“ALTER DATABASE CLEAR LOGFILE”語(yǔ)句
----清空數據庫中編號為4的日志組中所有日志文件的內容SQL> alter database clear logfile group 4;說(shuō)明:如果要清空的重做日志文件組尚未歸檔,則必須在使用“ALTER DATABASE CLEAR UNARCHIVED LOGFILE”語(yǔ)句。
更改重做日志的位置或名稱(chēng)
在重做日志文件創(chuàng )建后,有時(shí)候可能需要改變它們的名稱(chēng)或位置。比如,某一個(gè)日志文件最初被放置在D盤(pán)上,由于D盤(pán)的空間并不足夠大,隨著(zhù)應用系統業(yè)務(wù)量的不斷增加,D盤(pán)經(jīng)常發(fā)生剩余空間不足的情況,這時(shí)候數據庫管理員就需要把D盤(pán)上的日志文件移動(dòng)到其它大容量的磁盤(pán)分區中,針對這種情況,我們來(lái)看一下它的具體實(shí)現步驟:
(1)關(guān)閉數據庫,代碼及運行結果如下。
SQL> shutdown數據庫已經(jīng)關(guān)閉。已經(jīng)卸載數據庫。ORACLE 例程已經(jīng)關(guān)閉。(2)手動(dòng)復制源文件到目標位置,甚至可以對復制后的文件進(jìn)行重命名。
(3)再次啟動(dòng)數據庫實(shí)例,加載數據庫,但不打開(kāi)數據庫,代碼如下。
SQL> startup mount;ORACLE 例程已經(jīng)啟動(dòng)。(4)使用ALTER DATABASE RENAME FILE語(yǔ)句重新設置重做日志文件的路徑及名稱(chēng),代碼及運行結果如下。
SQL> alter database rename file 2 'D:\OracleFiles\LogFiles\REDO1_NEW.LOG', 3 'D:\OracleFiles\LogFiles\REDO4_A.LOG' 4 to 5 'E:\OracleFiles\LogFiles\REDO1_NEWa.LOG', 6 'E:\OracleFiles\LogFiles\REDO4a.LOG';數據庫已更改。在上面的代碼中,關(guān)鍵字“to”上面的兩行代碼描述源日志文件及其路徑,下面的兩行代碼描述目標日志文件。
(5)打開(kāi)數據庫,代碼及運行結果如下。
SQL> alter database open;數據庫已更改。(6)打開(kāi)數據庫后,新的重做日志文件的位置和名稱(chēng)將生效,通過(guò)查詢(xún)V$LOGFILE字典視圖就可以獲知數據庫現在所使用的重做日志文件。
對于數據庫管理員而言,經(jīng)常查看日志文件是其一項必要的工作內容,用以了解數據庫的運行情況。要了解Oracle數據庫的日志文件信息,可以查詢(xún)如表11-2所示的三個(gè)常用數據字典視圖。

在SQL*Plus環(huán)境中,使用desc命令顯示V$LOG數據字典視圖的結構

在上面的運行結果中,用戶(hù)需要對以下內容進(jìn)行了解:GROUP#:日志文件組編號。 SEQUENCE#:日志序列號。 STATUS:日志組的狀態(tài),有三種:CURRENT、INACTIVE、ACTIVE。 FIRST_CHANGE#:重做日志組上一次寫(xiě)入時(shí)的系統變更碼(SCN),也稱(chēng)作檢查點(diǎn)號。在使用日志文件對數據庫進(jìn)行恢復時(shí),將會(huì )用到SCN。
管理歸檔日志文件 日志模式分類(lèi)
雖然歸檔日志文件可以保存重做日志文件中即將被覆蓋的記錄,但它并不是總起作用的,這樣要看Oracle數據庫所設置的日志模式,通常Oracle有兩種日志模式:第一種是非歸檔日志模式(NOARCHIVELOG),第二種是歸檔日志模式(ARCHIVELOG)。在非歸檔日志模式下,原日志文件的內容會(huì )被新的日志內容所覆蓋;在歸檔日志模式下,Oracle會(huì )首先對原日志文件進(jìn)行歸檔存儲,且在歸檔未完成之前不允許覆蓋原有日志。
1.歸檔模式(ARCHIVELOG)
在重做日志文件被覆蓋之前,Oracle能夠將已經(jīng)寫(xiě)滿(mǎn)的重做日志文件通過(guò)復制保存到指定的位置,保存下來(lái)的所有重做日志文件被稱(chēng)為“歸檔重做日志”,這個(gè)過(guò)程就是“歸檔過(guò)程”。只有數據庫處于歸檔模式時(shí),才會(huì )對重做日志文件執行歸檔操作。另外,歸檔日志文件中不僅包含了被覆蓋的日志文件,還包含重做日志文件使用的順序號。
當數據庫的運行處于歸檔模式時(shí),具有如下優(yōu)勢:
如果發(fā)生磁盤(pán)介質(zhì)損壞,則可以使用數據庫備份與歸檔重做日志恢復已經(jīng)提交的事務(wù),保證不會(huì )發(fā)生任何數據丟失。 如果為當前數據庫建立一個(gè)備份數據庫,通過(guò)持續地為備份數據庫應用歸檔重做日志,可以保證源數據庫與備份數據庫的一致性。 利用歸檔日志文件,可以實(shí)現使用數據庫在打開(kāi)狀態(tài)下創(chuàng )建的備份文件來(lái)進(jìn)行數據庫恢復。 在歸檔模式下,系統后臺進(jìn)程LGWR在寫(xiě)入下一個(gè)重做日志文件之前,必須等待該重做日志文件完成歸檔,否則LGWR進(jìn)程將被暫停執行,直到對重做日志文件歸檔完成。歸檔操作可以由后臺進(jìn)程ARCN自動(dòng)完成,也可以由數據庫管理員手工完成,為了簡(jiǎn)化操作,通常情況下選擇由后臺進(jìn)程ARCN自動(dòng)完成。另外,為了提高歸檔的速度,可以考慮使用多個(gè)ARCN進(jìn)程加速歸檔的速度。圖顯示了在歸檔模式下重做日志文件的自動(dòng)歸檔過(guò)程。

2.非歸檔模式(NOARCHIVELOG)
非歸檔模式只能用于保護實(shí)例故障,而不能保護介質(zhì)故障,當數據庫處于NOARCHIVELOG模式時(shí),如果進(jìn)行日志切換,生成的新內容將直接覆蓋掉原來(lái)的日志記錄。
使用非歸檔模式具有如下一些特點(diǎn):
當檢查點(diǎn)完成之后,后臺進(jìn)程LGWR可以覆蓋原來(lái)的重做日志文件。 如果數據庫備份后的重做日志內容已經(jīng)被覆蓋掉,那么當出現數據庫文件損壞時(shí),只能恢復到最近一次的某個(gè)完整備份點(diǎn),而且這個(gè)備份點(diǎn)的時(shí)間人工無(wú)法控制,甚至可能會(huì )有數據丟失。
Oracle數據庫具體應用歸檔模式還是非歸檔模式,這個(gè)由數據庫對應的應用系統來(lái)決定。如果任何由于磁盤(pán)物理?yè)p壞而造成的數據丟失都是不允許的,那么就只能使用歸檔模式;如果只是強調應系統的運行效率,而將數據的丟失考慮次之,可以采取非歸檔模式,但數據庫管理員必須經(jīng)常定時(shí)地對數據庫進(jìn)行完整的備份.
管理歸檔操作
默認情況下,Oracle數據庫處于非歸檔日志模式,這樣重做日志文件中被覆蓋掉的日志記錄就不會(huì )被寫(xiě)入到歸檔日志文件中。根據Oracle數據庫對應的應用系統的要求,用戶(hù)可以把數據庫的日志模式切換到歸檔模式,反之亦可操作。要實(shí)現數據庫在歸檔模式與非歸檔模式之間進(jìn)行切換,可以使用ALTER DATABASE ARCHIVELOG或NOARCHIVELOG語(yǔ)句。
1.日志模式切換
在Oracle 11g中,歸檔日志文件默認情況下存放到快速恢復區所對應的目錄(由初始化參數DB_RECOVERY_FILE_DEST設定)中,并且會(huì )按照特定的格式生成歸檔日志文件名。如果只想將歸檔日志文件放在默認的路徑下時(shí),那么只需執行ALTER DATABASE ARCHIVELOG語(yǔ)句即可。
改變日志操作模式時(shí),用戶(hù)必須以SYSDBA的身份執行相應操作。接下來(lái)講解數據庫由非歸檔模式切換為歸檔模式的具體操作步驟:
(1)查看當前日志模式
在改變日志模式之前,用戶(hù)首先應該檢查當前日志模式,這個(gè)可以通過(guò)查詢(xún)動(dòng)態(tài)性能視圖V$DATABASE實(shí)現
SQL> select log_mode from v$database;結果:LOG_MODE------------NOARCHIVELOG通過(guò)查詢(xún)結果可以看到,數據庫當前處于非歸檔日志模式(NOARCHIVELOG)
(2)關(guān)閉并重新啟動(dòng)數據庫
改變日志操作模式必須在MOUNT狀態(tài)下進(jìn)行,因此必須先關(guān)閉數據庫,然后重新裝載數據庫。
SQL> shutdown immediate;數據庫已經(jīng)關(guān)閉。已經(jīng)卸載數據庫。ORACLE 例程已經(jīng)關(guān)閉。SQL> startup mount;ORACLE 例程已經(jīng)啟動(dòng)。注意:改變日志模式時(shí),關(guān)閉數據庫不能使用SHUTDOWN ABORT命令。
(3)改變日志模式
使用ALTER DATABASE ARCHIVELOG語(yǔ)句將數據庫切換到歸檔模式
SQL> alter database archivelog;數據庫已更改。若是要把歸檔日志模式改變成非歸檔日志模式,只需要將ALTER DATABASE ARCHIVELOG語(yǔ)句中的“ARCHIVELOG”關(guān)鍵字換成“NOARCHIVELOG”即可,其它步驟基本相同。
(4)打開(kāi)數據庫
使用ALTER DATABASE OPEN語(yǔ)句打開(kāi)數據庫,這時(shí)數據庫的日志模式就徹底改變了
SQL> alter database open;數據庫已更改。數據庫打開(kāi)后,用戶(hù)可以使用ARCHIVE LOG LIST命令查看數據庫是否處于歸檔模式。
2.配置歸檔進(jìn)程
如果Oracle系統的后臺進(jìn)程LGWR經(jīng)常出現等待的狀態(tài),就可以考慮啟動(dòng)多個(gè)ARCN進(jìn)程,通過(guò)修改系統初始化參數“LOG_ARCHIVE_MAX_PROCESSES”就可以調整啟動(dòng)ARCN進(jìn)程數量
----設置啟動(dòng)3個(gè)ARCN后臺系統進(jìn)程SQL> alter system set log_archive_max_processes=3;系統已更改。說(shuō)明:當數據庫處于A(yíng)RCHIVELOG模式時(shí),默認情況下Oracle會(huì )自動(dòng)啟動(dòng)兩個(gè)歸檔日志進(jìn)程。通過(guò)改變初始化參數LOG_ARCHIVE_MAX_PROCESSES的值,用戶(hù)可以動(dòng)態(tài)地增加或減少歸檔進(jìn)程的個(gè)數。
設置歸檔文件位置
歸檔日志文件保存的位置稱(chēng)為歸檔目標,用戶(hù)可以為數據庫設置多個(gè)歸檔目標,與設置控制文件和重做日志文件一樣,不同的歸檔目標最好位于不同的磁盤(pán)中,以緩解歸檔操作時(shí)磁盤(pán)的I/O瓶頸。
歸檔目標在初始化參數LOG_ARCHIVE_DEST_n中進(jìn)行設置,其中n為1到10的整數,即可以為數據庫指定1到10個(gè)歸檔目標。在進(jìn)行歸檔時(shí),Oracle會(huì )將重做日志文件組以相同的方式歸檔到每一個(gè)歸檔目標中。在設置歸檔目標時(shí),可以指定本地機器作為歸檔目標(LOCATION),也可以選擇遠程服務(wù)器作為歸檔目標(SERVER),下面分別來(lái)看這兩種情況。
(1)本地歸檔目標(LOCATION)
若設置LOG_ARCHIVE_DEST_n參數時(shí)使用LOCATION關(guān)鍵字,則表示指定的歸檔目標在本地機器上。
----在本地機器上,建立4個(gè)歸檔目標,代碼及運行結果如下。SQL> alter system set log_archive_dest_1 = 'location=D:\OracleFiles\archive1';系統已更改。SQL> alter system set log_archive_dest_2 = 'location=D:\OracleFiles\archive2';系統已更改。SQL> alter system set log_archive_dest_3 = 'location=D:\OracleFiles\archive3';系統已更改。SQL> alter system set log_archive_dest_4 = 'location=D:\OracleFiles\archive4';系統已更改。使用初始化參數LOG_ARCHIVE_DEST_n設置歸檔位置時(shí),還可以指定OPTIONAL、MANDATORY或REOPEN選項,下面分別進(jìn)行介紹。
OPTIONAL:該選項是默認選項,使用該選項時(shí),無(wú)論“歸檔操作”是否執行成功,都可以覆蓋重做日志文件。 MANDATORY:該選項用于強制進(jìn)行“歸檔操作”。使用該選項時(shí),只有在歸檔成功后,重做日志文件才能被覆蓋。 REOPEN:這是一個(gè)屬性選項,它用于設定重新歸檔的時(shí)間間隔,默認值為300秒。但需要注意的是:REOPEN屬性必須跟在MANDATORY選項后。 查看歸檔日志信息
查看歸檔日志信息主要有兩種方法:一種是使用數據字典和動(dòng)態(tài)性能視圖;另一種是使用ARCHIVE LOG LIST命令,下面分別進(jìn)行講解。
(1)使用數據字典和動(dòng)態(tài)性能視圖
常用的各種包含歸檔信息的數據字典和動(dòng)態(tài)性能視圖

下面通過(guò)查詢(xún)V$ARCHIVE_DEST動(dòng)態(tài)性能視圖來(lái)顯示歸檔目標信息SQL> select dest_name from v$archive_dest;
(2)使用ARCHIVE LOG LIST命令
在SQL*Plus環(huán)境中,使用ARCHIVE LOG LIST命令可以顯示當前數據庫的歸檔信息

聯(lián)系客服