重做日誌管理

来源:http://www.cnblogs.com/jy627625/archive/2016/06/14/5584887.html
-Advertisement-
Play Games

重做日誌是對用戶的DML和DDL操作所做的記錄,它是保證資料庫安全的一種重要手段。當用戶執行DML或DDL命令時,資料庫伺服器將生成重做日誌,並將其記錄在重做日誌文件中。為了保證重做日誌文件的安全,需要對它們進行歸檔。 如果資料庫出現故障,可以利用重做日誌文件和歸檔日誌文件進行實例恢復或者介質恢復。 ...


重做日誌是對用戶的DML和DDL操作所做的記錄,它是保證資料庫安全的一種重要手段
當用戶執行DML或DDL命令時,資料庫伺服器將生成重做日誌,並將其記錄在重做日誌文件中。
為了保證重做日誌文件的安全,需要對它們進行歸檔

如果資料庫出現故障,可以利用重做日誌文件和歸檔日誌文件進行實例恢復或者介質恢復。
無論是重做日誌文件還是歸檔日誌文件,都是以二進位的形式記錄重做日誌的。
用戶如果需要瞭解這些文件的內容,就需要對它們進行分析,將日誌信息轉化為文本形式。
下麵主要內容包括重做日誌文件的管理、歸檔日誌文件的管理以及日誌分析等內容。

與重做日誌有關的內容較多,接下來首先對這些內容做一次綜合介紹,以使對重做日誌有個全面、深刻的認識。
當用戶執行SQL語句時,在用戶進程和伺服器進程之間需要建立一條連接。

用戶進程向伺服器進程發送SQL語句,伺服器進程對這些SQL語句進行解析,並生成執行計劃,然後將解析代碼和執行計劃存儲在SGA 的庫緩衝區中,然後按照執行計劃執行SQL語句。
在執行階段,伺服器進程首先檢查用戶訪問的數據是否已經位於資料庫高速緩存中。
如果是,則直接在資料庫高速緩存的緩衝區中訪問數據,否則,需要從數據文件中將對應的數據塊讀到資料庫高速緩存中。
如果用戶的SQL命令是DML或DDL ,那麼在訪問數據之前首先生成重做日誌,並將重做日誌記錄在重做日誌緩衝區中,然後修改資料庫高速緩存中的緩衝區。
被修改的緩衝區叫做臟緩衝區。
重做日誌緩衝區是SGA的一部分,它的作用是記錄資料庫中的重做日誌

重做日誌是對用戶執行的DML或DDL操作的記錄,其中包括被修改的數據塊、修改的位置以及修改後的數據等信息。
重做日誌緩衝區的大小由初始化參數LOG_BUFFER指定。

當實例啟動時,在記憶體中按照這個參數的值為重做日誌緩衝區分配記憶體空間。

從上面的描述可以看到,當用戶在修改數據時,伺服器進程首先生成重做日誌,然後才修改緩衝區中的數據。
無論是重做日誌還是被修改後的數據,都是位於記憶體中的。

由於記憶體中的數據是易消失的, Oracle提供了兩個後臺進程,用於將這些數據寫入磁碟上的文件中。
其中DBWR 的作用是在一定的時機下將資料庫高速緩存中的臟緩衝區寫入數據文件, LGWR進程的作用是在一定的時機下將重做日誌緩衝區中的內容寫入重做日誌文件。
DBWR和LGWR 進程的執行時機並不是同步的,但是在DBWR 工作之前, LGWR一定將重做日誌寫入了重做日誌文件中。
用戶在進行一次數據訪問時,儘管被修改的數據可能已經寫入了數據文件,重做日誌也可能寫入了重做日誌文件,但這次訪問並不一定是一個有效的事務,因為對資料庫所做的任何修改都必須同時記錄在數據文件、控制文件和重做日誌文件中。
Oracle是通過SCN來維護這個一致狀態的。

資料庫伺服器每執行一個事務,都將產生一個新的、遞增的SCN 。

如果用戶沒有提交事務,新的SCN是不被寫入任何一個文件的。
這時如果系統突然斷電,那麼資料庫伺服器在重新啟動時, SMON後臺進程將檢查數據文件、控制文件和重做日誌文件中的SCN ,並回滾所有的未提交事務,然後打開資料庫。
如果用戶在訪問數據之後提交了事務,那麼重做日誌緩衝區的重做日誌連同最新的SCN一起被寫入重做日誌文件。
既然SCN和重做日誌一起被寫入了重做日誌文件,實例恢復和介質恢復就成為可能
如果發生了系統斷電或者數據文件損壞等情況,可以根據重做日誌文件的內容對資料庫中的數據進行恢復。
用戶提交事務後,最新的SCN僅僅寫入了重做日誌文件,而數據文件和控制文件中SCN的寫入則依賴於檢查點
檢查點是一種資料庫事件,當資料庫伺服器發生檢查點時, DBWR進程將資料庫高速緩存中的所有臟緩衝區寫入數據文件,並且使數據文件、控制文件和重做日誌文
件中的SCN達到一致狀態

