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