茫茫網海中的冷日 - 對這文章發表回應
茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671863 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_219547.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2016/4/27 3:12:11

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 資料庫內部的功能來輔助我們管理資料庫,接下來的章節將一一來介紹這些功能。

3.5 Statspack

效能,算是所有資料庫相關人員最關心的課題之一,對於 Oracle 資料庫本身的效能資訊,可以從系統提供的 Dymatic Performance Views 來查詢,也就是資料庫中所有 V$ 開頭的 view,例如 v$session、v$process、v$sql、v$lock...等,而在 RAC 環境中,除了 V$ 之外,更是多了 GV$ (Global V$) 可供查詢。透過 v$ 提供的資訊,我們便可以掌握資料庫當前的狀態以及效能,進而針對當前遇到的問題進行調整。

雖然 v$ 可以提供所有資訊,但是這些紀錄並不會保留,v$ 的內容是隨著時間一直在改變的,所以透過 v$ 只能獲得當前資料庫的效能資訊,無法查知已經過往的訊息,那麼如果使用者反應資料庫的效能問題時,例如 "昨日的批次作業執行了 30 分鐘,正常情況下應該要 5 分鐘內結束",這時我們要如何得知昨日資料庫的狀態,為何資料庫變慢了 ? 由此衍生出了一個想法,要是我們昨天有把 v$ 的內容記錄下來,那麼現在我就可以有充足的資訊來分析資料庫變慢的原因了。因此, Statspack 誕生了。
Statspack 主要的功能就是定時把 v$ 的訊息存放下來,有了資料庫的歷史資訊,便可以分析過往資料庫的狀態,尤其是資料庫發生效能問題時,這些歷史資訊便顯得格外重要。Statspack 在過往 Oracle 資料庫為 8i 、9i 或是更早之前的版本時較為廣泛的運用,但在資料庫建立完成時,預設是不會有 Statspack 這項功能,資料庫管理人員必須自行建立 Statspack 這項機制。


在建立 Statspack 之前,必須在 Oracle 資料庫中規劃一個 tablespace 空間供 Statspack 存放資料,另外 Statspack 定時收集 v$ 的工作使用的是 Oracle 資料庫裡面的排程,因此需確認 job_queue_processes 這項參數大於 0,否則排程的工作不會執行。

建立 Statspack 須以 sys 使用者登入 sqlplus,然後執行 $ORACLE_HOME/rdbms/admin 目錄下的 spcreate.sql  (8.1.6 或更之前的版本為 statscre.sql)
首先系統會先建立一個使用者 "PERFSTAT",此為 Statspack 的擁有者,而我們必須為 PERFSTAT 設定一個密碼:
接下來設定 PERFSTAT 所使用的 default tablespace,這是在前置作業時所規劃並且事先建立完成的 tablespace :
指定 PERFSTAT 所使用的 temporary tablespace,一般為 TEMP:
設定完成後,系統便會在 PERFSTAT 這個使用者底下建立 STATS$ 系列的 table 以及名為 statspack 的 package,此 package 主要是用來收集 v$ 資訊 (statspack.snap) 或是更改 Statspack 的參數設定 (statspack.modify_statspack_parameter),而 STATS$ 系列的 table 則是用來存放 v$ 的歷史資訊。

最後的工作便是將 Statspack 的工作排入資料庫的排程工作裡,執行 $ORACLE_HOME/rdbms/admin 目錄下的 spauto.sql (8.1.6 或更之前的版本為 statsauto.sql),便會於資料庫中新增 Statspack 的 job,預設是 1 個小時執行一次。

建立好 Statspack 之後,v$ 的資訊便會定時的存放置 stats$ 中,資料庫管理人員可以自行從 stats$ 撈取歷史資訊,或是使用 $ORACLE_HOME/rdbms/admin 底下的 spreport.sql 進行 Statspack 的報表產出 (8.1.6 或更之前的版本為 statsrep.sql),執行之後系統會列出所有的 snapshot (也就是保存 v$ 的時間點),並且要我們選擇要產出哪一段區間的報表:
指定完區間便完成 Statspack report 的產出。

由於資料庫排程預設是每一個小時收集一次 v$ 的資訊,隨著資料的增長,放置 Statspack 的 tablespace 便會不斷的增大,因此在管理上需要規劃 stats$ 所需保存的時間,並且將過舊的資料刪除以避免 tablespace 增長過大。刪除資料的方法可以使用 $ORACLE_HOME/rdbms/admin 底下的 sppurge.sql 來刪除某一段區間的資料,或是 sptrunc.sql 來刪除 stats$ 全部的資料,另外也可以使用 sql 來直接刪除 stats$snapshot 這個 table 底下的資料,例如刪除七日前的資料:
====================================================
SQL> delete from perfstat.stats$snapshot where snap_time < sysdate - 7 ;
====================================================

在早期 Oracle 8i 或 9i 的版本中,除了 Statspack 之外,資料庫本身並沒有其它方式來查找歷史資訊,因此將 Statspack 建立起來對管理人員來說是很有幫助的。

原文出處:3.4 Oracle 資料庫維護作業 - 淡藍色的夜 - 樂多日誌
內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|