檢查點是由後臺進程CKPT發出的, CKPT進程在一定的時機發生檢查點,同步數據文件、控制文件和重做日誌文件的狀態。
假設在用戶提交事務後CKPT進程恰好發出一個檢查點,這時三種文件的狀態完全一致,如果這時系統突然斷電,那麼資料庫伺服器在重新啟動時,可以直接打開資料庫,不需要進行實例恢復,所以這次啟動會很快。
如果在用戶提交事務後CKPT還沒有來得及發出檢查點時系統突然斷電,那麼資料庫伺服器在重新啟動時就需要進行實例恢復。
在這種情況下,數據文件和控制文件中的SCN應該是一致的,並且小於重做日誌文件中的SCN 。
SMON後臺進程將檢測到三個文件中的SCN 不一致,於是將兩個SCN之間的所有已經提交的事務重新執行一遍,並回滾所有未提交的事務,然後再打開資料庫。
Oracle利用這種方法來保證用戶已經提交的事務不受系統故障的影響。

當用戶執行DML操作時,伺服器進程將修改前的數據首先寫入回滾段,然後在資料庫高速緩存中對數據進行修改。
如果用戶提交了事務,回滾段中的數據成為無效數據。

如果用戶回滾了該事務,那麼回滾段中的數據將被寫回原來位置,用戶對這些數據所做的修改便宣告無效。
因為重做日誌緩衝區的大小是有限的,而且它不能永久存儲數據,因此重做日誌需要被寫入重做日誌文件。
在資料庫中一般有若幹個重做日誌組,每個日誌組中有若幹個日誌成員,資料庫伺服器以迴圈的方式將重做日誌寫入這些重做日誌組。
當一組重做日誌文件被寫滿後,資料庫伺服器自動切換到下一個日誌組。
當最後一組重做日誌文件被寫滿後,資料庫伺服器又自動切換到第-組。
在資料庫伺服器切換日誌時,新的重做日誌被寫入重做日誌文件,文件中原來的內容將被覆蓋。
為了保留以前的重做日誌,需要對重做日誌文件進行歸檔。

重做日誌文件的歸檔是由後臺進程ARCH完成的。

重做日誌的規劃

在創建資料庫之前,對重做日誌進行詳細的規劃是很有必要的。

重做日誌的規劃包括重做日誌緩衝區規劃、重做日誌組規劃以及重做日誌文件的規劃。
通過對重做日誌進行規劃,不僅可以提高資料庫系統的性能,而且能夠保證重做日誌的安全。

重做日誌緩衝區的規劃

當用戶執行一個事務時,伺服器進程首先生成重做日誌,並記錄在重做日誌緩衝區中,而不是將其直接寫入重做日誌文件中,這樣做的好處當然是因為記憶體的讀寫速度比硬碟快得多。
在重做日誌緩衝區中可以存儲多條重做日誌, LGWR後臺進程在一定的時機下一次將多條重做日誌全部寫入重做日誌文件,這樣可以減少寫磁碟的次數,從而提高資料庫的性能。
重做日誌緩衝區是一段迴圈使用的存儲區,重做日誌將從緩衝區的頭部開始,依次寫入緩衝區的各個部分。
當最後一部分緩衝區被寫滿時,重做日誌又重新被寫入緩衝區的開始部分。
在一定的時機下, LGWR進程將緩衝區中的重做日誌寫入重做日誌文件,並清空這一部分重做日誌所占用的存儲區。
例如,當重做日誌緩衝區1/3 的存儲空間被寫滿時, LGWR進程便開始工作。
重做日誌緩衝區的大小由初始化參數LOG_BUFFER指定,這個參數的值越大, LGWR進程寫入磁碟文件的次數就越少。
因此,只要電腦的記憶體足夠大,儘可能為重做日誌緩衝區分配更大的存儲區,這樣可以減少磁碟寫操作的次數,從而提高系統的性能。

重做日誌文件組的規劃

資料庫中的重做日誌文件是分組的,在一個資料庫中至少需要兩個日誌組,日誌組的最大數目由永久性參數MAXLOGFILES 限定,這個數目在創建資料庫時就已經確定。
在資料庫中創建多個重做日誌組的主要目的是為了對重做日誌文件進行歸檔,因為當資料庫正在使用一個重做日誌文件時,是不能對它進行歸檔的,只有當切換到下一個日誌組時,才能對它進行歸檔
其次,使用多個日誌組可以節約磁碟空間,如果只有一個日誌組,那麼所有的重做日誌都將被寫入這組重做日誌文件,文件的大小將無限制地增加,從而消耗大量的磁碟空間。
重做日誌是以迴圈的方式被寫入各個重做日誌組的。

如圖所示,當資料庫伺服器剛開始運行時,重做日誌被寫入第一個日誌組,當第一個日誌組中的重做日誌文件被寫滿時,資料庫伺服器將自動切換到第二個日誌組,重做日誌將接著被寫入第二個日誌組,依此類推。
當最後一個日誌組被寫滿後,資料庫伺服器將自動切換到第一個日誌組,這樣重做日誌便被寫入第一個日誌組。
當資料庫伺服器再次使用一個日誌組時,這組重做日誌文件中以前的內容將被新的重做日誌覆蓋。

在對重做日誌文件進行規劃時,應該選擇合適的日誌組數目。

