2020年8月12日 星期三

3.4 Oracle 資料庫維護作業

資料庫是應用系統最終儲存資料的地方,當資料庫發生問題時,不僅有可能造成應用系統的服務停止,嚴重的還會造成公司業務上的損失,因此資料庫也需要維護保養,以確保系統能夠正常的運行。一般說來, Oracle 資料庫維護的方式可分為主動式以及被動式兩種維護方式。所謂主動式的維護方式指的是定期監控資料庫的狀態,當發生問題時可以第一時間處理,減少應用系統停止服務的時間,監控資料庫的方式可以是檢查系統的日誌、撰寫腳本來檢查資料庫狀態、透過第三方工具及時監控,或者是使用自動排程的機制來定時檢查以及發出告警...等,這些都是屬於主動式的維護方式;而被動式的維護方式指的是當系統出現問題的時,再來排除以及進行調整,平時並沒有針對資料庫進行管理。既然資料庫是那麼重要,當然公司一定都會主動的來維護資料庫。


那麼 Oracle 資料庫日常維護的項目有哪些 ?


1. 檢查 tablespace 空間:

 要在 Oracle 資料庫中建立表格或其他物件時,必須先建立一個表格空間 (tablespace) 供表格或其他物件來儲存,當 tablespace 空間不足時,系統便會無法將資料儲存於資料庫並且產生錯誤,因此檢查 tablespace 空間便會是日常檢查項目的重點。 Tablespace 在 Oracle 資料庫中是ㄧ個邏輯性的架構,是由一個或多個資料檔 (datafile) 所組成,當發現 tablespace 空間不足時,就必須增加或擴展 datafile 來延伸 tablespace 的空間,對於 tablespace 的邏輯與實體架構,將會在往後的資料庫章節做詳細介紹。 檢查 tablespace 空間的方式除了透過前一章節所介紹的 Database Control 之外,也可以自行透過 SQL 來撈取 tablespace 的空間資訊,例如使用下列的 SQL來撈取 tablespace 資訊 :


col ts_name format a12

col type format a12

select a.tablespace_name ts_name,c.contents type,

          round((a.mbytes - nvl(b.mbytes,0))/a.mbytes * 100,2) "USED(%)",

          round(nvl(b.mbytes,0)/a.mbytes * 100,2) "free(%)",

          round(nvl(b.mbytes,0),2) "free(MB)",a.mbytes "total(MB)"

 from (select tablespace_name,sum(bytes)/1024/1024 mbytes

          from dba_data_files

        group by tablespace_name) a,

       (select tablespace_name,sum(bytes)/1024/1024 mbytes 

          from dba_free_space

        group by tablespace_name) b,

          dba_tablespaces c

where a.tablespace_name=b.tablespace_name(+)

  and a.tablespace_name=c.tablespace_name(+)

union

select a.tablespace_name ts_name,b.contents type,

          round(nvl(b.mbytes,0)/a.mbytes * 100,2) "USED(%)",

          round((a.mbytes - nvl(b.mbytes,0))/a.mbytes * 100,2) "free(%)",

          round((a.mbytes - nvl(b.mbytes,0)),2) "free(MB)",a.mbytes "total(MB)"

  from (select tablespace_name,sum(bytes)/1024/1024 mbytes

            from dba_temp_files group by tablespace_name) a,

        (select ss.tablespace_name,ts.contents,

                  sum((ss.used_blocks*ts.block_size))/1024/1024 mbytes

            from gv$sort_segment ss, dba_tablespaces ts

          where ss.tablespace_name = ts.tablespace_name

            group by ss.tablespace_name,ts.contents) b

 where a.tablespace_name=b.tablespace_name

 order by ts_name;


執行之後便可以查詢出目前各個 tablespace 空間的分佈及其使用情形:


2. 檢查 alert log 有無錯誤:

