1 环境
oracle 11.2.0.4 RAC(2 nodes),centos 6.8,实体机
2 问题
线上环境执行一条sql
sql> select ST_AsText(ST_Geometry('POINT (10 10)', 0)) from dual;
session第一连次接耗时稳定20秒,后面消耗毫秒级,前期开发已经进行排除index,碎片等问题
执行计划如下:
SQL> select ST_AsText(ST_Geometry('POINT (10 10)', 0)) from dual;
ST_ASTEXT(ST_GEOMETRY('POINT(1010)',0))
--------------------------------------------------------------------------------
POINT ( 10.00000000 10.00000000)
Execution Plan
----------------------------------------------------------
Plan hash value: 1388734953
-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 2 (0)| 00:00:01 |
| 1 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
Statistics
----------------------------------------------------------
2092 recursive calls
208 db block gets
3232 consistent gets
16 physical reads
0 redo size
1167 bytes sent via SQL*Net to client
949 bytes received via SQL*Net from client
5 SQL*Net roundtrips to/from client
113 sorts (memory)
0 sorts (disk)
1 rows processed
3 解决思路
线上环境经过执行sql,发现每一次初始session连接的时候,该执行都会花费稳定20秒(凡是调用这个外部lib库的sql)
测试环境执行该sql,没有发现任何异常,返回都是毫秒级
于是对2个环境进行对比(系统,网络,架构,以及oralce参数文件)
测试 线上
系统 centos6.8 虚拟机 centos6.8 实体机
oracle版本 11.2.0.4.0 - Production 11.2.0.4.0 - Production
实例 RAC 2nodes RAC 2nodes
然后是测试环境的cp,expdp的文件导入线上的环境,除了网络ip和内存等大小,其他参数几乎都一样
这个时候,只好拿出2边的AWR报告来对比了(--可以参考一篇关于awr的文章)
测试环境的awr报告
检查线上的awr报告,发现,红圈标注
--此事件 External Procedure initial connection 稳定花费20秒,于是就基本确认是这个调用lib库的问题。
期间查询网络文档,很少有相关的资料,于是就重新上传lib库文件,发现问题依旧,然后在本地环境试着导入测试的expdp文件,发现还是不能复现线上的问题
奋战到11点,今早上来,发现帖子有人回(newkid大神)
http://www.itpub.net/thread-2106999-1-1.html
引用的链接https://community.oracle.com/thread/2490921,在昨天的同事也发过一次(以为是grid的sqlnet文件,发现是正常的,而且线上和测试环境的配置都是一样的),这里再稍微仔细的看了一遍。
抱着测试的心态,先在本地环境oracle rdbms home的路径加了该文件,2个节点都添加,然后重启监听
--因为是11.2.0.4的rac环境,监听是grid用户在管理,
[grid@rac2 ~]$ cat /u01/app/11.2.0/grid/network/admin/listener.ora
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
[grid@rac2 ~]$ cat /u01/app/11.2.0/grid/network/admin/sqlnet.ora
# sqlnet.ora.rac2 Network Configuration File: /u01/app/11.2.0/grid/network/admin/sqlnet.ora.rac2
# Generated by Oracle configuration tools.
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
ADR_BASE = /u01/app/grid
[grid@rac2 ~]$ cat /u01/app/11.2.0/grid/network/admin/endpoints_listener.ora
LISTENER_RAC2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=rac2vip)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=10.15.7.12)(PORT=1521)(IP=FIRST)))) # line added by Agent
[grid@rac2 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
a =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = scanip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = abc)
)
)
[grid@rac2 ~]$ cat /u01/app/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora
NAMES.DIRECTORY_PATH= (TNSNAMES)
发现问题消失,然后经过几次测试,都是毫秒级返回。然后就在线上机器上进行修改并进行测试,发现问题消失,问题消失,问题消失
--事后疑问:本地环境,测试环境都没有添加文件/u01/app/oracle/product/11.2.0/db_1/network/admin/sqlnet.ora ,但是没有出现调用外部lib库的sql执行缓慢的问题,为什么线上环境就出现了
--线上环境,这里即将上线的,所以可以进行一定的修改和重启(正式线上的环境建议慎重修改--足够的测试和选择时间等。。)
--结合官方文档(https://docs.oracle.com/cd/E11882_01/network.112/e41945/toc.htm),对oralce的监听文件,listener.ora,sqlnet.ora,tnsname.ora进行学习了一遍