暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

sqlnet问题的一种常用定位方法

白鳝的洞穴 2020-06-12
1423
Oracle数据库出现一些SQL*NET问题如何定位呢?似乎很多DBA都比较怕遇到SQL*NET方面的问题,因为这方面的定位手段十分有限,而且涉及到底层的网卡、操作系统中的驱动、Oracle的SQL*NET客户端与服务器端的兼容性、JDBC引擎等多种复杂的场景。
实际上遇到这种问题,如果问题是可重现的,那么我们完全可以使用客户端TRACE的方式。因为生产库的服务器端TRACE一旦开启,会在服务器端产生大量的TRACE文件,对系统总体影响比较大。如果我们能在客户端模拟出故障场景,则我们只需要开启这个客户端的TRACE就可以定位问题了。开启客户端TRACE的方法很简单,只需要在我们的客户端的sqlnet.ora文件中设置参数就可以完成。
trace_level_client = 16
trace_file_client = cli
trace_directory_client = c:\trace
生成的TRACE文件是这样的:

今天翻到一个案例,是2008年时候一个客户遇到的。当时客户的一套系统中安装一个新模块,需要用sql*loader导入一批数据。在导入时遇到LDR-704和ORA-12170错误。客户也很困惑,不知道问题出在哪了。由于问题是可以重现的,所以我们第一时间就做了一个CLIENT TRACE。在TRACE中我们很容易就发现了错误:
5580) [7-11月-2008 14:07:19:324] nttcnp: creating a socket.
(5580) [7-11月-2008 14:07:19:324] nttcnp: exit
(5580) [7-11月-2008 14:07:19:324] nttcni: entry
(5580) [7-11月-2008 14:07:19:324] nttcni: trying to connect to socket 3804.
(5580) [7-11月-2008 14:07:40:351] ntt2err: entry
(5580) [7-11月-2008 14:07:40:351] ntt2err: soc 3804 error - operation=1, ntresnt[0]=505,ntresnt[1]=60, ntresnt[2]=0
(5580) [7-11月-2008 14:07:40:351] ntt2err: exit
(5580) [7-11月-2008 14:07:40:445] nttcni: exit
(5580) [7-11月-2008 14:07:40:445] nttcon: exit
(5580) [7-11月-2008 14:07:40:445] nserror: entry
(5580) [7-11月-2008 14:07:40:445] nserror: nsres: id=0, op=65, ns=12535, ns2=12560;nt[0]=505, nt[1]=60, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
(5580) [7-11月-2008 14:07:40:445] nsopen: unable to open transport
从TRACE文件中可以看出,SQL*NET准备去连接一个3804号的端口,在连接该SOCKET的时候出现了错误。TNS层的报错是TNS-505,OS层没有错误号。这种现象如果你了解客户端连接监听并创建会话的过程就很容易发现问题在哪了。ORACLE的客户端通过监听创建会话的时候需要经过两个阶段。第一个阶段是客户端通过监听端口(缺省是1521)连接监听进程。监听进程经过初步握手校验后就创建一个子进程(就是我们所说的前台进程或者SERVER 进程),并分配一个新的SOCKET端口号让客户端与前台进程通讯。此时客户端需要重新打开一个新的SOCKET,这个模式叫做网络重定向。
当客户端与数据库服务器之间存在防火墙,并且启用了NAT服务的时候,由于客户的防火墙没有装载Oracle支持的模块(早期防火墙这个模块都要收费)或者重定向的端口没有开放策略,那么这种重定向工作可能会失败,此时Oracle的会话就会中断。
于是我们让客户在服务器的网段上进行导入,导入就成功了,这说明我们的推断是正确的。
不过由于这个数据导入是每天都要做的,而且不可能每次都到机房里去进行数据导入。用户需要我们提出一个解决方案。
对于这种情况,Oracle公司已经有了解决方案,这就是CMAN,CMAN是CONNECT manager的官方名称。CMAN使用SHARED SERVER的方式让客户端与服务器进行连接。通过CMAN代理连接数据库的服务进程的时候不需要进行网络重定向,这样就不会出现这样的问题了。

配置CMAN的方法比较简单,在Oracle MOS官方文档A Guide to CMAN Configuration for 10g and Newer Releases (Doc ID 298916.1) 中有详细的描述,我这里就不占用篇幅了。

要注意的是,如果你有大量的客户端要使用CMAN,那么一定要配置好服务器端的SHARED SERVER,在服务器端资源足够的情况下,确保每个客户端都能够分配到一个SHARED SERVER,不要让SERVER进程在多个客户端之间共享(这样会影响SQL的执行效率)。

最后修改时间:2020-06-12 09:26:11
文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论