一次ORA-600故障的處理

wmlm發表於2008-02-04

日期:20080203
關鍵字:
ora-600 kksscl-inf-inl-loop
Connection aborted by peer: socket write error
java.sql.SQLException: 無法從套接字讀取更多的資料
內容:
收到開發人員發來的郵件,告知JAVA應用程式 執行系統一段時間後,報“獲取資料庫連線失敗”,“無法從套接字獲取更多資料”,要求解決此問題

[@more@]

內容:
收到開發人員發來的郵件,告知JAVA應用程式 執行系統一段時間後,報“獲取資料庫連線失敗”,“無法從套接字獲取更多資料”,要求解決此問題
附件中的日誌摘抄部分內容如下:
java.sql.SQLException: Io 異常: Connection aborted by peer: socket write error
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
at oracle.jdbc.driver.OracleStatement.(OracleStatement.java:389)
at oracle.jdbc.driver.OracleConnection.privateCreateStatement(OracleConn
ection.java:772)
at oracle.jdbc.driver.OracleConnection.createStatement(OracleConnection.
java:712)
at weblogic.jdbc.pool.Connection.createStatement(Connection.java:356)
......
java.sql.SQLException: 無法從套接字讀取更多的資料
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
......

到現場後首先檢查報警日誌,其中有以下資訊:
Sat Feb 02 15:44:06 2008
Errors in file d:oracleadmingljkudumpgljk_ora_3200.trc:
ORA-00600: internal error code, arguments: [kksscl-inf-inl-loop], [1521], [199], [199], [955], [955], [], []

Sun Feb 03 12:26:07 2008
Errors in file d:oracleadmingljkudumpgljk_ora_3364.trc:
ORA-00600: internal error code, arguments: [kksscl-inf-inl-loop], [1521], [23], [23], [103], [103], [], []

透過檢視UDUMP下的日誌,找出有以下SQL語句:
select yhdm,yhmc,yhmm,dh,qxjgdm,sybz,sydz,fysz,color
from gljk_xt_yhxx t
where yhdm=(select SWRY_DM from P12366_CTAIS2_USER where NAME=:"SYS_B_0")
.......

上網查了一下資料,有以下原因可能會造成此類錯誤:
1 資料庫版本需要升級(目前是9201+windows2000 as)
2 表或索引上有資料壞塊
3 SESSION之間的阻塞
4 初始化引數設定
參考metalink文件:ORA-600[kksscl-inf-inl-loop] during heavy load with CURSOR_SPACE_FOR_TIME=TRUE

計劃處理此問題的步驟如下:
1 找ORACLE支援(公司不出錢,這一步跳過去)
2 掃描表及索引,檢視是否有壞塊,如果有,進行壞塊修復,或表及索引的重建
3 在應用停了之後,升級資料庫到9204,檢查以下初始化引數
cursor_space_for_time=false
session_cached_cursors=0
cursor_sharing=force
4 在下次錯誤發生,檢視阻塞的SESSION
如果是因為SESSION阻塞,造成的應用程式中的錯誤,修改以下初始化引數
- set TIMED_STATISTICS=FALSE
- set _row_cache_cursors=20 or more (10 default)
- don't do any kind of tracing

檢查過程:
SQL> select 'ANALYZE TABLE '||table_name||' VALIDATE STRUCTURE CASCADE ;' from user_tables;

發現問題:
SQL> ANALYZE TABLE gs12366_gljk.GLJK_YSWG_LIST VALIDATE STRUCTURE CASCADE ;
ANALYZE TABLE gs12366_gljk.GLJK_YSWG_LIST VALIDATE STRUCTURE CASCADE
*
ERROR 位於第 1 行:
ORA-01499: table/index cross reference failure - see trace file

開發人員還有一些附加的要求:
系統設計的是定期將gljk_yswg_list中的資料刪除後放在歷史表中(2733918條記錄),但總是有一些資料在插入時提示列值過大,而兩個表結構一樣,也找不到原因.
積累到現在共有205045條記錄,

處理過程:
先檢視空閒的表空間,確認是否有足夠的空間來儲存臨時資料
1 create table wang_temp1 as select * from GLJK_YSWG_LIST where skssq>'2008' ;
-- 共有87114條
2 create table wang_temp2 as select * from GLJK_YSWG_LIST where skssq-- 共有205045條
3 停掉所有相關的JAVA應用
4 備份表上的建索引指令碼,rename table GLJK_YSWG_LIST;
5 rename table ww_temp1 to GLJK_YSWG_LIST;
6 執行建立索引指令碼,補充上索引.(表上沒有觸發器,如果有,還需要還原)
7 進入測試查詢
8 將wang_temp2中的資料插入到歷史表GLJK_YSWG_HISTORY_LIST中.如果批次插入失敗,寫一個簡單的儲存過程進行插入,並捕捉不能插入的記錄,分析原因進行解決.
9 處理完畢後,刪除中轉表wang_temp1 wang_temp2

在此做個記錄,以供以後出現類似問題時參考.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/271063/viewspace-999054/,如需轉載,請註明出處,否則將追究法律責任。

相關文章