如果日誌組太多,可能會消耗太多的磁碟空間。

如果日誌組太少,可能會影響資料庫的性能。

如果資料庫處於歸檔日誌模式下,當資料庫伺服器切換到下一個日誌組時, ARCH進程要對剛剛使用過的日誌組進行歸檔。
如果歸檔的速度較慢,或者資料庫伺服器寫日誌的速度較快,那麼可能在日誌歸檔還沒有結束時,資料庫伺服器又切換到了這個日誌組。
當資料庫伺服器試圖使用一個尚未歸檔或者歸檔未結束的日誌組時, LGWR進程將被阻塞,用戶事務將無法執行,直到歸檔結束。
如果在資料庫中有上述情況發生,在資料庫的警告文件中將產生這樣的警告信息:
checkpoint incomplete ”。

雖然這種情況持續的時間並不長,但是對資料庫性能的影響是比較大的。
解決這種問題的最直接的辦法是在資料庫中增加日誌組,或者將目前的重做日誌文件替換為更大的文件。
重做日誌組數目的選擇需要一定的經驗,資料庫管理員可以在資料庫的運行過程中不斷觀察,在不影響LGWR進程工作的前提下,將日誌組的數目設置為最小的可能值。
如果發生了LGWR進程被阻塞的情況,在警告文件和LGWR進程的跟蹤文件中將產生相應的信息。
資料庫管理員在設置重做日誌組時,可以不斷觀察這個文件的內容,以判斷是否有這種情況發生。
現在以一個實際的例子來說明重做日誌組太少,或者重做日誌文件太小對資料庫系統所造成的不利影響。
在某個實際的生產系統中,資料庫管理員經常接到用戶的抱怨。

在業務最繁忙的時段內,用戶進程向資料庫中寫入一行數據需要等待50秒左右。
通過對資料庫進行診斷後發現,在該資料庫中每天大約產生3GB 的重做日誌,而資料庫中當時只有三個重做日誌組,每個組中的成員只有50MB 。
通過進一步對重做日誌文件的歸檔情況進行觀察發現,在業務最繁忙的時段內,一個重做日誌組被寫滿所用的時間大約為2分鐘,而對一個重做日誌組進行歸檔所
用的時間大約為4分鐘,而且在警告文件中有大量的警告信息:“checkpoint incomplete ”。
在找到問題發生的原因後,解決這個問題就很簡單了。

在該資料庫中另外增加了6個重做日誌組,每個日誌組的日誌成員大小為200MB ,然後刪除了以前的三個重做日誌組,這個問題基本上就解決了。

如何對重做日誌文件進行規劃

在每一個重做日誌組中,至少有一個重做日誌文件,日誌組中的重做日誌文件叫做日誌成員
重做日誌組中的日誌成員在資料庫創建時已經確定,在資料庫的運行過程中也可以添加新的日誌成員。
重做日誌對於資料庫的恢復起著重要的作用。

如果重做日誌文件丟失或者損壞,那麼在資料庫發生故障時,可能無法對數據進行完全恢復。
對於重做日誌文件,應該採取特殊的措施來保證它的可用性。
一般要求一個重做日誌組中至少有兩個日誌成員,這些重做日誌文件的內容、大小完全相同,它們互為鏡像。
LGWR後臺進程將把重做日誌同時寫入日誌組的所有日誌成員。
當其中一個日誌成員丟失或損壞時, LGWR進程將被阻塞

資料庫管理員可以利用其他完好的日誌成員複製一個新的日誌成員,資料庫伺服器則可繼續正常運行。
為了防止磁碟發生故障,一般要求同一個日誌組中的各個日誌成員分別存儲在不同的磁碟上,這樣即使其中一個磁碟發生故障,其他磁碟上的日誌成員的內容仍然是完好的。

下圖表示日誌成員的鏡像情況。

在圖中有三個日誌組,每個日誌組有兩個日誌成員,它們分別存儲在兩個磁碟上。
需要註意的是,同一個日誌組的日誌成員大小完全相同,但不同日誌組的日誌成員可以有不同的大小,而且不同日誌組的成員數目也可以不同

在資料庫伺服器運行的過程中, LGWR迸程可能會遇到以下異常情況:
·某個重做日誌組中的一個日誌成員不可用。LGWR進程將忽略不可用的日誌成員,把重做日誌寫入其他可用的日誌成員。
·某個重做日誌組正在被歸檔或者尚未歸檔。LGWR進程將等待該重做日誌組被歸檔完成。
·某個重做日誌組中的所有日誌成員都不可用。在資料庫伺服器進行日誌切換時,該日誌組對LGWR進程不可用,資料庫實例將自動關閉。
·當前重做日誌組中的所有日誌成員突然都不可用。因為LGWR進程無法寫重做日誌,資料庫實例將自動關閉。

重做日誌文件的管理

在創建資料庫時,重做日誌組與日誌成員的數目已經確定。

在資料庫的運行過程中,可以根據需要增加重做日誌組和日誌成員的數目。
重傲日誌組的最大允許數目由永久參數MAXLOGFILES 限定,每個日誌組最大允許的日誌成員數目由永久參數MAXLOGMEMBERS限定。
如果重做日誌組或日誌成員的數目已經達到規定的極限,就需要重新創建控制文件,增加永久參數的值
在Oracle 11g的資料庫中,這兩個永久性參數是可以突破的。

