一、什么是重做日志?
??恢復操作最關鍵的結構是重做日志,它由兩個或多個預先分配的文件組成,在數據庫發生更改時這些文件存儲所有更改。Oracle數據庫的每個實例都有一個相關的重做日志,以在實例故障情況下保護數據庫。
1.重做線程
??在多數據庫實例的環境中,每個數據庫實例的重做日志也被稱為一個重做線程。
??在典型的配置中,只有一個數據庫實例訪問Oracle數據庫,因此只有一個線程存在。然而,在Oracle Real Application Clusters環境中,兩個或多個實例同時訪問一個數據庫,并且每個實例都有自己的重做線程。每個實例擁有單獨的重做線程可以避免對單個重做日志文件組的爭用,從而消除潛在的性能瓶頸。
2.重做日志內容
??重做日志文件由重做記錄填充。
??重做記錄,也稱為重做條目,由一組更改向量組成,每一個更改向量都是對數據庫中單個塊所做更改的描述。例如,如果您更改了雇員表中的工資值,您將生成一個重做記錄,其中包含更改向量,用于描述對表的數據段塊、撤消段數據塊和撤消段的事務表的更改。
??重做條目記錄了可以用來重建對數據庫所做的所有更改的數據,包括撤銷段。因此,重做日志還可以保護回滾數據。當您使用重做數據恢復數據庫時,數據庫讀取重做記錄中的更改向量,并將更改應用到相關的塊中。
??重做記錄在SGA的重做日志緩沖區中以循環方式進行緩沖,并被數據庫后臺進程log Writer (LGWR)寫入其中一個重做日志文件。當事務被提交時,LGWR將事務重做記錄從SGA的重做日志緩沖區寫到重做日志文件中,并為每個提交的事務分配一個系統變更號(SCN)來標識重做記錄。只有當所有與給定事務相關的重做記錄都在磁盤在線日志中安全時,用戶進程才會被通知事務已經提交。
??在提交相應的事務之前,重做記錄也可以寫入重做日志文件。如果重做日志緩沖區被填滿,或者另一個事務提交,LGWR會將重做日志緩沖區中的所有重做日志條目刷新到重做日志文件中,即使有些重做記錄可能沒有被提交。如果需要,數據庫可以回滾這些更改。
3.Oracle數據庫如何寫入重做日志
??一個數據庫的重做日志由兩個或多個重做日志文件組成。數據庫至少需要兩個文件,以確保在歸檔另一個文件時(如果數據庫處于ARCHIVELOG模式),其中一個文件始終可寫。
LGWR以循環方式寫入重做日志文件。當當前重做日志文件填滿時,LGWR開始向下一個可用的重做日志文件中寫入。當最后一個可用的重做日志文件被填滿時,LGWR返回到第一個重做日志文件并寫入,再次開始循環。循環寫入重做日志文件的過程如下圖所示(源自Oracle官網)。每一行旁邊的數字表示LGWR寫入每個重做日志文件的順序。

??根據是否啟用歸檔,LGWR可以重用被填滿的重做日志文件分以下兩種情況:
- 如果歸檔被禁用(數據庫處于NOARCHIVELOG模式),則在將記錄在其中的更改寫入數據文件后,這個被填滿的重做日志文件是可用的。
- 如果啟用了歸檔(數據庫處于ARCHIVELOG模式),則在將記錄的更改寫入數據文件并歸檔后,LGWR就可以使用這個被填滿的重做日志文件。
(1)active(current)和inactive重做日志文件
??Oracle數據庫一次只使用一個重做日志文件來存儲從重做日志緩沖區寫入的重做記錄。LGWR正在主動寫入的重做日志文件稱為當前(current)重做日志文件。
??實例恢復所需的重做日志文件稱為活動(active)重做日志文件。實例恢復不再需要的重做日志文件稱為非活動(inactive)重做日志文件。
??如果您啟用了歸檔(數據庫處于ARCHIVELOG模式),那么在歸檔程序后臺進程(ARCn)將其內容歸檔之前,數據庫不能重用或覆蓋活動在線日志文件。如果禁用了歸檔(數據庫處于 NOARCHIVELOG 模式),則當最后一個重做日志文件已滿時,LGWR 將繼續在序列中的下一個日志文件變為非活動狀態時覆蓋該文件。
(2)日志切換和日志系列號
??日志切換是指數據庫停止寫入一個重做日志文件并開始寫入另一個重做日志文件的點。正常情況下,當當前重做日志文件被完全填滿且必須繼續寫入下一個重做日志文件時,就會發生日志切換。
??但是,您可以配置日志切換,使其定期發生,而不管當前重做日志文件是否已被完全填滿。您也可以手動強制日志切換。
??每次發生日志切換,LGWR開始寫入時,Oracle數據庫為每個重做日志文件分配一個新的日志序列號。當數據庫歸檔重做日志文件時,歸檔的日志保留其日志序列號。一個被循環返回使用的重做日志文件被給出下一個可用的日志序列號。
??每個聯機或歸檔重做日志文件由其日志序列號唯一標識。在崩潰、實例或介質恢復期間,數據庫使用必要的歸檔文件和重做日志文件按日志序列號的升序正確地應用重做日志文件。
二、規劃重做日志
1.多路復用重做日志文件
??為了防止涉及重做日志本身的故障,Oracle數據庫允許多路復用重做日志,這意味著兩個或多個相同的重做日志副本可以自動維護在不同的位置。
??為了最大的好處,這些位置應該在不同的磁盤上。然而,即使重做日志的所有副本都在同一個磁盤上,冗余也可以幫助防止I/O錯誤、文件損壞等。當重做日志文件多路復用時,LGWR將相同的重做日志信息并發寫入多個相同的重做日志文件中,從而消除了單點重做日志故障的問題。
??多路復用是通過創建重做日志文件組來實現的。組由一個重做日志文件及其多路復用副本組成。每一個相同的副本都被認為是組的一個成員。每個重做日志組由一個數字定義,例如組1、組2等等。

