ORA-12801: error signaled in parallel query server PZ99分析

wisdomone1發表於2015-07-05

分析結論

      這個案例本身很簡單,不難,就是想和大家分享下(主要是ORACLE的初學者,牛人請無視之)
1,查詢SQL的WHERE條件列的資料型別一定要明確
2,查詢報錯的幾個ORACLE錯誤,要學會分析,有些報錯可能只是表象,有煙霧彈的作用喲,小心上當
3,在分析排錯時,如果一種思路走不通,馬上嘗試另一種思路,本文我就採用了調換列值和反向思維,以及啟用自己的測試環境
   (在自己的測試環境你可以大膽操作,先把原理搞清晰,再在生產上操作),切切
4,學習方法很重要,歡迎與大家交流,共同提升


案例

今天在某客戶監控資料庫時,分析latch free等待事件,發現執行如下查詢SQL竟然報錯
   
 資料庫版本
SQL> select * from v$version;


BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE    11.2.0.4.0      Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production


  作業系統版本
SQL> host uname -a
AIX actdb4 1 6 00F902584C00

   發現有並行查詢報錯,沒啟用並行喲,怪怪?
SQL> select count(*) from gv$active_session_history where p1='070000000003A8A0';
select count(*) from gv$active_session_history where p1='070000000003A8A0'
*
ERROR at line 1:
ORA-12801: error signaled in parallel query server PZ99, instance actdb4:act42 (2)
ORA-01722: invalid number


查查上述資料庫報錯的原因,可以透過10397 EVENT可以關閉這個報錯,再次執行SQL就會報出真正的錯誤
(但我沒用過這個10397事件喲,風險幾何,本人不知喲)
SQL> host oerr ora 12801
12801, 00000, "error signaled in parallel query server %s"
// *Cause: A parallel query server reached an exception condition.
// *Action: Check the following error message for the cause, and consult
//          your error manual for the appropriate action.
// *Comment: This error can be turned off with event 10397, in which
//           case the server's actual error is signaled instead.


SQL> host oerr ora 01722
01722, 00000, "invalid number"
// *Cause: The specified number was invalid.
// *Action: Specify a valid number.


SQL> 

我們繼續分析,繼續上述有ORA-01722報錯


換一個值試下,卻是執行正常不錯嗎,可見是P1的值有問題
SQL> select p1 from gv$active_session_history where rownum=1;


                        P1
--------------------------
                      6844
可見用數字就OK了
SQL> select p1 from gv$active_session_history where p1='6844';


                        P1
--------------------------
                      6844

果然我們用特殊字元替代,哈哈報錯了 
SQL> select p1 from gv$active_session_history where p1='07A8';
select p1 from gv$active_session_history where p1='07A8'
*
ERROR at line 1:
ORA-12801: error signaled in parallel query server PZ99, instance actdb4:act42 (2)
ORA-01722: invalid number  


突然想起來,我們再看看P1的列資料型別,我的哈喲,是數字型別;回頭再想,確實和執行查詢SQL的第2個ORACLE報錯對應上了
SQL> desc gv$active_session_history;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INST_ID                                            NUMBER
 SAMPLE_ID                                          NUMBER
 SAMPLE_TIME                                        TIMESTAMP(3)
 IS_AWR_SAMPLE                                      VARCHAR2(1)
 SESSION_ID                                         NUMBER
 SESSION_SERIAL#                                    NUMBER
 SESSION_TYPE                                       VARCHAR2(10)
 FLAGS                                              NUMBER
 USER_ID                                            NUMBER
 SQL_ID                                             VARCHAR2(13)
 IS_SQLID_CURRENT                                   VARCHAR2(1)
 SQL_CHILD_NUMBER                                   NUMBER
 SQL_OPCODE                                         NUMBER
 FORCE_MATCHING_SIGNATURE                           NUMBER
 TOP_LEVEL_SQL_ID                                   VARCHAR2(13)
 TOP_LEVEL_SQL_OPCODE                               NUMBER
 SQL_OPNAME                                         VARCHAR2(64)
 SQL_PLAN_HASH_VALUE                                NUMBER
 SQL_PLAN_LINE_ID                                   NUMBER
 SQL_PLAN_OPERATION                                 VARCHAR2(30)
 SQL_PLAN_OPTIONS                                   VARCHAR2(30)
 SQL_EXEC_ID                                        NUMBER
 SQL_EXEC_START                                     DATE
 PLSQL_ENTRY_OBJECT_ID                              NUMBER
 PLSQL_ENTRY_SUBPROGRAM_ID                          NUMBER
 PLSQL_OBJECT_ID                                    NUMBER
 PLSQL_SUBPROGRAM_ID                                NUMBER
 QC_INSTANCE_ID                                     NUMBER
 QC_SESSION_ID                                      NUMBER
 QC_SESSION_SERIAL#                                 NUMBER
 PX_FLAGS                                           NUMBER
 EVENT                                              VARCHAR2(64)
 EVENT_ID                                           NUMBER
 EVENT#                                             NUMBER
 SEQ#                                               NUMBER
 P1TEXT                                             VARCHAR2(64)
 P1                                                 NUMBER                   






個人簡介

8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
服務過的客戶:
中國電信
中國移動
中國聯通
中國電通
國家電網
四川達州商業銀行
湖南老百姓大藥房
山西省公安廳
中國郵政
北京302醫院     
河北廊坊新奧集團公司

 專案經驗:
中國電信3G專案AAA系統資料庫部署及最佳化
      中國聯通4G資料庫效能分析與最佳化
中國聯通CRM資料庫效能最佳化
中國移動10086電商平臺資料庫部署及最佳化
湖南老百姓大藥房ERR資料庫sql最佳化專案
四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及最佳化
四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及最佳化
北京高鐵訊號監控系統RAC資料庫部署及最佳化
河南宇通客車資料庫效能最佳化
中國電信電商平臺核心採購模組表模型設計及最佳化
中國郵政儲蓄系統資料庫效能最佳化及sql最佳化
北京302醫院資料庫遷移實施
河北廊坊新奧data guard部署及最佳化
山西公安廳身份證審計資料庫系統故障評估
國家電網上海災備專案4 node rac+adg 
       貴州移動crm及客服資料庫效能最佳化專案
       貴州移動crm及客服務資料庫sql稽核專案
       深圳穆迪軟體有限公司資料庫效能最佳化專案

聯絡方式:
手機:18201115468
qq   :   305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900    
itpub部落格名稱:wisdomone1    http://blog.itpub.net/9240380/

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

相關文章