重做日誌組和日誌成員的數目也可以根據需要適當地減少。
如果日誌成員的存儲位置不合適,還可以改變它們的存儲位置和名稱。

增加重做日誌組

在一個小型應用系統中,由於用戶的事務較少,兩個重做日誌組就可能足夠使用。

對於大型的應用系統,用戶的事務非常繁忙,需要更多的重做日誌組來記錄重做日誌。
如果日誌組太少,可能會發生這樣的情況: LGWR進程在向一個重做日誌組中寫入重做日誌時,發現這個重做日誌組尚未歸檔,或者歸檔尚未結束,於是LGWR進程不得不等待歸檔的結束,整個資料庫伺服器的運行也將暫時停止。

出現上述情況的原因是重做日誌組太少,資料庫管理員應該增加重做日誌組的數目,以免因為重做做日誌組太少而影響資料庫的性能。
增加重做日誌組的命令是ALTER DATABASE ,在這條命令中使用ADD LOGFILE子句指定重做日誌組的組號以及該日誌組中每個日誌成員的名稱及大小。
例如:

ALTER DATABASE ADD LOGFILE GROUP 4

('D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO41.LOG',

'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO42.LOG') SIZE 200M;

重做日誌組的組號應該為現有的最大組號加1 。

當然,也可以不指定組號,這時資料庫伺服器將按照這個原則自動分配組號。
例如:

ALTER DATABASE ADD LOGFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO51.LOG' SIZE 200M;

增加日誌成員

如果一個重做日誌組中只有一個日誌成員,那麼資料庫管理員可能需要向這個日誌組中添加新的日誌成員。
當日誌組中的一個日誌成員損壞時,資料庫管理員需要刪除這個日誌成員,然後再添加一個。
添加日誌成員的命令是ALTER DATABASE ,在這條命令中通過ADD LOGFILE MEMBER子句指定新的日誌成員,並通過TO子句指定目標重做日誌組。
例如:

ALTER DATABASE ADD LOGFILE MEMBER 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO022.LOG' TO GROUP 2;

修改重做日誌文件的位置和名稱

在資料庫的運行過程中,有時可能會根據需要修改重做日誌文件的存儲位置或名稱。

假如一個日誌組的所有成員存儲在同一個磁碟上,為了防止磁碟故障,有必要將這些成員存儲在不同的磁碟上。
重做日誌文件的信息是記錄在控制文件中的,修改重做日誌文件的名稱或存儲位置就意味著修改控制文件中的信息。
在資料庫中無法真正實現重做日誌文件的移動或重命名,這一點需要在操作系統下完成。
因此,要實現重做日誌文件的移動或重命名,需要將資料庫伺服器切換到MOUNT狀態,這時控制文件已經打開,而重做日誌文件尚未打開
首先,關閉資料庫。

註意應該以NORMAL方式關閉資料庫,確保所有的用戶事務正常結束。
接下來需要在操作系統下將重做日誌文件移動到新的存儲位置,或者修改它的名稱。

然後將資料庫伺服器啟動到MOUNT 狀態。修改重做日誌文件的位置或名稱的命令是ALTER DATABASE ,在這條命令中通過RENAME FILES子句修改重做日誌文件的位置或名稱。
實際上,通過這種方法也可以修改數據文件的位置和名稱。

例如,以下語句將重做日誌文件REDO51.LOG 的位置改為“\oracle\product\10.2.0\oradata\ ”,並將名稱修改為REDO52.LOG。

ALTER DATABASE RENAME FILE 'D:\oracle\product\10.2.0\oradata\orcl\REDO51.LOG' TO'D:\oracle\product\10.2.0\oradata\REDO52.LOG';

多個重做日誌文件的位置和名稱可以通過同一條語句來修改

例如,下麵的語句同時將重做日誌文件redo41.log和redo42.log修改為新的名稱。

ALTER DATABASE REAME FILE

'D:\oracle\product\10.2.0\oradata\orcl\REDO41.LOG', 'D:\oracle\product\10.2.0\oradata\orcl\REDO42.LOG'
TO
'D:\oracle\product\10.2.0\oradata\orcl\REDO410.LOG', 'D:\oracle\product\10.2.0\oradata\orcl\REDO420.LOG';

刪除重做日誌文件

在一些情況下,需要將某個重做日誌組或日誌成員刪除

例如,由於某個日誌成員損壞而導致整個重做日誌組不可用,這時需要將損壞的日誌成員刪除。
刪除日誌組時,日誌組中的所有日誌成員都將被刪除。

為了保證資料庫伺服器的運行,應該保證至少有兩個日誌組可用。
另外,如果日誌組的狀態為“CURRENT”,那麼該日誌組是不能刪除的,這時必須進行日誌組的切換。
“CURRENT”狀態表明資料庫伺服器當前正在使用該日誌組。
在刪除日誌組之前,應該先查詢日誌組的狀態。

例如:

SELECT group#, status FROM v$log;

