ora-12542 address in used

本文介绍了解决Windows环境下因临时端口不足导致的ORA-12542错误的方法,包括调整端口范围及缩短等待时间等。
这主要是由于  操作系统的  临时端口  不够用而引起的。  一般系统的  临时端口为  1024-5000,这在多用户的环境下,3000多个oracle链接就用光了。由于每个链接断开以后,还要有一个等待时间,例如在  windows  系统中,这个时间是  120秒。  
        这就导致了一个现象:  一会可以联通,一会又出现  ora-12542  address  in  used  。如果有临时端口可以使用,可以联通oracle;如果暂时端口没有了,就连不通了。
        一下是在  windows  系统下的解决办法。
      1  进入注册表编辑器(regedit),在  HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Tcpip\Parameters  里,编译-> 添加-> MaxUserPort  (类型  REG_DWORD  ),  值中填写  65534,(可以的范围是5000-65534).
      2  退出  注册表编辑器,重新启动机器.  

    这样设置,  临时端口的范围从  1024-5000,增大到  1024-65534,  足够一般用户的使用,不会再出现ora-12542.  

      其他系统也可以做类似的设置. 

转:http://blog.sina.com.cn/s/blog_53bedb6e0100feu3.html
阿宋谈关于ORACLE的端口(TNS-12542) (2009-11-06 17:04:16)

     做了这么久的数据库开发,这里留点我对ORACLE端口的掌握,ORACLE各版本默认端口均是1521,可以修改,但是ORACLE9I的 WINDOWS版,使用了动态端口技术,装上后默认的是动态端口模式,如果需要改成静态端口,则只需要在 HKEY_LOCAL_MACHINE->SOFTWARE->ORACLE->HOME0下增加一个名为 use_shared_socket的字符串键,键值为true,保存后重新启动ORACLE服务即可。

     动态端口和静态端口有什么区别呢,静态端口,就是说,不管你来多少请求连接,我都是不断的开无数个1521端口上的连接给你,动态就是只有前一个是1521,后面就从1024-5000开临时端口给你。

     那么,不管是哪种模式,只要消耗完了系统的临时端口,就会让ORACLE的远程连接出现暂时的当机,甚至造成操作系统的崩溃。

 

    这主要是由于操作系统的临时端口不够用而引起的。一般windows系统的临时端口为 1024-5000,由于每个链接断开以后,还要有一个等待时间,例如在windows系统中,这个时间默认是240秒。这就导致了一个现象:一会可以联 通,一会TNSPING的时候又出现 TNS-12542: TNS: 地址已被占用(ora-12542 address in used。)
    如果有临时端口可以使用,可以联通oracle;如果暂时端口没有了,就连不通了

 

 

TNS-12542: TNS: 地址已被占用

 

问题描述:

执行 tnsping 命令提示:TNS-12542: TNS: 地址已被占用

应用中报错:

java.sql.SQLException: Io 异常: The Network Adapter could not establish the conn
ection

 

在WINDOWS下可以缓解的办法:

 

1.   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 TcpTimedWaitDelay 的新 REG_DWORD 值。 将此值设置为十进制 30,其为十六进制 0x0000001e。该值将等待时间设置为 30 秒。(超过30秒自动销毁已经断开的连接)
缺省值:0xF0,它将等待时间设置为 240 秒(4 分钟)。建议值:最小值为 0x1E,它将等待时间设置为 30 秒。
2.    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\TCPIP\Parameters 注册表子键并创建名为 MaxUserPort 的新 REG_DWORD 值。缺省值:无 建议值:至少十进制 32768,最大65534,这个对动态端口有用,用来表示最大可以分配到的端口号

 

修改保存后重启机器

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/118838/viewspace-621803/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/118838/viewspace-621803/

