標籤:des io ar os 使用 sp strong 檔案 資料
一、追蹤檔案是幹什麼用的? 追蹤檔案中包含了大量而詳細的診斷和調試資訊。通過對追蹤檔案的解讀和分析,我們可以定位問題、分析問題和解決問題。從追蹤檔案的產生的來源來看,追蹤檔案又可以分為兩類:一類是資料庫的操作人員有意產生的;另一類則是由於出現了異常錯誤,由資料庫自動產生的。對於後一類,只對Oracle內部的技術支援人員是有用的,但對於我們,則多半看不懂。前一類,則是我們經常用到的,協助我們分析、調整和最佳化應用效能,處理並解決問題。
二、追蹤檔案是如何命名的? 一個追蹤檔案的名字一般由以下幾部分組成: ORACLE_SID 固定字元"ora" 伺服器的進程ID號 檔案尾碼名 .trc 前三個部分之間以底線串連。 如下例: orcl_ora_6210.trc 其中“orcl" 是本環境下資料庫的SID,"6210"為產生該追蹤檔案會話所使用的伺服器處理序ID號。如何知道我的ORACLE_SID和會話所使用的伺服器處理序ID呢?後面會詳細講到。 上面說到的追蹤檔案的命名規則適用於我們前面說的第一類追蹤檔案,即資料庫操作人員有意產生的追蹤檔案。如果是第二類追蹤檔案,則命名上稍有變化。這類追蹤檔案將固定字元"ora"改為了ORACLE後台進程名的縮寫。如下例所示: orcl_lgwr_30019.trc orcl_dbw0_2664.trc
三、追蹤檔案存放在哪裡? 追蹤檔案存放的位置根據資料庫版本的不同,位置也是不同的。下面以10g 和11g分別說明。 10g 通常,我們在安裝資料庫時,會設定一個環境變數$ORACLE_BASE(注意,是BASE,不是HOME),該變數中指定了ORACLE軟體安裝的主目錄。假設我們設定的目錄為”/oracle/app/oracle“,那麼追蹤檔案會放到以下這幾個目錄中: /oracle/app/oracle/admin/orcl/bdump 該目錄用來儲存ORACLE後台進程產生的輸出檔案。資料庫自動產生的追蹤檔案預設是儲存在這裡,另外,我們經常提到的警示日誌,也是放在這裡的。 /oracle/app/oracle/admin/orcl/cdump 該目錄用來儲存核心進程產生的輸出檔案 /oracle/app/oracle/admin/orcl/udump 該目錄用來儲存使用者產生的輸出檔案。我們有意產生的追蹤檔案預設就是儲存在這裡。 以上是說的是預設情況下,如果資料庫的管理員改變了這個設定的話,我們更保險的方法是查詢相關參數來確定,查詢方法如下: 通過SQLPLUS以管理員身份登入,輸入 show parameter dump_dest 並斷行符號。例如: SQL> show parameter dump_dest NAME TYPE VALUE------------------------------------ ----------- ------------------------------background_dump_dest string /oracle/app/oracle/admin/orcl/ bdump
core_dump_dest string /oracle/app/oracle/admin/orcl/cdump
user_dump_dest string /oracle/app/oracle/admin/orcl/ udump 此外,這些設定,在參數檔案中也有記錄。通過查詢參數檔案亦可獲得。 11g 11g中引入了一個新的功能,稱為自動診斷知識庫(Automatic Diagnostic Repository 縮寫為ADR)。它是所有診斷資訊的的中心儲存點,它包括各種轉儲檔案、追蹤檔案、日誌和健康情況監視報表。所有執行個體(RDBMS執行個體和ASM執行個體)都在ADR中建立有自己的目錄結構。 ADR的位置是由參數DIAGNOSTIC_DEST來指定,預設位置同$ORACLE_BASE。其結構如下: ORACLE_BASE/diag/database_name/instance_name 假設我們設定的$ORACLE_BASE仍為”/oracle/app/oracle“,資料庫名稱和執行個體名稱均為”orcl",則實際的目錄結構如下: /oracle/app/oracle/diag/orcl/orcl 這個位置,也被稱為本例中資料庫執行個體ORCL的ADR_HOME。 在這個目錄下,還會發現有一個子目錄,名為trace,其下集中儲存了資料庫後台進程和使用者主動產生的追蹤檔案以及警示日誌。 但這也是預設情況下,我們通過查詢v$diag_info視圖,就可以獲得實際的位置。如下所示: SELECT * FROM V$DIAG_INFO;
INST_ID NAME VALUE------- --------------------- ------------------------------------------------------------- 1 Diag Enabled TRUE 1 ADR Base /u01/oracle 1 ADR Home /u01/oracle/diag/rdbms/orclbi/orclbi 1 Diag Trace /u01/oracle/diag/rdbms/orclbi/orclbi/trace 1 Diag Alert /u01/oracle/diag/rdbms/orclbi/orclbi/alert 1 Diag Incident /u01/oracle/diag/rdbms/orclbi/orclbi/incident 1 Diag Cdump /u01/oracle/diag/rdbms/orclbi/orclbi/cdump 1 Health Monitor /u01/oracle/diag/rdbms/orclbi/orclbi/hm
四、如何找到特定的追蹤檔案? 通過上面的介紹,我們已經知道了追蹤檔案是如何命名的,儲存到了什麼地方。但對於一個繁忙的系統,在同一個目錄下,可能會在相近的時間內產生多個追蹤檔案,那麼如何才能找到我們想要的那個追蹤檔案呢。核心就是要確定我們所使用的伺服器處理序ID號。有了這個ID號,我們就可以確定地知道哪個追蹤檔案才是我們想要的。下面介紹一下如何查詢服務器進程ID號。 當前正在啟動並執行伺服器處理序ID號,都儲存在v$process視圖中。但由於該視圖中提供的資訊有限,大多數的時候,我們很難定位到底哪個伺服器處理序ID(SPID)才是我們要找的。 比如下面的這個輸出,基本是一樣的。 SQL> select addr,spid,username,terminal,program from v$process;ADDR SPID USERNAME TERMINAL PROGRAM----------------------- ------------ --------------- ------------------------------ ------------------------------------------------000000007FE6D7A8 2447 oracle UNKNOWN [email protected] (MMNL)000000007FE6DFA0 2449 oracle UNKNOWN [email protected] (D000)000000007FE6E798 2451 oracle UNKNOWN [email protected] (S000)000000007FE6EF90 2453 oracle pts/1 [email protected] (TNS V1-V3)000000007FE6F788 2455 oracle UNKNOWN [email protected] (ARC0)000000007FE6FF80 2457 oracle UNKNOWN [email protected] (ARC1)000000007FE70778 2459 oracle UNKNOWN [email protected] (CTWR)000000007FE70F70 2461 oracle UNKNOWN [email protected] (QMNC)000000007FE71768 5703 oracle pts/2 [email protected] (TNS V1-V3)000000007FE71F60 5839 oracle UNKNOWN [email protected]000000007FE73F40 2475 oracle UNKNOWN [email protected] (q000) 這時,我們就藉助v$session視圖,即通過會話找伺服器處理序(一個進程可以有多個會話,但一個會話,只能屬於一個進程)。前面說過,追蹤檔案分為兩類,我們需要的是我們主動產生的追蹤檔案。即然是我們主動產生的,那一定是在我們當前的會話中產生。因此,我們可以利用以下語句找到我們當前會話所屬的伺服器處理序ID(SPID)。 SQL> select a.spid from v$process a,v$session b where b.sid=sys_context(‘userenv‘,‘sid‘) and a.addr=b.paddr; SPID------------5922 上面語句中的 sys_context(‘userenv‘,‘sid‘) 是利用系統內建的函數來取當前的會話ID(SID),這個函數也可以用 userenv(‘sid‘) 來代替,結果是一樣的。只不過ORACLE建議使用前者。因為後面這個函數只是出於保持版本的相容性而保留下來的,但說不定什麼時候,這個函數就會在更新的版本中取消了。 有了這個SPID,我們就可以去相應的追蹤檔案的存放位置,去尋找在目前時間產生的,檔案名稱中含有”5922“的追蹤檔案了。 另外,我們也可以使用下面這個SQL語句,在當前會話中直接查詢而獲得追蹤檔案的絕對路徑和名字。 select c.value || ‘/‘ || d.instance_name || ‘_ora_‘ || a.spid || ‘.trc‘ trace from v$process a, v$session b, v$parameter c, v$instance dwhere a.ADDR = b.PADDR and b.SID = sys_context(‘userenv‘,‘sid‘) and c.NAME = ‘user_dump_dest‘ ;
如何尋找ORACLE中的追蹤檔案