下麵是有關動態性能視圖v$log的相關信息:

V$LOG displays log file information from the control file.

ColumnDatatypeDescription

GROUP#

NUMBER

Log group number

THREAD#

NUMBER

Log thread(線程) number

SEQUENCE#

NUMBER

Log sequence number

BYTES

NUMBER

Size of the log (in bytes)

BLOCKSIZE

NUMBER

Block size of the logfile (512 or 4096)

MEMBERS

NUMBER

Number of members in the log group

ARCHIVED

VARCHAR2(3)

Archive status (YES) or (NO)

STATUS

VARCHAR2(16)

Log status:

  • UNUSED - Online redo log has never been written to. This is the state of a redo log that was just added, or just after a RESETLOGS, when it is not the current redo log.

  • CURRENT - Current redo log. This implies(意味著) that the redo log is active. The redo log could be open or closed.

  • ACTIVE - Log is active but is not the current log. It is needed for crash recovery. It may be in use for block recovery. It may or may not be archived.

  • CLEARING - Log is being re-created as an empty log after an ALTER DATABASE CLEAR LOGFILE statement. After the log is cleared, the status changes to UNUSED.

  • CLEARING_CURRENT - Current log is being cleared of a closed thread. The log can stay in this status if there is some failure in the switch such as an I/O error writing the new log header.

  • INACTIVE - Log is no longer needed for instance recovery. It may be in use for media recovery. It may or may not be archived.

FIRST_CHANGE#

NUMBER

Lowest(最低) system change number (SCN) in the log

FIRST_TIME

DATE

Time of the first SCN in the log

NEXT_CHANGE#

NUMBER

Highest change number (SCN) in the log. When STATUS=CURRENT,NEXT_CHANGE# is set to the highest possible SCN, 281474976710655.

NEXT_TIME

DATE

Time of the highest SCN in the log. When STATUS=CURRENTNEXT_TIME is set to NULL.

CON_ID

NUMBER

The ID of the container to which the data pertains. Possible values include:

  • 0: This value is used for rows containing data that pertain to the entire CDB. This value is also used for rows in non-CDBs.

  • 1: This value is used for rows containing data that pertain to only the root

  • n: Where n is the applicable container ID for the rows containing data

刪除日誌組的命令是ALTER DATABASE ,通過DROP LOGFILE子句指定要刪除的日誌組。
例如,以下語句用於刪除日誌組5:

ALTER DATABASE DROP LOGFILE GROUP 5;

為了保證重做日誌的連續性,在歸檔模式下刪除一個重做日誌組時,應先對其進行歸檔。
重做日誌組的歸檔狀態也可以通過查詢動態性能視圖v$log獲得。
當重做日誌組被刪除後,所有的日誌成員都將被刪除。

在有些情況下,僅需要刪除日誌組的某些日誌成員,其餘成員仍然保留。
比如當某個重做日誌文件損壞時,應該將該日誌成員刪除,以保證資料庫伺服器的正常運行。
刪除日誌成員時,不能刪除重做日誌組中唯一的成員。

為了保證重做日誌文件的安全,應該保證日誌組中至少有兩個成員。
當某個日誌組中僅剩一個日誌成員時,應該及時添加其他的日誌成員。
如果某個日誌組處於“CURRENT”狀態,不能刪除該重做日誌組中的任何成員,

這時必須手工切換日誌,使重做日誌組的狀態切換為“INACTIVE”狀態。
刪除日誌成員的命令仍然是ALTER DATABASE ,在命令中通過DROP LOGFILE MEMBER子句指定要刪除的日誌成員。
因為重做日誌文件的位置和名稱是唯一的,因此,不需要指定該日誌成員所屬的重做日誌組。
例如,下麵的語句用於刪除重做日誌組5的日誌成員REDO52.LOG:
ALTER DATABASE DROP LOGFILE MEMBER 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\REDO52.LOG';

當一個重做日誌組或一個日誌成員被刪除後,對應的重做日誌文件並沒有被真正刪除。為
了徹底刪除重做日誌文件,還需要在操作系統中手工執行刪除操作。

下麵是有關動態性能視圖v$logfile相關信息:

V$LOGFILE contains information about redo log files.

ColumnDatatypeDescription
GROUP# NUMBER Redo log group identifier number
STATUS VARCHAR2(7) Status of the log member:
  • INVALID - File is inaccessible(無法訪問)

  • STALE - File's contents are incomplete(殘缺)

  • DELETED - File is no longer used

  • null - File is in use

TYPE VARCHAR2(7) Type of the logfile:
  • ONLINE

  • STANDBY(待用)

MEMBER VARCHAR2(513) Redo log member name
IS_RECOVERY_DEST_FILE VARCHAR2(3) Indicates whether the file was created in the fast recovery area (YES) or not (NO)

 重做日誌文件的清空

不僅可以刪除重做日誌組和日誌成員,還可以請空重做日誌文件的內容。