對於 Oracle 資料庫來說,alert log 紀錄著 Oracle 資料庫系統所產生的訊息,像是開啟與關閉資料庫、交易日誌切換以及系統錯誤...等訊息都會紀錄在 alert log 文件中,經由查看 alert log 可以發現資料庫有無錯誤,尤其是 ORA-00600、ORA-07445 這類型的 internal error 有可能會造成資料庫服務中止,當資料庫發生問題時,首要工作就是檢查 alert log 有無相關錯誤訊息,因此定時的檢查 alert log 可以及早發現問題並處理之,那麼該如何查看 Oracle 資料庫的 alert log ?

首先透過 Database Control 便可以查看資料庫的警示日誌 (alert log) :


另外就是直接在作業系統上查看 Oracle 資料庫的 alert log,檔案的格式固定為 alert_<SID>.log, 檔案放置的位置由 background_dump_dest 這個參數來設定,在 Oracle 10g 之前,這個位置預設都是在 $ORACLE_BASE/admin/{DB_SID}/bdump 下,而在 Oracle 11g 之後引進了 ADR (Automatic Diagnostic Repository) 功能,主要是用來存放資料庫的診斷訊息,例如 trace file、dump file、alert log file、health check report...等,ADR 有統一的目錄結構,Oracle 11g 之後的 alert log 也存放在此目錄結構下,預設是 $ORACLE_BASE/diag/rdbms/{DB_SID}/trace 這個目錄,由於這些差異,因此在查看 alert log 前須注意到目前資料庫的版本,以避免找不到檔案的事情發生。

自 Oracle 11g 開始,資料庫中提供了 x$dbgalertext 這個 table,經由這個 table 中的 message_text 欄位也可以查詢到 alert log 的內容,改善了以往必須登入到作業系統才能查看 alert log 的缺點。


3. 檢查資料庫備份狀態:

 備份可以算是資料庫最重要的工作之一,當資料庫發生問題或是損毀時就必須利用備份檔來還原資料庫,也因此必須例行性的檢查資料庫備份的狀態以確保資料庫的安全,而 Oracle 資料庫目前最主要的備份方式為 RMAN,自 Oracle 10g 之後,資料庫中提供了 v$rman_backup_job_details 這個 table 來方便我們查看資料庫 RMAN 備份的狀態,所以除了檢查每日備份排程有無成功之外,也可以直接進到資料庫來查看 Oracle 資料庫備份的狀態。

 

4. 檢查資料庫與系統效能有無異常:

 效能,算是所有從事資訊的人員最為關心的一個課題,因此定期檢查資料庫與系統效能便成為一項重要的工作,那麼我們該如何判斷出效能有無異常 ? 基本上來說,每個系統、每個 IT 環境,它們對於效能的定義是不同的,我們很難一概而論說 SQL 執行時間小於 3 秒就是好的,或是系統 CPU 使用率小於 70% 就是正常的,因為每個環境每個系統執行 SQL 所需的時間是不同的,對於 CPU 使用的情形也是不同的,因此我們必須針對每個環境定義出效能的基準線 (Base Line),有了基準線之後,才能夠判斷效能是否有問題,例如某句 SQL 平常執行的時間為 1 分鐘,而使用者反應系統變慢之後發現此 SQL 執行時間需要 5 分鐘;或是系統 CPU 使用率平時大約維持在 85% 左右,而現在突然使用率衝高到 99%...等,諸如此類的現象,我們才可以斷定資料庫或是系統的效能出現異常,並且訂定出效能調教的目標來改善效能。


說了那麼多的日常維護項目,對於一個 Oracle 資料庫的管理人員來說,該如何使用 Oracle 資料庫內部的功能來管理呢 ? 自 Oracle 10g 之後,資料庫管理人員可以使用 AWR、AWR Baseline、Metric 、Threshold,Statistics 這些 Oracle 資料庫內部的功能來輔助我們管理資料庫,接下來的章節將一一來介紹這些功能。

沒有留言:

張貼留言