ORA-03137: TTC 協議內部錯誤: [12333]
【1】問題背景:Oracle資料庫版本為11.2.0.1,作業系統CentOS release 5.9,詳細的報錯資訊如下:
Dump file /data/oracle/diag/rdbms/db01/db01/incident/incdir_70215/db01_ora_17588_i70215.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /data/oracle/oracle11
System name: Linux
Node name: db01
Release: 2.6.18-348.el5
Version: #1 SMP Tue Jan 8 17:53:53 EST 2013
Machine: x86_64
Instance name: db01
Redo thread mounted by this instance: 1
Oracle process number: 52
Unix process pid: 17588, image: oracle@db01
*** 2014-06-20 22:33:42.577
*** SESSION ID:(204.33501) 2014-06-20 22:33:42.577
*** CLIENT ID:() 2014-06-20 22:33:42.577
*** SERVICE NAME:(SYS$USERS) 2014-06-20 22:33:42.577
*** MODULE NAME:() 2014-06-20 22:33:42.577
*** ACTION NAME:() 2014-06-20 22:33:42.577
Dump continued from file: /data/oracle/diag/rdbms/db01/db01/trace/db01_ora_17588.trc
ORA-03137: TTC 協議內部錯誤: [12333] [32] [49] [50] [] [] [] []
========= Dump for incident 70215 (ORA 3137 [12333]) ========
*** 2014-06-20 22:33:42.600
dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
----- Current SQL Statement for this session (sql_id=6v8rd0sq5a8m3) -----
select count(t.fd_id) as COUNT from sys_notify_todo_done_info t inner join
(select distinct(sysnotifyt1_.fd_subject) FD_SUBJECT,max(sysnotifyt0_.fd_id) as FD_ID
,sysnotifyt1_.fd_app_name,sysnotifyt1_.fd_type,sysnotifyt1_.fd_create_time
from sys_notify_todo_done_info sysnotifyt0_ inner join sys_notify_todo sysnotifyt1_
on sysnotifyt0_.fd_todoid=sysnotifyt1_.fd_id
where (sysnotifyt0_.fd_elementid = :1)
group by sysnotifyt1_.fd_subject,sysnotifyt1_.fd_app_name,sysnotifyt1_.fd_type,sysnotifyt1_.fd_create_time) f on t.fd_id = f.fd_id
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
*** 2014-06-20 22:33:42.834
skdstdst()+36 call kgdsdst() 000000000 ? 000000000 ?
7FFF5BCF02B8 ? 000000001 ?
7FFF5BCF47B8 ? 000000000 ?
ksedst1()+98 call skdstdst() 000000000 ? 000000000 ?
7FFF5BCF02B8 ? 000000001 ?
000000000 ? 000000000 ?
ksedst()+34 call ksedst1() 000000000 ? 000000001 ?
7FFF5BCF02B8 ? 000000001 ?
【2】問題的解決方案
Metalink上面居然沒有發現癥狀一樣的問題,關於ORA-03137的錯誤,問題有很多,常見的問題有JDBC、綁定變數窺視、ORACLE的BUG等,Metalink也提供了一系列的排查方法,具體如下:
2.1 綁定變數的窺視
解決方案:SQL> alter system set "_optim_peek_user_binds"=false;
弊端:關閉綁定變數的窺視,會導致當SQL語句使用綁定變數的時候,產生的執行計畫可能會出現不準,在生產環境中要長期關閉該特性需要認真測試;
2.2 更新資料庫最新的PSU,當通過禁用綁定變數後資料庫不再報錯,可以應用每個資料庫最新的PSU。或者當禁用綁定變數的時候也繼續報錯,也可以考慮應用PSU進行測試;
以下是相關的PSU資訊:
PSU 11.1.0.7.8 Patch 12419384 includes Patch:9703463.
For 11.1.0.7, Patch 9243912 can be applied on top of 11.1.0.7.8 ( no conflict).
Patch:9703463 can also be applied individually but requires PSU 11.1.0.7.6
Patch:8625762 may also be applicable to databases version 11.1.0.7
2.3 更新資料庫到11.2.0.3這個版本
在ORACLE 11.2.0.3這個版本中可以解決所有的ORA-3137的錯誤;
2.4 聯絡ORACLE SUPPORT解決這個問題 經過以上操作,你都踩到這個地雷了,說明樓主平時燒香少,需要聯絡ORALCE的大神麼出手;
【3】總結:經過驗證發現運行alter system set "_optim_peek_user_binds"=false後報錯就消失了;
其實很多時候我們可以規避這個問題的,因為當初在選擇資料庫版本的時候,當初沒有什麼經驗直接安裝了11.2.0.1這個版本,大家都知道R1版本的BUG是比較多的,R2相對來說會穩定很多,但是在選擇資料庫的時候,也建議不要選小版本為1的,現在我裝資料庫的時候一般都會選擇11.2.0.3這個版本;