在資料庫的運行過程中,如果由於重做日誌文件的損壞而導致歸檔操作無法進行,資料庫伺服器的運行最終將停止,在這種情況下,可以將重做日誌文件的內容全部清空。
清空重做日誌文件的操作可以在不關閉資料庫的情況下進行,即使資料庫中只有兩個日誌組,或者該重做日誌所屬日誌組的狀態為“CURRENT ”。
清空重做日誌文件的命令是ALTER DATABASE ,在這條命令中通過CLEAR LOGFILE子句指定要清空的日誌組,執行清空操作時一個重做日誌組中的所有日誌成員都將被清空。
例如,
下麵的語句用於清空重做日誌組5中的所有日誌成員:

ALTER DATABASE CLEAR LOGFILE GROUP 5;

如果要清空的重做日誌組尚未歸檔,則需要使用UNARCHIEVED關鍵字。

例如:

ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 5;

以上語句在清空尚未歸檔的重做日誌文件時,避免對其進行歸檔。

儘管沒有歸檔,但被清空的重做日誌文件可再次使用了。
需要註意的是,如果清空了尚未歸檔的重做日誌文件,應該對資料庫進行一次備份。
如果-個重做日誌組被清空,而在進行資料庫恢復時恰好需要這個組的重做日誌文件,那麼恢復操作將無法進行。
資料庫伺服器將把這種無法進行的恢復情況寫入警告文件。

重做日誌的切換

資料庫伺服器在運行過程中, LGWR後臺進程將重做日誌寫入重做日誌文件。

當第一個日誌組寫滿後, LGWR將自動切換到第二個日誌組,並將重做日誌寫入第二個日誌組。
依此類推,當最後一個日誌組被寫滿後, LGWR將自動切換到第一個日誌組,這個迴圈的過程是自動進行的。
在有些特殊的情況下,需要手工切換日誌在當前重做日誌組尚未寫滿的時候,強制LGWR進程將重做日誌寫入下一個日誌組
比如,要刪除當前日誌組時,需要先強制切換日誌

手工切換重做日誌的命令是ALTER SYSTEM ,執行手工切換重做日誌任務的用戶需要有ALTER SYSTEM系統許可權
命令的完整格式為:
ALTER SYSTEM SWITCH LOGFILE
無論是自動切換還是手工切換,當發生重做日誌的切換時,日誌序列號將自動加一,日誌序列號和當前的SCN被寫入控制文件。
隨後CKPT後臺進程將發出檢查點,將SCN寫入控制文件和數據文件,然後撤活DBWR後臺進程,將資料庫高速緩存中的臟緩衝區寫入數據文件。
儘管重做日誌組是迴圈使用的,但是日誌序列號卻是無限遞增的

每次發生重做日誌的切換時,資料庫伺服器為當前重做日誌組指定一個日誌序列號,這個序列號是在前一個序列號的基礎上加一而得的
在對重做日誌文件進行歸檔時,這個序列號被一起寫入了歸檔日誌文件
重做日誌文件和歸檔日誌文件就是通過重做日誌序列號來唯一地標識的

在進行資料庫的恢復時,將按照序列號遞增的順序依次查找所需的重做日誌文件和歸檔日誌文件。

註:在切換日誌時,是根據SEQUENCE#列的值,而不是GROUP#組號。

重做日誌信息的查詢

與重做日誌文件有關的動態性能視圖有以下三個:
• v$log :記錄重做日誌文件組的信息。
• v$logfile :記錄重做日誌文件的信息。
• v$log_history :記錄重做日誌組的切換信息
其中從動態性能視圖v$log可以查詢重做日誌文件組的組號、序列號、大小、是否歸檔、狀態等信息。
例如,以下語句將獲得每個重做日誌組的成員數目、序列號和大小等信息:
SELECT group#,sequence#,bytes/1024/1024 AS MB FROM v$1og;
下麵的查詢語句將獲得每個重做日誌組是否歸檔、狀態以及最小的SCN等信息:
SELECT archived,status,first_change# FROM v$log;

從動態性能視圖v$1ogfile中可以獲得每個重做日誌組中的日誌成員及其狀態等信息。

例如:
SELECT group#,member,status FROM v$logfile;

下麵是有關動態性能視圖v$log_history的相關信息:

V$LOG_HISTORY displays log history information from the control file.

ColumnDatatypeDescription
RECID NUMBER Control file record ID
STAMP NUMBER Control file record stamp
THREAD# NUMBER Thread number of the archived log
SEQUENCE# NUMBER Sequence number of the archived log
FIRST_CHANGE# NUMBER Lowest system change number (SCN) in the log
FIRST_TIME DATE Time of the first entry (lowest SCN) in the log
NEXT_CHANGE# NUMBER Highest SCN in the log
RESETLOGS_CHANGE# NUMBER Resetlogs change number of the database when the log was written
RESETLOGS_TIME DATE Resetlogs time of the database when the log was written

 歸檔日誌管理

對於實際的生產系統來說,重做日誌文件的歸檔是非常重要的。

歸檔日誌管理主要包括修改資料庫的日誌模式、指定歸檔文件的位置和名稱、手工對重做日誌文件進行歸檔等內容。

資料庫的日誌模式

資料庫伺服器有兩種日誌模式:歸檔模式和非歸檔模式

