分析结论
这个案例本身很简单,不难,就是想和大家分享下(主要是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/,如需转载,请注明出处,否则将追究法律责任。