成為MySQL DBA後,再看ORACLE資料庫(七、日誌體系)

海布里_MySQL發表於2024-06-07

說起資料庫的日誌,一般有redo日誌、歸檔日誌、錯誤日誌、審計日誌等,不同的資料庫為了滿足其特定的功能會有不同型別的日誌。在ORACLE的日常運維中,可能接觸得最多的就是redo日誌、歸檔日誌、告警日誌、閃回日誌這幾種日誌。在ORACLE知識體系中,一般把redo、undo、checkpoint這幾個知識點放在一起,這也是更好的學習資料庫的路線。但我更想從MySQL的視角,把資料庫的各種日誌放在一起做個總結。
一、redo日誌

搞資料庫的都知道,redo日誌的功能主要是用來clash recovery(崩潰恢復),保證資料的一致性。在ORACLE中,Redo的功能主要透過三個元件來實現:Redo Log Buffer、LGWR後臺程序和Redo Log File。Oracle透過後臺程序LGWR不斷的把Redo Log Buffer的內容寫到Redo Log File中,下圖說明了三者的關係。

資料庫會預設建立三個redo log日誌組,在資料目錄下可以看到有三個redo0x.log檔案。當一個日誌檔案寫滿之後,會切換到另外一個日誌檔案,這個切換過程稱為Log Switch,因此Log Switch會出發一個checkpoint確保該日誌檔案對應的變更資料落盤。透過v$log可以檢視檢視當前redo日誌組的狀態。其中STATUS列顯示了日誌檔案的狀態:當狀態為CURRENT,指的是當前的日誌檔案是活動的,當前正在被使用的;當狀態為ACTIVE,指的是活動的非當前日誌,檢查點尚未完成,該日誌在clash recovery也會被用到;當狀態為INACTIVE,指該日誌非活動,對應的變更資料都已落盤,非活動日誌在例項恢復時已經不再需要。

為了讓使用者可以快速提交,日誌快速落盤,已提交的資料不丟,保證資料的一致性,LGWR程序寫日誌觸發條件有以下幾個:每3秒超時;Redo Log Buffer1/3滿;Redo Log Buffer中有1M髒資料;使用者提交;在DBWR程序寫之前。

二、歸檔日誌

當redo log 檔案寫滿後,新的redo log會重用之前的redo log檔案,因此原來的記錄會被直接覆蓋,為了保證日誌的連續性,可以在ORACLE資料庫中開啟歸檔模式,就是將經寫滿的重做日誌檔案透過複製方式儲存到指定的位置,也就是歸檔日誌。開啟歸檔後,會啟動後臺程序ARCN,在日誌切換時,LGWR程序寫之前備份歷史日誌。對於生產環境的資料庫系統都應該開啟歸檔模式,以便資料庫能支援熱備,並提供資料庫完全恢復和不完全恢復。非歸檔只適用某種靜態庫、測試庫、或者可以透過其他方式恢復資料的資料庫,非歸檔模式只能冷備, 且僅能還原最後一次全備。而歸檔模式可以恢復到最後一次commit。

透過archive log list或v$database檢視可以檢視資料庫是否開啟了歸檔模式:

透過引數log_archive_dest_n可以設定ORACLE資料庫的多個歸檔路徑,n可以是1~31。如果在引數中指定了service:alter system set log_archive_dest_2='service=standby', 那麼則代表把日誌歸檔到服務名standby為遠端的伺服器。log_archive_format引數用來定義歸檔日誌的命名格式,一般預設為%t_%s_%r.dbf,%t代表日誌執行緒號、%s代表日誌序列號、%r代表資料庫的週期。

開啟歸檔模式,是需要重啟資料庫,並在mount狀態開啟歸檔模式,以下是資料庫開啟歸檔的步驟:

#建立歸檔目錄
mkdir -p /u01/oracle/arch
chown -R oracle:oinstall  /u01/oracle/arch
#設定歸檔目錄引數
alter system set log_archive_dest_1='location=/u01/oracle/arch';
#正常關庫,然後啟動到mount狀態
shutdown immediate; 
startup mount;
archive log list;
#開啟歸檔,啟動資料庫
alter database archivelog; 
alter database open; 
archive log list;

三、告警日誌

告警日誌是日常排查資料庫問題使用最多的方式之一,記錄著資料庫的“編年史”,在MySQL中這個日誌叫錯誤日誌。ORACLE的告警日誌位於$ORACLE_HOME/diag/rdbms/ORACLE_SID/ORACLE_SID/trace目錄下,在ORACLE中可以透過v$dig_info檢視檢視告警日誌的存放路徑。

可以看到,在告警日誌目錄下,除了告警日誌檔案alert_orcl.log,還有很多trc和trm檔案。trc檔案即trace collection file,它是系統的跟蹤檔案,trc檔案中包含了大量且詳細的診斷和除錯資訊。trm檔案即trace map file,稱為後設資料跟蹤檔案,記錄了描述trc檔案跟蹤記錄的後設資料資訊。在SQL的最佳化與分析中,可以透過alter session set sql_trace=true命令開啟會話的跟蹤,這樣會話執行SQL的執行計劃、執行流程中的各方面資訊比如物理讀,cpu消耗等將會詳細記錄在trc檔案中,這樣將可以排查出一條SQL具體慢在哪裡。透過TKPROF工具可以格式化trc檔案,增強可讀性。此外,在$ORACLE_HOME/diag/rdbms/ORACLE_SID/ORACLE_SID/alert目錄下還有一個log.xml檔案,這個就是XML格式的警告日誌,其實內容和alert_orcl.log是一樣,XML檔案主要是方便一些工具來生成報告,dba實際排查問題看alert_orcl.log檔案還是更方便一些。

四、閃回日誌

閃回日誌是為了支援flash database而引入的,閃回日誌中包含資料塊被修改之前的映像,可以用於將資料庫恢復到某個時間點之前的狀態。這裡就不過多贅述了,後面準備專門寫一篇總結ORACLE的閃回技術。

五、總結

從資料庫幾種常用的日誌來看,ORACLE和MySQL差別還是很大。MySQL記錄資料變化的日誌除了redo還有binlog,而MySQL的redo無法歸檔,只能用來crash recovery。在MySQL中,透過binlog完成主從複製和保證日誌連續性,這種記錄資料邏輯變化的日誌也特別方便異構資料的複製,衍生了canel等開源資料同步工具。ORACLE告警日誌更詳細,還可以透過跟蹤檔案提供更詳細的資料庫診斷資訊,相比而言MySQL的errorlog就顯得太簡單了,MySQL中遇到異常崩潰通常需要收集coredump資訊跟蹤原始碼才能更好的定位問題。

相關文章