范美卉,张俊萌
(大连康复疗养中心,辽宁 大连 116013)
想要使用Oracle 数据库,首先需要用户与数据库建立连接,而怎么在两者之间建立连接,Oracle使用了一个叫网络服务的概念,从而客户端或者中间层的应用服务器与数据库服务器能建立连接,并能在两者之间传递数据。在客户端,网络服务作为后台运行的进程,在数据库服务器端,网络服务则通过一个叫“监听器”的组件接收来自客户端的连接请求。监听器(LISTENER)是位于服务器端的、独立运行的一个后台进程,运行在服务器端,但独立于数据库服务器单独运行,在数据库没有启动的时候,监听器也能独立运行。
Oracle 监听负责监听客户端传入的连接请求,同时也负责调整服务器的连接负荷。客户端试图连接数据库服务器时,监听器将接收到客户端的请求并将其传递给服务器进行处理。一旦客户端与服务器建立连接,它们之后将直接进行通信,而不再需要监听器的介入,监听器将保持空闲状态。dbca建库后一般会有默认配置好的监听,默认服务端口是1521,通常一个库一个监听就足够,但如果需要处理大量并发请求数,就可能需要配置多个监听,非默认监听的端口号设置成大于1024,不同监听之间服务名和端口号不能一样[1]。
配置监听器有两种方法。
如图1所示,选中图中的Oracle Net配置下的本地树形目录中的监听程序项,再点击左侧绿色的“+”按钮添加监听程序,点击监听程序目录,新加的监听器名称默认为LISTENER。选中该名称,窗口右侧栏的下拉选项中含有四个选项:一般参数、监听位置、数据库服务、其他服务,选中“监听位置”,点击添加地址按钮。在出现的网络地址栏的协议下拉选项中选中“TCP/IP”,主机文本框中输入主机名称或IP地址(如果主机即用作服务端也作为客户端,输入两项之一均有效;如果主机作为服务端并需要通过网络连接,建议输入IP地址),端口文本框中输入数字端口,默认是1521,也可以自定义任意有效数字端口[2]。
图1 Net Manager
在对监听器配置文件进行任何修改之前,先备份原始的listener.ora 文件,以防出现意外情况导致配置错误。
ORA-12541:TNS:无监听程序报错常见原因是监听程序未启动或已停止。如果监听程序未运行,那么客户端就无法与数据库建立连接,从而导致ORA-12541错误的出现。此外,还可能存在网络故障、防火墙设置不正确或数据库实例未正确注册到监听程序等问题。除了这些普遍的报错原因,有一种情况是我们日常里经常忽略的,是因为系统的监听日志文件(listener.log)的大小超过了4GB,导致在监听程序往日志文件里面写日志时写入不成功,从而使监听不能正常运行,客户端连接不上服务器,不能正常登录。
监听器日志(listener.log)是一个存储关于监听器工作和错误信息的记录库,用于记录和描述监听器的工作过程和错误情况。通过仔细研究日志的内容,就能够发现一些当前监听器所存在的问题,从而解决相关连接故障,并更加深入地理解监听器的工作原理。监听器日志是通过监听器自动创建的纯文本文件,如果日志文件丢失,系统会自动重新生成一个同名的文件,与告警日志文件相类似。监听器日志文件的尺寸会不断自动增长,占用额外的存储空间,超过4GB会导致LISTENER 监听器无法处理新的连接,超过2GB 给写入、查看带来的一些性能问题,所以通常过2GB时就应该将其备份。
首先找到监听器日志所在目录,一般在$ORACLE_HOME/network/log 的目录下,如果数据库是Oracle 11g则位于$ORACLE_BASE/diag/tnslsnr/$hostname/listener/listener.log。Oracle 监听器在运行时由于无法对日志文件进行一些删除、重命名操作,所以只能先将监听服务停了再操作。先停止Oracle监听服务,然后对日志文件进行备份,将文件重命名,再重新打开监听服务,这时就能在原日志文件位置处看到一个新的listener.log文件生成了。
ORA-12516:TNS:监听程序找不到符合协议堆栈要求的可用处理程序,当Oracle数据库的请求量超过监听程序的处理能力时,就会出现这个错误。优化数据库性能:如果ORA-12516错误是由于数据库负载过重引起的,可以通过优化数据库的性能来减轻负载,比如调整SQL 查询、增加数据库缓存等措施。增加监听程序的处理能力:可以通过增加监听程序的最大连接数或者调整其他相关参数来增加其处理能力。即session进程数不够,超过连接最大进程数值从而导致无法登录,即使用sys as dba 也登录不上,首先需要先断开正在占用的procress,即停掉几个tomcat即可释放连接,接下来就可以正常登录了[3]。
1)先把电脑重启,这样后台会释放一些连接数,但这个方法很明显只是阶段性解决了连接故障,治标不治本,暂时性的缓解数据库压力,一段时间后仍然会出现这个问题。
2)直接修改Oracle数据库的最大连接数与最大进程数。
①打开运行界面输入cmd回车进入数据库服务器dos界面。
sqlplus/nolog
conn/as sysdba --以sysdba 管理员身份登录数据库
select count(*)from v$process --查看数据库当前进程数
select count(*)from v$session --查看数据库当前连接数
select value from v$parameter where name ='processes' --查看数据库允许的最大连接数
select value from v$parameter where name='sessions' --查看数据库允许的最大进程数
alter system set processes=800 scope=spfile --修改最大进程数为800
alter system set sessions=335 scope=spfile --修改最大连接数:为885(ORACLE 的连接数与其进程数关系最好为sessions=(1.1*process+5))
shutdown immediate --关闭数据库
startup --启动数据库[4];
②关闭cmd 命令窗口,打开”任务管理器”,点击“服务”选项,找到oracleoradb11g_home1TNSListener,OracleServiceORCL 服务鼠标右键选择“重新启动”。
出现如上报错情况,最大可能是在配置Oracle 客户端时,步骤上有些错误被人忽略掉了。1)服务名或SID 错误:检查listener.ora 文件中的配置,确保在连接描述符中指定了正确的服务名或SID。2)监听程序未启动:如果监听程序未运行或未正确配置,那么它将无法识别连接请求的服务。确认监听程序是否已经启动,并且监听器配置文件listener.ora 中是否包含了正确的监听地址和端口。3)防火墙或网络问题:防火墙或网络配置问题可能会导致监听程序无法正常工作。确保网络连接没有被阻塞,并且防火墙允许通过监听程序使用的端口进行通信。4)监听程序故障:有时候监听程序可能会出现故障或停止工作。你可以尝试重新启动监听程序来解决此问题。若是第一次连接报错,大概率是因为在你安装完之后未配置监听或者监听失效了,就需要重新配置监听。打开监听程序和网络服务配置助手,如图2所示。
图2 监听程序和网络服务配置助手
选择监听程序配置,点击下一步,先把失效的监听删除,之后再在配置助手里重新添加,在图3界面进行添加和删除操作,监听名默认为LISTENER。也可能之前虽配置了监听但是系统未写入listener.ora 文件中,所以只需要在该文件中写入配置参数就可以了。当务之急是需要重新启动Oracle数据库的服务器,重启后再进行连接,此时我们就能连接上数据库了,同时发现连接PL/SQL 也成功了。若是突然连接不上,则查看Oracle服务是否开启,即OracleServiceORCL重启一下。
图3 监听程序的添加与删除
在Oracle 数据库安装完成后,程序都正常运行了一段时间,但突然某日发现数据库就无法登录了,在Oracle 安装服务器本地cmd 中执行sqlplus as sysdba,结果就提示:ORA-12560,协议适配器错误。
报错原因及解决方法出现ORA-12560: TNS: 协议适配器错误的问题的原因,总结如下。
1)Oracle监听服务没有启动起来或者监听服务失效、database instance数据库实例没有启动起来。下面都以Windows操作系统作为示例,进行操作说明:点击开始运行,输入services.msc,打开服务面板,重新启动OracleOraDb11g_home1TNSListener 服务(以Oracle11g数据库为例)。同样的在服务面板,重新启动oracleserviceXX,XX是自己设置的database SID,例如我的服务OracleServiceORCL,ORCL就是配置的实例名。
2)注册表问题,数据库实例名存在更改情况。点击运行,输入regedit,进入注册表文件,找到KEY_LOCAL_MACHINE 文件夹下的SOFTWARE 下的ORACLE的HOME0,将里面的ORACLE_SID这个环境变量设置为自己设置的database SID。然后右击我的电脑,点击属性,选中高级选项栏,点击环境变量,对系统变量进行配置,新建系统变量,编辑变量名为oracle_sid,变量值为自己设置的database SID。
3)核实本地环境变量path的值。值为C:appAdministratorproduct11.2.0client1in;
D:appClient64Administratorproduct11.2.0client 64in%JAVA_HOME%in;%JAVA_HOME%jrein。在此处可以看出两个问题:第一,path配置了两个客户端的client的oracle变量,没有配置数据库服务端的路径;第二,数据库服务端的路径没有单独配置oracle_home 环境变量[5]。解决方案:添加独立的oracle_home环境变量,变量值为路径:C:appAdministratorproduct11.2.0dbhome_1。修改path环境变量值,修改后值为:%ORACLE_HOME%in;
C:appAdministratorproduct11.2.0client_1in;D:appClient64Administratorproduct11.2.0client_64in;%JAVA_HOME%in;%JAVA_HOME%jrein也就是在原来的path 路径中添加了一个引用oracle_home的路径:%ORACLE_HOME%in。
数据库管理者与维护人员在与数据库打交道的日常工作中,会遇到很多连接故障问题,如何快速排除数据库故障需要不断探索、学习。当连接Oracle 数据库遇到监听错误时,应该首先确定具体的错误代码,并根据错误信息采取相应的解决方法。通过仔细检查监听程序配置、网络连接和数据库性能等方面的问题,可以解决大多数的Oracle监听错误。本文以监听相关的4种常见连接报错为例,分析了报错的原因并给出了相应的解决方法,为技术人员在遇到Oracle 监听常见报错时提供了解决的参照方法。