??在上圖中,A_LOG1和B_LOG1都是第一組的成員,A_LOG2和B_LOG2都是第二組的成員,依此類推。一個組的每個成員大小必須相同。
??日志文件組的每個成員都是同時處于活動狀態,即由LGWR同時寫入,這由LGWR分配的相同的日志序列號指示。在上圖中,第一個LGWR同時寫A_LOG1和B_LOG1。然后同時寫A_LOG2和B_LOG2,依此類推。LGWR從不同時向不同組的成員寫入(例如,寫入A_LOG1和B_LOG2)。
注意:Oracle建議您復用重做日志文件。如果需要恢復,那么日志文件數據的丟失可能是災難性的。注意,當你復用重做日志時,數據庫必須增加它執行的I/O量。這可能會影響數據庫的整體性能,具體取決于您的配置。
(1)重做日志故障的響應
??當LGWR無法寫入組中的某個成員時,數據庫將該成員標記為INVALID,并向LGWR跟蹤文件和數據庫警報日志寫入錯誤消息,指出無法訪問的文件存在的問題。
??當重做日志成員不可用時,LGWR的具體反應取決于可用性缺失的原因,如下表所示。
| 條件 | LGWR的行為 |
|---|---|
| LGWR 至少可以向組中的一個成員成功寫入 | 寫入照常進行。LGWR向組中可用的成員寫入數據,忽略不可用的成員。 |
| LGWR無法在日志切換時訪問下一個組,因為該組必須被歸檔 | 數據庫操作將暫時停止,直到組變為可用或組被歸檔為止。 |
| 由于介質故障,在日志切換時下一個組的所有成員都不能被LGWR訪問 | Oracle 數據庫返回錯誤,數據庫實例關閉。在這種情況下,您可能需要使用丟失的重做日志對數據庫執行介質恢復。如果數據庫檢查點已經移動到丟失的重做日志之外,則不需要進行介質恢復,因為數據庫已經將重做日志中記錄的數據保存到數據文件中。您只需要刪除不可訪問的重做日志組。如果數據庫沒有歸檔壞日志,在刪除日志之前使用ALTER database CLEAR LOGFILE UNARCHIVED禁用歸檔。 |
| 當LGWR向一個組的所有成員寫入時,該組的所有成員突然變得無法訪問 | Oracle數據庫返回錯誤,數據庫實例立即關閉。在這種情況下,您可能需要執行介質恢復。如果包含日志的介質實際上并沒有丟失——例如,如果日志的驅動器被無意中關閉了——則可能不需要進行介質恢復。在這種情況下,您只需要打開驅動器并讓數據庫執行自動實例恢復。 |
(2)合法與不合法的配置
??在大多數情況下,多路復用重做日志應該是對稱的:所有重做日志組的成員數量應該相同。然而,數據庫并不要求多路復用重做日志是對稱的。
??例如,一個組可以只有一個成員,而其他組可以有兩個成員。此配置可防止磁盤故障暫時影響某些重做日志成員,但使其他成員保持不變。
??一個實例重做日志的唯一要求是它至少有兩個組。合法和非法的多路復用重做日志配置如下圖所示。第二個配置是非法的,因為它只有一個組。
2.在不同的磁盤上放置重做日志成員
??在建立多路復用重做日志時,將一個組的成員放在不同的物理磁盤上。如果單個磁盤故障,則組中只有一個成員對LGWR不可用,而其他成員對LGWR仍可訪問,因此實例可以繼續工作。
??如果你歸檔重做日志,將重做日志成員分散到不同的磁盤上,以消除LGWR和ARCn后臺進程之間的爭用。例如,如果你有兩組多路復用重做日志成員(一個雙工重做日志),將每個成員放在不同的磁盤上,并將存檔目標設置為第五個磁盤。這樣做將避免LGWR(寫入成員)和ARCn(讀取成員)之間的爭用。
??數據文件也應該與重做日志文件放在不同的磁盤上,以減少寫數據塊和重做記錄時的爭用。
3.規劃重做日志文件大小
??在設置重做日志文件的大小時,要考慮是否要歸檔重做日志。應該調整重做日志文件的大小,以便將一個填滿的組歸檔到離線存儲媒介的單個單元中(如磁帶或磁盤),使媒介上未使用的空間最少。
??例如,假設一個磁帶上只能容納一個已填滿的重做日志組,并且有49%的磁帶存儲空間未使用。在這種情況下,最好稍微減小重做日志文件的大小,以便在每個磁帶上可以歸檔兩個日志組。
??同一個多路復用重做日志組的所有成員大小必須相同。不同組的成員可以有不同的大小。然而,在不同組之間使用不同的文件大小并沒有什么好處。如果未將檢查點設置為在日志切換之間發生,請將所有組的大小設置為相同,以確保定期發生檢查點。
??重做日志文件允許的最小大小是4 MB。
4.規劃重做日志文件塊大小
??與數據庫塊大小(可以在2K到32K之間)不同,重做日志文件總是默認塊大小等于磁盤的物理扇區大小。從歷史上看,這通常是512字節(512B)。
??一些較新的大容量磁盤驅動器提供4K字節(4K)扇區大小,以提高ECC能力和提高格式化效率。大多數Oracle數據庫平臺都能夠檢測到這種較大的扇區大小。然后,數據庫自動在這些磁盤上創建具有4K塊大小的重做日志文件。
??然而,當塊大小為4K時,重做浪費會增加。事實上,與512B塊相比,4K塊的重做浪費是顯著的。你可以通過查看VSESSTAT和VSYSSTAT視圖中存儲的統計數據來確定重做浪費的數量。
SYS@orcl> select name,value from v$sysstat where name = 'redo wastage';
NAME VALUE
---------------------------------------------------------------- ----------
redo wastage 773492
??為了避免額外的重做浪費,如果您正在使用仿真模式磁盤- 4K扇區大小的磁盤驅動器,在磁盤接口上模擬512B扇區大小,您可以通過指定512B塊大小或在某些平臺上指定1K塊大小來覆蓋重做日志的默認4K塊大小。但是,當重做日志寫與4K物理扇區的開始沒有對齊時,將導致顯著的性能下降。因為4K物理扇區中8個512B槽中的7個沒有對齊,所以通常會發生性能下降。因此,在4K扇區大小的仿真模式磁盤上規劃重做日志塊大小時,必須在性能和磁盤浪費之間的評估權衡。
??可以在CREATE DATABASE、ALTER DATABASE和CREATE CONTROLFILE語句中使用BLOCKSIZE關鍵字指定聯機重做日志文件的塊大小。在某些平臺上,允許的塊大小是512和4096。在其他平臺上,允許的塊大小為1024和4096。
??下面的語句添加了一個塊大小為512B的重做日志文件組。BLOCKSIZE 512子句有效,但對于512B扇區大小的硬盤不是必需的。對于4K扇區大小的仿真模式磁盤,BLOCKSIZE 512子句將覆蓋默認的4K大小。
ALTER DATABASE orcl ADD LOGFILE
GROUP 4 ('/u01/logs/orcl/redo04a.log','/u01/logs/orcl/redo04b.log')
SIZE 100M BLOCKSIZE 512 REUSE;
# 查看重做日志文件的塊大小
SYS@orcl> select blocksize from v$log where group# = 4;
BLOCKSIZE
----------
512
5.選擇重做日志文件的數量
??為數據庫實例確定適當的重做日志文件數量的最佳方法是測試不同的配置。在不妨礙LGWR寫入重做日志信息的情況下,最優配置的組盡可能少。
??在某些情況下,一個數據庫實例可能只需要兩個組。在其他情況下,數據庫實例可能需要額外的組,以確保LGWR始終可以使用回收的組。在測試期間,確定當前重做日志配置是否令人滿意的最簡單方法是檢查LGWR跟蹤文件和數據庫警報日志的內容。如果消息顯示LGWR經常需要等待某個組,因為檢查點未完成或組還未被歸檔,則需要添加組。
??在設置或更改實例重做日志的配置之前,考慮可以限制重做日志文件數量的參數。以下參數限制了可以添加到數據庫中的重做日志文件的數量:
- MAXLOGFILES:CREATE DATABASE語句中使用的MAXLOGFILES參數確定每個數據庫的最大重做日志文件組數。組值范圍為1到MAXLOGFILES。您可以超過MAXLOGFILES限制,控制文件將根據需要進行擴展。如果沒有為CREATE DATABASE語句指定MAXLOGFILES,則數據庫使用特定于操作系統的默認值。
- MAXLOGMEMBERS:CREATE DATABASE語句中使用的MAXLOGMEMBERS參數確定每個組的最大成員數。與MAXLOGFILES一樣,覆蓋此上限的惟一方法是重新創建數據庫或控制文件。因此,在創建數據庫之前考慮這個限制是很重要的。如果沒有為CREATE DATABASE語句指定MAXLOGMEMBERS參數,則數據庫使用操作系統默認值。
6.控制歸檔滯后
??您可以強制所有已啟用的重做日志線程按一定的時間間隔切換當前日志。
??在主/備數據庫配置中,通過在主站點歸檔重做日志,然后將其傳輸到備數據庫,備用數據庫可以使用更改。備用數據庫正在應用的更改可能滯后于主數據庫上發生的更改,因為備用數據庫必須等待主數據庫重做日志中的更改被歸檔(到歸檔的重做日志中),然后再傳送給它。要限制這種延遲,可以設置ARCHIVE_LAG_TARGET初始化參數。設置此參數可使您以秒為單位指定延遲時間。
(1)設置ARCHIVE_LAG_TARGET初始化參數
??當你設置ARCHIVE_LAG_TARGET初始化參數時,會導致數據庫定期檢查實例的當前重做日志,并決定何時切換日志。
如果滿足以下條件,則實例將切換日志:
- 當前日志是在n秒之前創建的,當前日志的估計歸檔時間是m秒(與當前日志中使用的重做塊的數量成正比),其中n + m超過了ARCHIVE_LAG_TARGET初始化參數的值。
- 當前日志包含重做記錄。
??在Oracle Real Application Clusters環境中,如果其他線程落后,實例還會導致其他線程切換并存檔它們的日志。當集群中的一個實例比其他實例更空閑時(比如當您運行Oracle Real Application Clusters的兩個節點主/備配置時),這可能特別有用。
??ARCHIVE_LAG_TARGET初始化參數為數據庫當前日志提供了可以持續的最長時間(以秒為單位)的上限。因為還考慮了估計的存檔時間,所以這不是確切的日志切換時間。
# 將日志切換間隔設置為30分鐘(典型值)。
ARCHIVE_LAG_TARGET = 1800
# ARCHIVE_LAG_TARGET是一個動態參數,可以通過ALTER SYSTEM set語句設置:
## 例如設置其值為30s,設置之前查看日志組的狀態
SYS@orcl> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 82 INACTIVE
2 83 CURRENT
3 81 INACTIVE
4 0 UNUSED
## 設置archive_lag_target
SYS@orcl> alter system set archive_lag_target = 30;
System altered.
## 30s后再次查看日志組的信息
SYS@orcl> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 82 INACTIVE
2 83 ACTIVE
3 81 INACTIVE
4 84 CURRENT
## 查看完之后,可以將該參數設置為0,禁用基于時間的日志切換功能
??值為0將禁用此基于時間的日志切換功能。這是默認設置。
??即使沒有備用數據庫,也可以設置ARCHIVE_LAG_TARGET初始化參數。例如,可以專門設置ARCHIVE_LAG_TARGET參數,以強制切換和歸檔日志。
注意:在Oracle Real Application Clusters環境的所有實例中,ARCHIVE_LAG_TARGET參數必須設置為相同的值。如果不這樣做,就會導致不可預測的行為。
(2)ARCHIVE_LAG_TARGET設置的影響因素
??在設置ARCHIVE_LAG_TARGET初始化參數時,有幾個因素需要考慮。
在確定是否要設置ARCHIVE_LAG_TARGET初始化參數以及確定該參數的值時,需要考慮以下因素。
- 切換(以及歸檔)日志的開銷
- 由于日志滿的情況,發生正常日志切換的頻率有多高
- 在備用數據庫中可以容忍丟失多少重做
??如果自然日志切換的頻率比指定的間隔要高,那么設置ARCHIVE_LAG_TARGET可能沒什么用。然而,在重做生成速度不正常的情況下,間隔確實為每個當前日志覆蓋的時間范圍提供了上限。
??如果ARCHIVE_LAG_TARGET初始化參數設置為非常低的值,可能會對性能產生負面影響。這可能會迫使頻繁切換日志。將該參數設置為合理的值,以免降低主數據庫的性能。
三、創建重做日志組和成員
??為數據庫規劃重做日志,并在數據庫創建過程中創建所有所需的重做日志文件組和成員。但是,在有些情況下,您可能需要創建額外的組或成員。例如,向重做日志添加組可以糾正重做日志組可用性問題。
??要創建新的重做日志組和成員,您必須擁有ALTER DATABASE系統權限。數據庫最多可以有MAXLOGFILES個組。
1.創建重做日志組
??要創建一組新的重做日志文件,使用SQL語句ALTER DATABASE和ADD LOGFILE子句。
# 1.例如,下面的語句向數據庫添加了一組新的重做日志:
SYS@orcl> alter database add logfile ('/u01/logs/orcl/redo05a.log','/u01/logs/orcl/redo05b.log') size 100M;
Database altered.
## 查看驗證
SYS@orcl> select group#,member from v$logfile where member like '%redo05%';
GROUP# MEMBER
---------- ------------------------------------------------------------
5 /u01/logs/orcl/redo05a.log
5 /u01/logs/orcl/redo05b.log
SYS@orcl> select group#,sequence#,status from v$log;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 82 INACTIVE
2 83 INACTIVE
3 85 CURRENT
4 84 INACTIVE
5 0 UNUSED
## 可以發現,如果我們在添加日志組時,沒有通過group關鍵字指定組號,oracle會為其分配下一個可用的組號(例如,4的下一個就是5)
# 2.您還可以使用group子句指定標識組的編號:
SYS@orcl> alter database add logfile group 7 ('/u01/logs/orcl/redo07a.log','/u01/logs/orcl/redo07b.log') size 100M blocksize 512;
Database altered.
## 查看驗證
SYS@orcl> select group#,member from v$logfile where member like '%redo07%';
GROUP# MEMBER
---------- ------------------------------------------------------------
7 /u01/logs/orcl/redo07a.log
7 /u01/logs/orcl/redo07b.log
??使用組號可以使重做日志組的管理更容易。但是,組號必須在1到MAXLOGFILES之間。不要跳過重做日志文件組編號(即不要將您的組編號為10、20、30等),否則將消耗數據庫控制文件中不必要的空間。BLOCKSIZE子句是可選的。
注意:提供新日志成員的完整路徑名,以指定它們的位置。否則,將在數據庫服務器的默認目錄或當前目錄中創建文件,具體取決于您的操作系統。
2.創建重做日志成員
??在某些情況下,可能沒有必要創建一組完整的重做日志文件。一個組可能已經存在,但不完整,因為該組的一個或多個成員被刪除(例如,因為磁盤故障)。在這種情況下,您可以向現有的組中添加新成員。
??為現有的組創建新的重做日志成員。
- 運行帶有ADD LOGFILE MEMBER子句的ALTER DATABASESQL語句。
# 1.為重做日志組號4添加一個新的重做日志成員
SYS@orcl> alter database add logfile member '/u01/logs/orcl/redo04c.log' to group 4;
Database altered.
## 查看驗證
SYS@orcl> select group#,member from v$logfile where member like '%redo04%';
GROUP# MEMBER
---------- ----------------------------------------
4 /u01/logs/orcl/redo04a.log
4 /u01/logs/orcl/redo04b.log
4 /u01/logs/orcl/redo04c.log
# 2.當使用ALTER DATABASE語句時,您可以通過在TO子句中指定組的所有其他成員來標識目標組,如下面的示例所示:
SYS@orcl> alter database add logfile member '/u01/logs/orcl/redo07c.log' to ('/u01/logs/orcl/redo07a.log','/u01/logs/orcl/redo07b.log');
SYS@orcl> select group#,member,status from v$logfile where member like '%redo07%';
GROUP# MEMBER STATUS
---------- ---------------------------------------- -------
7 /u01/logs/orcl/redo07a.log
7 /u01/logs/orcl/redo07b.log
7 /u01/logs/orcl/redo07c.log INVALID
??注意,必須指定文件名,但不需要指定大小。新成員的大小是由現有組成員的大小確定的。
注意:完全指定新日志成員的文件名,以指示應該在哪里創建操作系統文件。否則,將在數據庫服務器的默認目錄或當前目錄中創建文件,具體取決于您的操作系統。您可能還會注意到,新日志成員的狀態顯示為INVALID。這是正常的,當它第一次使用時,它將更改為活動(空白)。
四、重定位和重命名重做日志成員
??您可以使用操作系統命令重新定位重做日志,然后使用ALTER DATABASE語句使數據庫知道它們的新名稱(位置)。
??這個過程是必要的,例如,如果當前用于一些重做日志文件的磁盤將要被移除,或者如果數據文件和幾個重做日志文件存儲在同一個磁盤上,應該將它們分開以減少爭用。
??要重命名重做日志成員,您必須具有ALTER DATABASE系統權限。此外,您可能還需要操作系統特權來將文件復制到所需的位置,以及打開和備份數據庫的特權。
??在重新定位重做日志或對數據庫進行任何其他結構更改之前,請完全備份數據庫,以防在執行操作時遇到問題。作為預防措施,在重命名或重新定位一組重做日志文件后,立即備份數據庫控制文件。
重命名重做日志成員:
# 1.關閉數據庫
SYS@orcl> shutdown;
# 2.將重做日志遷移到新的位置(以日志組5為例)
[oracle@oracle4 ~]$ mkdir /u01/logs/orcl_new
[oracle@oracle4 ~]$ mv /u01/logs/orcl/redo05a.log /u01/logs/orcl_new/redo05A.log
[oracle@oracle4 ~]$ mv /u01/logs/orcl/redo05b.log /u01/logs/orcl_new/redo05B.log
[oracle@oracle4 ~]$ ll /u01/logs/orcl_new
total 204808
-rw-r----- 1 oracle dba 104858112 Dec 7 08:58 redo05A.log
-rw-r----- 1 oracle dba 104858112 Dec 7 08:58 redo05B.log
# 3.啟動數據庫到掛載狀態
SYS@orcl> startup mount;
# 4.重命名重做日志成員
## 使用帶有RENAME FILE子句的ALTER DATABASE語句重命名數據庫重做日志文件。
SYS@orcl> alter database rename file '/u01/logs/orcl/redo05a.log','/u01/logs/orcl/redo05b.log'
to '/u01/logs/orcl_new/redo05A.log','/u01/logs/orcl_new/redo05B.log';
Database altered.
# 5.打開數據庫
## 重做日志更改在數據庫打開時生效。
SYS@orcl> alter database open;
Database altered.
## 查看驗證
SYS@orcl> select group#,sequence#,status from v$log where group# = 5;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
5 86 INACTIVE
SYS@orcl> select group#,member from v$logfile where group# = 5;
GROUP# MEMBER
---------- ----------------------------------------
5 /u01/logs/orcl_new/redo05A.log
5 /u01/logs/orcl_new/redo05B.log
五、刪除重做日志組和成員
??在某些情況下,您可能希望刪除整個重做日志成員組。
??例如,您希望減少實例重做日志中的組數。在另一種情況下,您可能希望刪除一個或多個特定的重做日志成員。例如,如果磁盤發生故障,您可能需要刪除故障磁盤上的所有重做日志文件,以便數據庫不會嘗試寫入不可訪問的文件。在其他情況下,特定的重做日志文件不再需要。例如,文件可能存儲在不合適的位置。
1.刪除日志組
??要刪除重做日志組,必須具有ALTER DATABASE系統權限。在刪除重做日志組之前,需要考慮以下限制和注意事項:
- 一個實例至少需要兩組重做日志文件,而不考慮組中的成員數。(一個組由一個或多個成員組成。)
- 當重做日志組處于非活動狀態時,才可以刪除重做日志組。如果必須刪除當前組,則首先強制進行日志切換。
- 在刪除重做日志組之前,請確保重做日志組已存檔(如果啟用了存檔)。要查看是否發生了這種情況,請使用V$LOG視圖。
SYS@orcl> select group#,sequence#,archived,status from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 88 YES INACTIVE
2 89 NO CURRENT
3 85 YES INACTIVE
4 84 YES INACTIVE
5 86 YES INACTIVE
7 87 YES INACTIVE
刪除重做日志組:
# 1.刪除重做日志組7
SYS@orcl> alter database drop logfile group 7;
# 2.如果沒有使用Oracle Managed Files,請在操作系統層面刪除響應的日志文件
[oracle@oracle4 ~]$ ll /u01/logs/orcl/redo07*
-rw-r----- 1 oracle dba 104858112 Dec 7 10:57 /u01/logs/orcl/redo07a.log
-rw-r----- 1 oracle dba 104858112 Dec 7 10:57 /u01/logs/orcl/redo07b.log
-rw-r----- 1 oracle dba 104858112 Dec 6 23:23 /u01/logs/orcl/redo07c.log
[oracle@oracle4 ~]$ rm -f /u01/logs/orcl/redo07*
??當重做日志組從數據庫中刪除,并且您沒有使用Oracle Managed Files特性時,操作系統文件不會從磁盤中刪除。相反,會更新關聯數據庫的控制文件以從數據庫結構中刪除組的成員。刪除重做日志組后,確保成功完成刪除,然后使用相應的操作系統命令刪除的重做日志文件。
??當使用Oracle Managed Files時,操作系統文件的清理會自動完成。
2.刪除重做日志成員
??要刪除重做日志成員,必須具有ALTER DATABASE系統權限。在刪除單個重做日志成員之前,請考慮以下限制和注意事項:
- 允許刪除重做日志文件,以使多路復用重做日志暫時變得不對稱。但是,您應該立即糾正這種情況,以便所有組至少有兩個成員,從而消除重做日志可能出現的單點故障。
- 一個實例總是需要至少兩個有效的重做日志文件組,而不管組中的成員數量(一個組由一個或多個成員組成。)。如果要刪除的成員是該組的最后一個有效成員,則在其他成員生效之前不能刪除該成員。要查看重做日志文件狀態,使用V$LOGFILE視圖。如果數據庫無法訪問重做日志文件,重做日志文件將變為INVALID。如果數據庫懷疑它不完整或不正確,它就變成STALE。過期的日志文件在下一次將其組設置為活動組時再次有效。
- 只有當重做日志成員不屬于活動組或當前組時,才可以刪除它。要刪除活動組的成員,首先強制發生日志切換。
- 在刪除重做日志成員之前,請確保重做日志成員所屬的組已存檔(如果啟用了存檔)。要查看是否發生了這種情況,請使用V$LOG視圖。
# 1.刪除特定的非活動重做日志成員
## 運行帶有DROP LOGFILE MEMBER子句的ALTER DATABASE語句。
## 例如刪除日志組4中個一個成員日志文件
## 先確定組狀態和是否已歸檔
SYS@orcl> select group#,status,archived from v$log where group# = 4;
GROUP# STATUS ARC
---------- ---------------- ---
4 INACTIVE YES
## 查看重做日志組4中的成員
SYS@orcl> select group#,member,type from v$logfile where group# = 4;
GROUP# MEMBER TYPE
---------- ---------------------------------------- -------
4 /u01/logs/orcl/redo04a.log ONLINE
4 /u01/logs/orcl/redo04b.log ONLINE
4 /u01/logs/orcl/redo04c.log ONLINE
## 刪除重做日志成員/u01/logs/orcl/redo04c.log
SYS@orcl> alter database drop logfile member '/u01/logs/orcl/redo04c.log';
Database altered.
??當重做日志成員從數據庫中刪除時,不會從磁盤中刪除操作系統文件。相反,更新關聯數據庫的控制文件以從數據庫結構中刪除成員。刪除重做日志文件后,確保刪除成功,然后使用相應的操作系統命令刪除刪除的重做日志文件。
??若要刪除活動組的成員,必須首先強制進行日志切換。
六、強制日志切換
??日志切換發生在LGWR停止寫入一個重做日志組并開始寫入另一個重做日志組時。默認情況下,當當前重做日志文件組被填滿時,會自動發生日志切換。
??您可以強制日志切換使當前活動的組變為非活動,并可用于重做日志維護操作。例如,您希望刪除當前活動的組,但直到該組處于非活動狀態時才能夠這樣做。如果當前活動的組必須在完全填滿該組成員之前的特定時間存檔,您可能還希望強制進行日志切換。這個選項在需要很長時間來填充大重做日志文件的配置中很有用。
??要強制日志切換,必須具有ALTER SYSTEM權限。
# 運行帶有SWITCH LOGFILE子句的ALTER SYSTEM語句。
SYS@orcl> alter system switch logfile;
System altered.
七、驗證重做日志文件中的塊
??您可以配置數據庫使用校驗和來驗證重做日志文件中的塊。
??如果你將初始化參數DB_BLOCK_CHECKSUM設置為TYPICAL(默認值),那么數據庫在將每個數據庫塊寫入磁盤時計算一個校驗和,包括將每個重做日志塊寫入當前日志時。
??Oracle數據庫使用校驗和來檢測重做日志塊中的損壞。當恢復過程中從歸檔日志中讀取重做日志塊,以及將該塊寫入歸檔日志文件時,數據庫將驗證重做日志塊。如果檢測到損壞,將引發一個錯誤并將其寫入警報日志。
??如果在嘗試歸檔重做日志塊時檢測到損壞,系統會嘗試從組中的其他成員讀取該重做日志塊。如果該塊在重做日志組的所有成員中都已損壞,則無法進行歸檔。
??DB_BLOCK_CHECKSUM參數的值可以使用ALTER SYSTEM語句動態更改。
注意:啟用DB_BLOCK_CHECKSUM會有輕微的開銷,并降低數據庫性能。監視數據庫性能,以確定使用數據塊校驗和檢測損壞的好處是否大于對性能影響。
八、清除重做日志文件
??重做日志文件可能在數據庫打開時損壞,并最終停止數據庫活動,因為無法繼續存檔。
??在這種情況下,在不關閉數據庫的情況下重新初始化文件:
- 運行ALTER DATABASE CLEAR LOGFILE SQL語句。
# 清除重做日志組4中的日志文件
SYS@orcl> alter database clear logfile group 4;
Database altered.
這個語句克服了兩種不可能刪除重做日志的情況:
- 如果只有兩個日志組
- 損壞的重做日志文件屬于當前組
??如果損壞的重做日志文件尚未存檔,則在語句中使用UNARCHIVED關鍵字。
alter database clear unarchived logfile group 4;
??此語句清除已損壞的重做日志并避免將其存檔。已清除的重做日志即使沒有歸檔,也可以使用。
??如果清除恢復某個備份所需的日志文件,則不能再從該備份中進行恢復。數據庫在警報日志中寫入一條消息,描述您無法從中恢復的備份。
注意:如果清除了未歸檔的重做日志文件,則應該對數據庫進行另一次備份。
??要清除使脫機表空間聯機所需的未歸檔重做日志,請使用 ALTER DATABASE CLEAR LOGFILE 語句中的UNRECOVERABLE DATAFILE 子句。
??如果清除使脫機表空間聯機所需的重做日志,則將無法使表空間再次聯機。您將不得不刪除表空間或執行不完全恢復。注意,正常脫機的表空間不需要恢復。
九、設置FORCE LOGGING的優先級
??您可以在不同級別上設置FORCE LOGGING和NOLOGGING,例如針對數據庫、可插拔數據庫(PDB)、表空間或數據庫對象。當FORCE LOGGING設置為一個或多個級別時,FORCE LOGGING設置的優先級決定重做日志中記錄的內容。
??您可以將多租戶容器數據庫 (CDB) 和非 CDB 置于FORCE LOGGING模式。在這種模式下,數據庫將記錄數據庫中除了臨時表空間和臨時段的更改之外的所有更改。此設置優先于您為單個表空間指定的任何 NOLOGGING 或 FORCE LOGGING 設置以及您為單個數據庫對象指定的任何 NOLOGGING 設置,并且獨立于這些設置。
??您還可以將表空間設置為FORCE LOGGING模式。數據庫記錄對表空間中所有對象的所有更改(臨時段除外),會覆蓋單個對象的任何NOLOGGING設置。
??此外,您還可以通過logging_clause子句為各種類型的數據庫對象指定日志屬性,以確定某些DML操作是否將被記錄在重做日志文件中((logging:記錄,NOLOGGING:不記錄)。
您可以為以下類型的數據庫對象指定日志屬性:
- 表
- 索引
- 物化視圖
日志組的狀態:
- UNUSED:從未寫入過聯機重做日志。這是剛剛添加的重做日志的狀態,或者剛好在重置(resetlogs)日志之后(當它不是當前重做日志時)。
- CURRENT:當前重做日志。這意味著重做日志是活動的。重做日志可以打開或關閉。
- ACTIVE:日志處于活動狀態,但不是當前日志。它是崩潰恢復所必需的。它可能用于塊恢復。它可能被存檔,也可能不會被存檔。
- CLEARING :在執行ALTER DATABASE CLEAR LOGFILE語句后,將日志重新創建為空日志。日志清除后,狀態變為“UNUSED”。
- CLEARING_CURRENT:正在清除當前日志中的關閉線程。如果切換發生故障,例如I/O錯誤寫入新的日志頭,日志可以保持在這種狀態。
- INACTIVE :實例恢復不再需要的日志。它可能用于介質恢復。它可以存檔,也可以不存檔