<think>好的,我现在需要帮助用户解决Oracle数据库远程连接时遇到的ORA-00604和ORA-01000错误。首先,我得回忆一下这两个错误代码分别代表什么。 ORA-00604通常表示递归SQL错误,可能发生在执行某些系统级操作时,比如权限检查或者触发器等。而ORA-01000是超出最大游标数的错误,通常是因为应用程序没有正确关闭游标,导致游标泄漏。 用户提到的是安装后的远程连接问题,所以需要结合这两个错误来分析。首先,考虑远程连接的基本配置是否正确,比如监听器配置、tnsnames.ora文件是否正确设置。然后,可能涉及到数据库参数设置,比如游标数是否过小,或者权限问题。 根据提供的引用,引用[4]提到ORA-04052和ORA-00604可能与远程对象访问有关,可能涉及分布式事务或dblink的问题。但用户的问题是在连接时出现的,可能还没有到使用dblink的阶段,所以可能需要检查更基础的设置。 另外,引用[1]和[2]提到了OCI版本不兼容的问题,但用户当前的错误不是ORA-28547,所以可能不需要处理OCI版本。不过,还是需要确认用户使用的客户端工具是否正确,比如Navicat的版本是否与Oracle服务器版本兼容。 接下来,ORA-01000错误通常与游标数有关。需要检查数据库的OPEN_CURSORS参数设置是否过低。默认值通常是300,如果应用程序有大量未关闭的游标,可能需要调整这个参数。但如果是刚安装的数据库,可能用户的应用程序或连接池配置有问题,导致游标未正确释放。 此外,递归SQL错误ORA-00604可能由多种原因引起,比如系统表空间不足、权限问题、触发器错误等。需要检查alert日志获取更详细的错误信息,确定具体的递归SQL语句。 可能的解决步骤包括: 1. 检查监听器配置和网络连通性,确保远程连接可达。 2. 检查OPEN_CURSORS参数,适当增大其值。 3. 检查系统表空间是否足够,扩展表空间或清理数据。 4. 检查用户权限是否正确,尤其是涉及系统视图的访问权限。 5. 查看数据库的alert日志,定位具体错误原因。 6. 确保客户端工具版本兼容,比如使用正确版本的JDBC驱动或OCI库。 另外,可能需要重启数据库实例或监听器,但需要谨慎操作。如果用户是初次安装,可能存在配置遗漏,比如没有正确配置监听器或服务名,导致连接时出现问题,进而引发递归错误。 还要考虑是否有触发器或存储过程在连接时自动执行,导致错误。比如,登录触发器如果有错误,可能在连接时触发ORA-00604。 综上,需要逐步排查网络配置、参数设置、权限、日志信息等方面,结合具体错误信息进行针对性解决。</think>### Oracle远程连接ORA-00604和ORA-01000错误解决方案 #### 一、错误原因分析 1. **ORA-00604(递归SQL错误)** 通常发生在系统级操作中,例如: - 权限验证时访问系统表失败 - 系统表空间不足或损坏 - 触发器/存储过程存在逻辑错误[^4] 2. **ORA-01000(超出最大游标数)** 根本原因是: - 数据库参数$OPEN\_CURSORS$设置过低(默认值300) - 应用程序未正确关闭游标导致泄漏 #### 二、分步解决方案 **第一步:检查基础配置** 1. 验证监听服务状态 ```bash lsnrctl status ``` 确认监听器是否包含目标数据库实例,若未启动则执行: ```bash lsnrctl start ``` 2. 检查$tnsnames.ora$配置 确保客户端配置文件中包含完整的连接描述符: ``` ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) ``` **第二步:调整数据库参数** 1. 修改游标数量(需DBA权限) ```sql ALTER SYSTEM SET open_cursors = 1000 SCOPE=BOTH; ``` $$OPEN\_CURSORS = 1000$$ *推荐值根据应用需求调整* 2. 检查系统表空间 ```sql SELECT tablespace_name, used_percent FROM dba_tablespace_usage_metrics WHERE tablespace_name='SYSTEM'; ``` 若使用率超过85%,需扩展表空间: ```sql ALTER DATABASE DATAFILE '/u01/oracle/oradata/SYSTEM01.DBF' RESIZE 2G; ``` **第三步:排查权限问题** 1. 授予必要权限 ```sql GRANT SELECT ON v_$session TO [username]; GRANT EXECUTE ON dbms_lock TO [username]; ``` 2. 检查角色权限传递 ```sql SELECT * FROM dba_role_privs WHERE granted_role='CONNECT'; ``` **第四步:分析日志定位根源** 1. 查看alert日志路径 ```sql SELECT value FROM v$diag_info WHERE name = 'Diag Trace'; ``` 2. 重点检查日志中递归SQL语句: ``` ORA-00604: error occurred at recursive SQL level 1 ORA-01000: maximum open cursors exceeded ``` #### 三、高级排查方案 1. **跟踪游标泄漏** ```sql SELECT sid, count(*) as open_cursors FROM v$open_cursor GROUP BY sid ORDER BY 2 DESC; ``` 2. **检查触发器状态** ```sql SELECT trigger_name, status FROM dba_triggers WHERE triggering_event LIKE '%LOGON%'; ``` 3. **客户端工具验证** 使用Oracle官方SQL*Plus测试连接: ```bash sqlplus username/password@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=remote_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl))) ``` #### 四、预防措施 1. 配置连接池参数(以Tomcat为例): ```xml <Resource maxActive="50" maxIdle="10" removeAbandonedTimeout="60" removeAbandoned="true" /> ``` 2. 定期监控指标: $$游标使用率 = \frac{\text{当前打开游标数}}{OPEN\_CURSORS} \times 100\%$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值