在非歸檔模式下,當一個重做日誌組被寫滿時, LGWR進程將自動切換到下一個重做日誌組,這個重做日誌組中以前的重做日誌將被覆蓋。
而在歸檔模式下,每個重做日誌組在被覆蓋之前都要進行歸檔,生成一個歸檔日誌文件。
重做日誌文件的歸檔對於資料庫的安全有著重要的意義:如果資料庫被破壞,利用重做日誌和歸檔日誌可以進行完全恢復
如果沒有對重做日誌文件進行歸擋,那麼只能進行不完全恢復
現在舉個例子來說明歸檔日誌的作用。

假設某資料庫有三個重做日誌組,在周一的時候資料庫管理員對資料庫做了一次完全備份,以後每天都做一次增量備份,到周四的時候資料庫被破壞。
資料庫管理員首先可以利用最近的一次完全備份將資料庫恢復到周一時的狀態,然後依次利用後面的增量備份把資料庫一直恢復到周三時的狀態。
如果資料庫處於非歸檔模式下,那麼周三到周四的數據將無法恢復。

如果資料庫處於歸檔模式下,在這段時間只要發生過日誌切換,就會產生歸檔日誌文件,資料庫管理員可以利用歸檔日誌聯機重做日誌將資料庫恢復到發生故障之前的狀態。
由此可見,在進行數據的恢復時,最後一段時間沒有被備份的數據完全是依靠重做日誌來恢復的
在預設情況下,資料庫初始處於非歸檔模式下,資料庫管理員可以將資料庫在兩種日誌模式之間進行切換。
如果要確定資料庫當前所處的日誌模式,可以執行命令ARCHIVE LOG LIST 。

資料庫的日誌模式還可以通過以下SELECT語句獲得:

SELECT log_mode FROM v$database;

以下是動態性能視圖v$database的相關信息:

V$DATABASE displays information about the database from the control file.


ColumnDatatypeDescription

DBID

NUMBER

Database identifier calculated when the database is created and stored in all file headers

NAME

VARCHAR2(9)

Name of the database

CREATED

DATE

Creation date of the database. If the control file was re-created using theCREATE CONTROLFILE statement, then this column displays the date that the control file was re-created.

RESETLOGS_CHANGE#

NUMBER

System change number (SCN) at open resetlogs

RESETLOGS_TIME

DATE

Timestamp of open resetlogs

PRIOR_RESETLOGS_CHANGE#

NUMBER

SCN at prior resetlogs

PRIOR_RESETLOGS_TIME

DATE

Timestamp of prior resetlogs

LOG_MODE

VARCHAR2(12)

Archive log mode:

  • NOARCHIVELOG

  • ARCHIVELOG

  • MANUAL

CHECKPOINT_CHANGE#

NUMBER

Last SCN checkpointed

ARCHIVE_CHANGE#

NUMBER

Database force archiving SCN. Any redo log with a start SCN below this will be forced to archive out.

CONTROLFILE_TYPE

VARCHAR2(7)

Type of control file:

  • STANDBY - Indicates that the database is in standby mode

  • CLONE - Indicates a clone database

  • BACKUP | CREATED - Indicates the database is being recovered using a backup or created control file

  • CURRENT - database is available for general use

CONTROLFILE_CREATED

DATE

Creation date of the control file

CONTROLFILE_SEQUENCE#

NUMBER

Control file sequence number incremented by control file transactions

CONTROLFILE_CHANGE#

NUMBER

Last SCN in backup control file; null if the control file is not a backup

CONTROLFILE_TIME

DATE

Last timestamp in backup control file; null if the control file is not a backup

OPEN_RESETLOGS

VARCHAR2(11)

(NOT ALLOWED | ALLOWED | REQUIRED) Indicates whether the next database open allows or requires the resetlogs option

VERSION_TIME

DATE

Version time

OPEN_MODE

VARCHAR2(20)

Open mode information:

  • MOUNTED

  • READ WRITE

  • READ ONLY

  • READ ONLY WITH APPLY - A physical standby database is open in real-time query mode

PROTECTION_MODE

VARCHAR2(20)

Protection mode currently in effect for the database:

  • MAXIMUM PROTECTION - Database is running in maximized protection mode

  • MAXIMUM AVAILABILITY - Database is running in maximized availability mode

  • RESYNCHRONIZATION - Database is running in resynchronization mode

  • MAXIMUM PERFORMANCE - Database is running in maximized performance mode

  • UNPROTECTED - Database is unprotected (this normally occurs when the primary database is mounted and not open)

PROTECTION_LEVEL

VARCHAR2(20)

Aggregated protection mode currently in effect for the database:

  • MAXIMUM PROTECTION - Database is running in maximized protection mode

  • MAXIMUM AVAILABILITY - Database is running in maximized availability mode

  • RESYNCHRONIZATION - Database is running in resynchronization mode

  • MAXIMUM PERFORMANCE - Database is running in maximized performance mode

  • UNPROTECTED - Database is unprotected (this normally occurs when the primary database is mounted and not open)

Note: This column is an aggregation of the PROTECTION_MODE of all standby archive log destinations.

REMOTE_ARCHIVE

VARCHAR2(8)

Value of the REMOTE_ARCHIVE_ENABLE initialization parameter

ACTIVATION#

NUMBER

Number assigned to the database instantiation

