【Oracle】ORA-03113錯誤分析與解決

來源:互聯網
上載者:User

前言

每一個DBA在進行資料庫管理的過程中不可避免的要遇到形形色色的錯誤(ORA-1547 ,ORA-904,ORA-1578 ......)。有些錯誤由於頻繁出現、原因複雜而被 Oracle DBA 們戲稱之為"經典的錯誤"。其中ORA-3113 "end of file on communication channel" 就是這樣的一個。

我們可以簡單的把這個錯誤理解為Oracle用戶端進程和資料庫後台進程串連中斷。不過,導致這個錯誤的原因實際上有很多種:對資料庫設定不當、任何能導致資料庫後台進程崩潰的行為都可能產生這個錯誤。這個錯誤的出現還經常伴隨著其它錯誤,比如說:
ORA-1034 ORACLE not available
此外,該錯誤出現的情境複雜,可能出現在:
  • 啟動的Oracle的時侯
  • 試圖建立資料庫的時侯
  • 試圖對資料庫進行串連的時侯
  • 在用戶端正在運行SQL/PL/SQL的時侯
  • 備份/恢複資料庫的時侯
  • 其它一些情況下......
在論壇上也時常可以看到初級DBA對這個問題的求救。在這裡簡單的對該問題進行一下整理。

錯誤原因種種
根據網路上大家反映的情況來看,錯誤原因大約有這些:
  • Unix核心參數設定不當
  • Oracle執行檔案許可權不正確/環境變數問題
  • 用戶端通訊不能正確處理
  • 資料庫伺服器崩潰/作業系統崩潰/進程被kill
  • Oracle 內部錯誤
  • 特定SQL、PL/SQL引起的錯誤
  • 空間不夠
  • 防火牆的問題
  • 其它原因
在開始解決問題之前,作如下幾件事情:
  • 回憶一下在出現錯誤之前你都做了什麼操作,越詳細越好;
  • 查看 background_dump_dest 目錄中的 alertSID.log 檔案也是你必須要的事情;
  • 用Google.COM 搜尋一下,在互連網上有很多資訊等著你去發現,不要什麼都問別人。
當然, 如果你找到了一些對你更有協助的東西--這篇文檔就不用看了 :-)

錯誤原因情景分析
  • Unix核心參數設定不當 / init參數設定不當
如果資料庫在安裝過程中沒有設定正確的作業系統核心變數,可能在安裝資料庫檔案的時侯沒甚麼問題,在建立資料庫的時侯常常會出現03113錯誤。和此有關的另一個原因是init.ora 參數檔案中的processes參數指定了不合理的值,啟動資料庫導致錯誤出現(當然這個歸根到底也是核心參數的問題)。

這個錯誤資訊一般如下:
ORA-03113: end-of-file on communication channelORA-01034: ORACLE not availableORA-27101: shared memory realm does not exist 
解決辦法有兩個:

1、修改核心參數,加大相應核心參數的值(推薦);
2、減小init.ora參數的Processes的值。

需要注意的是:
SEMMSL必須設定為至少要10 + '進程數的最大值';
SEMMNS 也依賴於每個資料庫上的進程參數值。
  註:

這個錯誤類型只在Unix平台上出現。在Windows上如果processes的值過大,則會出現類似如下的錯誤:
ORA-00068: invalid value 24200001 for parameter max_rollback_segments, must be between 2 and 65535

/* 此時指定的參數值超過了65535 */

或者
ORA-27102: out of memory 
/* 小於65535的一個大參數值 */軟體環境:
Windows 2000 Version 5.0 Service Pack 3, CPU type 586ORACLE RDBMS Version: 8.1.7.0.0

在特定平台上更改核心參數可能會有差別,請參考Oracle Technet(http://otn.oracle.com)上的安裝文檔。對特定Unix平台的安裝文檔也有對核心參數意義的解釋。Init.ora中的參數如果設定不當,會產生該錯誤。有經驗表明:shared_pool_size設定 過小會出現錯誤,此外timed_statistics=true的設定也會帶來問題。
  • Oracle執行檔案許可權不正確/環境變數問題
這個問題只出現在Unix平台上。常見情況是有的時侯管理員為了方便而使用Unix的tar命令 處理過的壓縮包進行的安裝,或者是系統管理員指定了額外的OS使用者也可以管理資料庫卻沒 有指定正確的環境變數。
Oracle執行檔案在$ORACLE_HOME/bin目錄下,如果出現問題,應該用如下Unix類似命令來糾正 :
#chmod 7755 $ORACLE_HOME/bin/oracle 
有的時侯要對Oracle進行relink操作。
在Unix上通過cp拷貝安裝的時候,常常會出現環境變數的問題,和個別執行程式串連問題。LD_LIBRARY_PATH如果設定的不正確會導致問題,在這種情況下,需要對Oracle進行relink。 如果可執行檔oralcle被破壞,也要對其relink。 如果安裝了並行伺服器選項而Distributed Lock Manager沒有安裝或正確運行也會導致錯誤。
  • 用戶端通訊不能正確處理
1.SQL*Net磁碟機的問題:
如果使用的版本比較低的磁碟機,請更換到新版本的驅動。SQL*Net 的驅動沒有串連到Oracle可執行檔會導致錯誤。
2.檢查TCP/IP網路是否通暢;
3.Windows平台的常見網路問題:
在Windows平台建立資料庫的時侯,如果出現該問題可以考慮用如下的方法:

首先檢查本網設定.查看網路上是否有同名的結點或有衝突的IP.如果問題依舊,可以保 守的用下面的方法:

1). 禁用網卡:將本地串連狀態改為禁用;
2). 將sqlnet.ora檔案開啟(以記事本形式)將nts驗證注釋掉:
#SQLNET.AUTHENTICATION_SERVICES= (NTS) 
3). 建立資料庫;
4). 建立成功後,恢複本地串連;
  • 資料庫伺服器崩潰/作業系統崩潰/進程被異常的Kill
