oracle 查看日志组切换状态_Oracle 逻辑结构篇 之 重做日志和归档日志管理(一)...
【關鍵術語】
Redo log file 重做日志文件
Archive log file 歸檔日志文件
SCN(system change number)系統改變號
Checkpoint 檢查點
Log switch 日志切換
Redo entry 重做條目
Log sequence number 日志序列號
Log file groups 重做日志組
Archive mode 歸檔模式
1.1 重做日志文件
在數據庫的使用過程中,可能會出現斷電、死機等意外情況,在出現意外時如何保證數據的有效性、一致性和完整性?Oracle 作為大型關系數據庫管理系統,必須要通過合理的機制確保在任何情況下都不會出現數據丟失,通過合理的配置重做日志可以實現并完成這項任務。利用重做日志文件,在數據庫發生故障時,可以重新處理事務。每個事務在處理的同也會寫入重做日志緩沖區,然后由 LGWR 進程寫入到重做日志文件,這樣,如果發生介質故障,重做日志文件將提供恢復機制。(但也存在例外情況,例如,在啟用 NOLOGGING 子句的情況下對象中的直接加載插入。)重做日志文件用來在例程失敗等情況下恢復尚未寫入數據文件的但是已提交的數據。重做日志文件只用于恢復。
在 Oracle 當中,事務對數據庫所做的修改將以重做記錄的形式保存重做日志緩存中。在提交事務時,由 LGWR 進程將緩存中該事務相關的重做記錄全部寫入重做日志文件,這時,事務認為已經成功提交。這種機制稱為“快速提交”。
1.1.1 重做日志結構
重做日志文件具有以下特征:
- ? 記錄對數據所做的所有更改
- ? 提供恢復機制
- ? 可以劃分成組
- ? 至少需要兩個組
那么什么是日志組呢(Redo Log Group)?重做日志組是一組相同的重做日志文件副本,LGWR 后臺進程向組內所有聯機重做日志文件并發寫入相同信息,為保證數據庫的正常操作,Oracle 服務器最少需要兩個聯機重做日志文件組。屬于同一日志組的每個日志文件被稱為日志成員,并且同一個日志組的不同日志成員互為鏡像,即組內的每個成員都有相同的日志序列號和同樣的大小。Oracle 服務器每次寫入日志組時,都分配一個日志序列號以唯一地標識每個重做日志文件。當前日志序列號存儲在控制文件和所有數據文件的頭部。在Oracle 數據庫中,多個重做日志組是循環使用的,如圖 p1-1 所示。
假定數據庫包含三個日志組,在圖 6-1 中,初始階段后臺進程 LGWR 將事務變化寫入到日志組一的兩個成員中;在日志組一寫滿之后,LGWR 進程切換到日志組二,并將事變化寫入到日志組二的兩個成員中;在日志組二寫滿之后,LGWR 進程切換到日志組三,并將事務變化寫入到日志組三;在日志組三寫滿之后,LGWR 又切換回日志組一,并將事務變化寫入到日志組一,覆蓋原有記錄。經過以上說明,大家可以知道,所有事務變化都可以通過日志組予以保留(歸檔方式下)。這樣,即使將來出現實例失敗(Instance Failure)或介質失敗(Media Failure)時,DBA 將會使用這些已經保留下來的事務變化進行實例恢復或介質恢復,最終可以確保 Oracle 不會出現數據丟失。
以下查詢顯示了當前數據庫的重做日志文件的位置和名稱。當前數據庫共有 3 個日志文件 REDO01.LOG、REDO02.LOG 和 REDO03.LOG,位于 D:ORACLEORADATADB01目錄下。
SQL> SELECT member FROM v$logfile;MEMBER------------------------------------------D:ORACLEORADATADB01REDO03.LOGD:ORACLEORADATADB01REDO02.LOGD:ORACLEORADATADB01REDO01.LOG1.1.2 日志序列號和日志切
Oracle 服務器將對數據庫所做的所有更改按順序記錄到重做日志緩沖區中。LGWR 進程把重做條目從重做日志緩沖區寫入聯機重做日志組的其中一個組,這個組叫做當前重做日志組。LGWR 進程將在以下情況下寫入:
- ? 當提交事務處理時(Commit)
- ? 當重做日志緩沖區被寫滿三分之一時
- ? 當重做日志緩沖區內的已更改記錄超過 1MB 時
- ? 每隔 3 秒
- ? 在 DBWn 將數據庫緩沖區高速緩存中修改的塊寫入數據文件之前
重做日志文件是以循環方式使用的。每個重做日志文件組用一個遞增日志序列號來標識,每次重新使用日志時就會覆蓋原來的序列號。
LGWR 按順序向聯機重做日志組寫入重做信息。一旦當前聯機重做日志組被寫滿,LGWR 就開始寫入下一個組。這稱為日志切換(Log Switch)。當最后一個可用聯機重做日志文件已滿時,LGWR 將返回第一個聯機重做日志文件組并開始重新寫入。假定數據庫有三個重做日志組,第一個日志組為當前日志組,當前日志序列號為 56,LGWR 進程將事務變化寫入第一個重做日志組中,當第一個日志組寫滿后,LGWR 進程自動切換到第二個日志組,在進行日志切換時,Oracle 服務器完成如下任務:
- ? 日志序列號自動加 1,即當前日志序列號變為 57,并且將日志序列號連同 SCN 息寫入到控制文件的日志歷史記錄中。
- ? 促使 CKPT 進程發出檢查點,從而使得后臺進程 CKPT 將檢查點時刻的 SCN 信息寫入到控制文件和數據文件頭部,并促使后臺進程 DBWR 將數據高速緩存中的緩沖區寫入到數據文件中。
- ? 當數據庫處于 ARCHIVELOG 模式時,日志切換還會促使 ARCH 進程開始歸檔。
當日志組寫滿之后 Oracle Server 會自動進行日志切換;另外,在一些特定情況 DBA 還可以強制系統進行日志切換,這要求用戶必須具有 ALTER SYSTEM 系統權限。例如:果要刪除正在使用的日志組,那么首先強制日志切換;當日志組很大,需要很長時間才能寫滿時,可以強制執行日志切換,以避免重做日志損壞所帶來的損失。強制日志切換的命令如下:
ALTER SYSTEM SWITCH LOGFILE。
【實例 】切換日志,顯示日志狀態。1)以管理員身份登錄SQL> CONNECT / AS SYSDBA已連接。2)顯示日志狀態SQL> SELECT GROUP#,SEQUENCE#,MEMBERS,STATUS FROM V$LOG;GROUP# SEQUENCE# MEMBERS STATUS---------- ---------- ---------- ----------------1 306 1 INACTIVE2 307 1 ACTIVE3 308 1 CURRENT3)切換日志SQL> ALTER SYSTEM SWITCH LOGFILE;系統已更改。4)重新顯示日志狀態SQL> SELECT GROUP#,SEQUENCE#,MEMBERS,STATUS FROM V$LOG;GROUP# SEQUENCE# MEMBERS STATUS---------- ---------- ---------- ----------------1 309 1 CURRENT2 307 1 INACTIVE3 308 1 ACTIVE由實例可見,數據庫工作一共有 3 個重做日志組,組號是 1、2 和 3,每個組有一個成員。日志切換前,當前日志組為 3(狀態為 CURRENT),對應的最大日志序號為 308。日志切換后,最小日志序號的日志組 1 被覆蓋,日志序號增一變為 309,并成為新的當前日志組。日志組就是這樣被循環的使用。1
1.1.3 檢查點
在介紹檢查點之前,首先回顧一下實例恢復。假定當前日志序列號為 56,先前檢查點時的 SCN 值為 3456231,并且該 SCN 值被記載到了控制文件和數據文件頭部,某用戶執了事務變化操作,并提交了事務,SCN 值變化為 3456239,并且此時突然出現了系統斷電,那么首先應考慮控制文件、數據文件和重做日志的 SCN 值分別為多少。因為只有在發出檢查點才會將 SCN 信息寫入到控制文件和數據文件頭部,所以控制文件和數據文件的 SCN 值都是 3456231,而當執行了提交操作后,重做記錄連同 SCN 會寫入到重做日志文件,所以此時重做日志文件的當前 SCN 值為 3456239。因為數據文件、控制文件的 SCN 一致,而與重做日志所記錄的 SCN 不一致,所以在重新啟動 Oracle Server 時后臺進程 SMON 會進行實例恢復,此時 SMON 程將自動重新執行從 3456231 至 3456239 之間的所有事務變化,然后才會打開數據庫。重做日志為何被稱為“Redo Log File”?因為在進行實例恢復或介質恢復時要重新執行日志文件記錄的所有事務變化。
1.生成檢查點
檢查點(Checkpoint)是一個數據庫事件,它用于同步所有數據文件、控制文件以及重做日志文件。當后臺進程 CKPT 發出檢查點時,會執行以下兩個任務:
1)后臺進程 CKPT 會修改控制文件和數據文件頭部,并將當前 SCN 信息寫入到這兩種文件中,從而使得數據文件、控制文件和重做日志處于一致狀態,這就是為何在執行SHUTDOWN NORMAL、SHUTDOWN TRANSACTIONAL 和 SHUTDOWN IMMEDIATE 之后不需要實例恢復(執行這些操作會發出檢查點),而執行了 SHUTDOWN ABORT(不強發出檢查點)之后需要進行實例恢復的原因。當啟動 Oracle 服務器時,后臺進程 SMON 總是會檢查控制文件、數據文件以及重做日志的一致性:
- ? 如果數據文件、控制文件、重做日志的當前 SCN 值完全一致,則系統會直接打開所有數據文件和重做日志。
- ? 如果控制文件和數據文件的當前 SCN 值完全一致匹配,并小于重做日志的當前SCN,則需要進行實例恢復(例如執行 SUHTDOWN ABORT 后)。
- ? 如果控制文件和數據文件的當前 SCN 值不匹配,則表示數據文件或控制文件存在損壞,此時就需要進行介質恢復,以恢復損壞的物理文件。
2)當后臺進程 CKPT 工作時,同時會促使后臺進程 DBWn 開始工作,并且將數據庫高速緩存中的臟緩沖區(Dirty Buffer )寫入到數據文件中。
檢查點可發生在下面情況中:
- ? 每次日志切換時
- ? 當使用 NORMAL、TRANSACTIONAL、IMMEDIATE 選項關閉例程時
- ? 通過設置初始化參數 FAST_START_MTTR_TARGET 強制執行時
- ? 數據庫管理員通過手動方式請求時
- ? ALTER TABLESPACE [OFFLINE NORMAL|READ ONLY|BEGIN BACKUP]命令導致對特定數據文件執行檢查點操作時。
2.強制檢查點
假定數據庫包含兩個日志組,每個日志組尺寸為 100MB,并且初始階段只有在日志切換時才會發出檢查點。假定當前日志組為日志組一,當該日志組寫滿之后,系統會自動切到日志組二,并發出檢查點將 SCN 信息寫入到數據文件和控制文件。如果在日志組二記了 90MB 事務變化之后,系統出現斷電。可以設想一下,數據庫還能使用嗎?答案是肯定的,將來在重新啟動 Oracle Server 時后臺進程 SMON 會自動執行實例恢復,最終將數據文件、控制文件、重做日志轉變為一致狀態。當進行實例恢復時,SMON 首先重新執行事務,然后打開數據庫,最后回退未提交的事務。因為 SMON 需要重新執行日志組二所記載的 90MB事務變化,從而會使得實例恢復需要很長時間。為了降低實例恢復時間,必須要增加檢查點次數。
日志切換和檢查點操作是在數據庫運行中的某些特定點自動執行的,但 DBA 可以強制執行日志切換或檢查點操作。強制執行檢查點有兩種方式:
1)設置 FAST_START_MTTR_TARGET
可以在初始化參數文件中設置此參數,代表實例恢復所用時間,單位為秒。例如:設FAST_START_MTTR_TARGET=300,代表如果數據庫需要實例恢復,那么恢復的時間不超過 300 秒。系統會根據 300 秒時間自動計算可以保留的臟塊的數目,如果超過則自動發出檢查點。
2)ALTER SYSTEM CHECKPOINT 命令
必要時,DBA 也可以手動發出檢查點命令,命令如下:ALTER SYSTEM CHECKPOINT.
1.1.4 日志管理策略
要確定一個數據庫例程的聯機重做日志文件的合適數量,必須測試不同的配置。在規劃重做日志的配置時,需考慮如下幾點:
1)重做日志組的個數
在某些情況下,數據庫例程可能只需要兩個組。在其它情況下,數據庫例程可能需要更多的組以保證各個組始終可供 LGWR 進程使用。例如,如果跟蹤文件或警告文件中出現如下消息:Checkpoint not complete 或 Redo Log Group not archived,表明 LGWR 經常不得不因為檢查點操作尚未完成或者日志組尚未歸檔而等待,這時就需要添加日志組。
2)重做日志文件的復用
重做日志對于數據庫正常運作和維護都是至關重要,因此建議創建復用重做日志文件來提高重做日志的可靠性。即一個重做日志組中包含多個互為鏡像的重做日志成員。復用重做日志文件后,LGWR 進程將同步寫入位于一個重做日志組中的多個成員日志文件,即多個日志成員是互為鏡像的關系,因此,即使由于某個單獨的日志文件破壞或丟失,數據庫運行和恢復也不受任何影響。
盡管 Oracle 服務器允許多元備份的組可以包含不同數量的成員,但應該盡量建立對稱配置。不對稱配置應只是非常情況(如磁盤故障)的臨時結果。在這種情況下,必須先創建新的不同大小的聯機重做日志文件組,然后刪除舊組。
3)重做日志文件的位置
復用聯機重做日志文件時,最好將組內的成員放置在不同磁盤上。這樣即使一個日志員所在磁盤發生物理損壞,而其它的日志成員至少還有一個是可用,那么數據庫實例不會被中斷動行。將歸檔日志文件和聯機重做日志文件分放在不同磁盤上,以減少 ARCn 和 LGWR后臺進程之間的爭用。數據文件和聯機重做日志文件應當放置在不同的磁盤上以減 少LGWR 和 DBWn 的爭用,并降低發生介質故障時同時丟失數據文件和聯機重做日志文件的風險。
4)重做日志文件的大小
聯機重做日志文件最小為 50 KB,最大文件大小視操作系統而定。假定日志組尺寸很小(500KB),那么可能會導致日志切換非常頻繁,間接地增加檢查點次數,從而降低系統性能;假定日志組尺寸很大(100MB),那么出現意外情況時可能會導致實例恢復的時間很長。Oracle推薦日志切換時間應該在 20—30min 之間,至于到底應該將日志組尺寸設置為多少,還應該根據實際情況進行反復測試。
另外,如果數據庫處于 ARCHIVELOG 模式,還應該考慮存放歸檔日志的存儲介質(磁帶或磁盤),以使得存儲介質剩余空間最小。例如,假定磁帶空間為 100MB,并且該磁帶只能存放兩個歸檔日志,那么設置重做日志的尺寸略低于 50MB。
下面的情況可能影響聯機重做日志文件的配置:
- ? 日志切換和檢查點的數量
- ? 重做記錄的量和個數
- ? 存儲介質的空間量;例如,啟用歸檔時歸檔文件所在磁盤上的空間量
寫在最后的話
感謝各位的支持與閱讀,后續會繼續推送相關知識和交流,歡迎交流、轉發和關注,感謝!
總結
以上是生活随笔為你收集整理的oracle 查看日志组切换状态_Oracle 逻辑结构篇 之 重做日志和归档日志管理(一)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 舌系带过短的人多吗
- 下一篇: 密度图的密度估计_基于核密度的宝鸡地名文