SWITCHOVER#

NUMBER

Number assigned to the database switchover

DATABASE_ROLE

VARCHAR2(16)

Current role of the database:

  • SNAPSHOT STANDBY

  • LOGICAL STANDBY

  • PHYSICAL STANDBY

  • PRIMARY

  • FAR SYNC

ARCHIVELOG_CHANGE#

NUMBER

Highest NEXT_CHANGE# (from the V$ARCHIVED_LOG view) for an archive log

ARCHIVELOG_COMPRESSION

VARCHAR2(8)

Status of the archive log compression (ENABLED) or (DISABLED)

SWITCHOVER_STATUS

VARCHAR2(20)

Indicates whether switchover is allowed:

  • NOT ALLOWED - On a primary database, this status indicates that there are no valid and enabled standby databases. On a standby database, this status indicates that a switchover request has not been received from the primary database.

  • SESSIONS ACTIVE - The database has active sessions. On a physical standby database, the WITH SESSION SHUTDOWN SQL clause must be specified to perform a role transition while in this state. On a logical standby database, a role transition can be performed while in this state, but the role transition will not complete until all current transactions have committed.

  • SWITCHOVER PENDING - On a physical standby database, this status indicates that a switchover request has been received from the primary database and is being processed. A physical standby database cannot switch to the primary role while in this transient state.

  • SWITCHOVER LATENT - On a physical standby database, this status indicates that a switchover request was pending, but the original primary database has been switched back to the primary role.

  • TO PRIMARY - The database is ready to switch to the primary role.

  • TO STANDBY - The database is ready to switch to either the physical or logical standby role.

  • TO LOGICAL STANDBY - The database has received a data dictionary from a logical standby database and is ready to switch to the logical standby role.

  • RECOVERY NEEDED - On a physical standby database, this status indicates that additional redo must be applied before the database can switch to the primary role.

  • PREPARING SWITCHOVER - On a primary database, this status indicates that a data dictionary is being received from a logical standby database in preparation for switching to the logical standby role. On a logical standby database, this status indicates that the data dictionary has been sent to the primary database and other standby databases.

  • PREPARING DICTIONARY - On a logical standby database, this status indicates that the data dictionary is being sent to the primary database and other standby databases in preparation for switching to the primary role.

  • FAILED DESTINATION - On a primary database, this status indicates that one or more standby destinations are in an error state.

  • RESOLVABLE GAP - On a primary database, this status indicates that one or more standby databases have a redo gap that can be automatically resolved by fetching the missing redo from the primary database or from another standby database.

  • UNRESOLVABLE GAP - On a primary database, this status indicates that one or more standby databases have a redo gap that cannot be automatically resolved by fetching the missing redo from the primary database or from another standby database.

  • LOG SWITCH GAP - On a primary database, this status indicates that one or more standby databases are missing redo due to a recent log switch.

DATAGUARD_BROKER

VARCHAR2(8)

Data Guard broker information:

  • ENABLED - Database is part of a broker configuration and broker management of the database is enabled

  • DISABLED - Database is part of a broker configuration and broker management of the database is disabled. This value is displayed if the user disabled broker management of the database or configuration, or if broker management was disabled due to a role change (for example, the old primary was disabled after a failover operation).

GUARD_STATUS

VARCHAR2(7)

Protects data from being changed:

  • ALL - Indicates all users other than SYS are prevented from making changes to any data in the database.

  • STANDBY - Indicates all users other than SYS are prevented from making changes to any database object being maintained by logical standby.

  • NONE - Indicates normal security for all data in the database.

SUPPLEMENTAL_LOG_DATA_MIN

VARCHAR2(8)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 崩潰在loading.progress = (float)receivedSize/expectedSize; 分析:MJPhotoView 執行了hide移除了MJPhotoLoadingView,然而SDWebimage 仍然執行了下載進度的設置。 解決方法:寫個bool值,當執行hide方法的 ...
  • ...
  • 概念模型、邏輯模型、物理模型,著重於概念模型中的代表 ER圖 ...
  • Memcache使用了Slab Allocator的記憶體分配機制:按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題Memcache的存儲涉及到slab,page,chunk三個概念1.Chunk為固定大小的記憶體空間,預設為96Byte。2.page對應實際的物理空間,1個p ...
  • 本章將介紹如何在Sybase下使用游標 因業務需要,要批量處理一些數據,sql需要用到迴圈,所以要使用游標,我寫了一個簡單的游標,sql如下 但在Sybase下執行時,一直報錯,報錯內容如下: 經過不斷排查,最後發現問題所在: 修改後的sql如下: 再次執行,妥妥的,沒毛病…… ...
  • 工作快一年了,接觸的東西不是很多,學到的東西也不多。無意中看到公司的代碼有一點關於sqlite3的(不是我這一層負責的代碼),於是乎就學學試試。 參考: http://www.runoob.com/sqlite/sqlite-tutorial.html 20160612 更新 1,什麼是SQLite ...
  • 資料庫複習① 2016年6月14日 19:11 Main Database Concepts 資料庫概念 1.什麼是數據Data、什麼是信息Information,數據與信息之間的關係? Data & Information 數據與信息 Data is some type values, is us ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...