在串連過程中,如果Oracle資料庫的伺服器崩潰或者資料庫所在的作業系統崩潰,就會出現這 個錯誤,Oracle Server崩潰的原因可能因為主要後台進程死掉,被錯誤的進行了Kill操作。如果是這個原因還是比較容易解決的。此外,和OS有關的應用程式存在記憶體流失(或者有病毒)的時侯也會導致Oracle背景程式問題。 推薦排錯步驟:
  • 1、 查看應用軟體相關進程是否正常運行;
  • 2、 查看有無記憶體流失;
  • 3、 查殺病毒;
  • 4、 確定系統管理員沒有進行誤操作;
  • 5、 確定無駭客入侵行為;
  • 6、 其它不確定因素......
  • Oracle 內部錯誤 / Bug
如果查看background_dump_dest目錄中的alert.log發現有ora-600/ora-07445等錯誤,可以到Metalink網站上查看具體資訊及其解決方案。一般情況下要打軟體補丁。
  • 特定SQL、PL/SQL引起的錯誤
嘗試把SQL進行分開執行,也可以用SQL_TRACE來進行跟蹤,找到導致問題的SQL語句。在SQLPlus下:
ALTER SESSION SET sql_trace=TRUE;
SQL語句中的非法字元和不合理的處理結果,甚至一些不可解釋的原因偶爾會帶來問題.
SQL問題舉例:
SELECT *  FROM (SELECT ROWNUM AS num, k.*          FROM (SELECT   a.cp_code, c.cp_cha_name, a.service_code,                         a.service_name, a.content_name,                         SUBSTR (a.access_time, 1, 8) thedate,                         COUNT (*) AS hit_count                    FROM sm_wap_log_daily_tab a, t_cp_info c                   WHERE (SUBSTR (a.access_time, 1, 8) BETWEEN '20040301'                                                           AND '20040304'                         )                     AND c.cp_code LIKE '%%'                     AND a.cp_code = c.cp_code                     AND a.service_code LIKE '%%'                GROUP BY a.cp_code,                         c.cp_cha_name,                         a.service_code,                         a.service_name,                         a.content_name,                         SUBSTR (a.access_time, 1, 8)                ORDER BY a.cp_code,                         a.service_code,                         a.content_name,                         SUBSTR (a.access_time, 1, 8) DESC) k) n;
上面這條語句在9204/Linux 系統上始終出現03113 的錯誤。對語句進行細化,分成小一點的子語句逐步執行,最後判定問題出現在 
                 ORDER BY a.cp_code,                         a.service_code,                         a.content_name,                         SUBSTR (a.access_time, 1, 8) DESC) k) n; 
中的 SUBSTR (a.access_time, 1, 8) 這裡。 去掉SUBSTR (a.access_time, 1, 8)則問題不再出現。嘗試調整SUBSTR (a.access_time, 1, 8) 的位置,語句得到通過。之後,順便最佳化一下該語句。:) 
SELECT *  FROM (SELECT ROWNUM AS num, k.*          FROM (SELECT   a.cp_code, c.cp_cha_name, a.service_code,                         a.service_name, a.content_name,                         SUBSTR (a.access_time, 1, 8) thedate,                         COUNT (*) AS hit_count                    FROM sm_wap_log_daily_tab a, t_cp_info c                   WHERE (SUBSTR (a.access_time, 1, 8) BETWEEN '20040301'                                                           AND '20040304'                         )                     AND c.cp_code LIKE '%%'                     AND c.cp_code = a.cp_code                     AND a.service_code LIKE '%%'                GROUP BY a.cp_code,                         c.cp_cha_name,                         a.service_code,                         a.service_name,                         a.content_name,                         SUBSTR (a.access_time, 1, 8)                ORDER BY (SUBSTR (a.access_time, 1, 8)),                         a.cp_code,                         a.service_code,                         a.content_name DESC) k) n;
  • 系統空間不夠
任何時侯都要確保資料庫系統有足夠的空間.如果 USER_DUMP_DEST和BACKGROUND_DUMP_DEST沒有剩餘空間的話,會導致此問題.此外,如果開啟了審計,AUDIT目錄要由足夠的空間.如果啟用了Trace的話,Trace目錄要由足夠的空間.Dave Wotton的文檔 (Local Copy) 表明,在對錶進行插入資料的時侯,如果檔案超過了2G (而檔案系統有2G限制),會導致該問題.
  • 防火牆的問題
如果資料要通過防火牆,請聯絡系統管理員,詢問是否對資料庫資料進行了過濾或者是突然禁止了通訊連接埠。如本地安裝有個人防火牆,請檢查本地設定。
  • 其它方面說明
導致這個錯誤的原因有很多種,上面列到的只是一些典型情況。
參考資訊
Metalink - http://metalink.oracle.com Oracle的支援人員網站,要有CSI號碼才可以登入。
參考Note編號:
Note:17613.1ORA-3113 on Unix - What Information to CollectNOTE:131207.1How to Set UNIX Environment VariablesNote:131321.1How to Relink Oracle Database Software on UNIXNote:22080.1An Introduction to Error Message Articles

更多Oracle相關資訊見Oracle 專題頁面 http://www.bkjia.com/topicnews.aspx?tid=12

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.