【问题标题】:ORA-12170: TNS:Connect timeout occurredORA-12170: TNS: 发生连接超时
【发布时间】:2014-07-21 03:10:14
【问题描述】:

我尝试使用 Oracle Toad 连接到笔记本电脑中的数据库,但一直出现此错误:

ORA-12170: TNS: 发生连接超时

我一直出现此错误的可能原因是什么?

我昨天访问了同一个数据库并且能够访问它。

【问题讨论】:

  • 您的笔记本电脑是否已通过 DHCP 获得了新的 IP 地址?监听器/连接目前使用的 IP 是什么?
  • @AlexPoole 嗨,是不是因为昨天我连接的 WIFI 连接与我现在使用的 WIFI 连接不同?
  • 可能他们通常使用DHCP;您的数据库连接是到本地主机(127.0.0.1)还是真实 IP?如果它是真实的,您需要将其更改为您当前的 IP,而不是您昨天拥有的 IP。不过,您还需要检查您的听众正在使用的地址。它可能具有相同的真实(旧)IP,或者可能正在使用您的 PC 名称,这可能是有效的。运行lsnrctl status 看看它现在在做什么。
  • @AlexPoole 我连接到一个真实的 IP(192.168.1.6) 并且在 lsnrctl status 命令中我有这些:(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)( PORT=1521))) 是否意味着我需要更改 listener.ora 中的监听器?
  • 连接中的地址需要和监听地址匹配;所以是的,将连接更改为 127.0.0.1。

标签: oracle toad ora-12170


【解决方案1】:

[在 cmets 中收集答案]

问题是Oracle服务在一个IP地址上运行,而主机配置了另一个IP地址。

要查看 Oracle 服务的 IP 地址,请发出 lsnrctl status 命令并检查报告的地址(在本例中为 127.0.0.1,即 localhost):

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))

要查看主机 IP 地址,请发出 ipconfig(在 windows 下)或 ifconfig(在 linux 下)命令。

但是,在我的安装中,Oracle服务不起作用如果设置在localhost地址,我必须设置真实的主机IP地址(例如192.168.10.X)。

为避免以后出现此问题,请不要使用 DHCP 分配主机的 IP 地址,而是使用静态的。

【讨论】:

  • " lsnrctl status " 对我来说很棒。我找到了其他主机。然后,将该主机路由到 127.0.0.1,问题解决。谢谢!
【解决方案2】:

这是因为 SID 冲突。例如,在您的 Oracle12cBase\app\product\12.1.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora 文件中,ORCL 的连接描述如下:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

并且,您正在尝试使用使用相同 SID 但不同 IP、用户名/密码的连接字符串进行连接,如下所示:

sqlplus 用户名/密码@192.168.130.52:1521/orcl

要解决此问题,请在 tnsnames.ora 文件中进行更改:

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.130.52)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

【讨论】:

    【解决方案3】:

    检查防火墙,以允许来自客户端的服务器连接。 通过允许域网络或创建规则。

    【讨论】:

    • oracle 安装程序似乎没有添加防火墙规则(或警告您需要手动添加),厌倦了 oracle,它只是一个接一个的错误......
    【解决方案4】:

    问题是因为连接建立或与客户端的通信未能在分配的时间间隔内完成。这可能是网络或系统延迟的结果。

    【讨论】:

      【解决方案5】:

      故障排除步骤(文档 ID 730066.1)

      连接超时错误 ORA-3135 和 ORA-3136 当尝试连接到数据库时未在以下允许的时间段内完成其连接和身份验证阶段时,可能会发出连接超时错误: SQLNET.INBOUND_CONNECT_TIMEOUT 和/或 INBOUND_CONNECT_TIMEOUT_ 服务器端参数。

      从 Oracle 10.2 开始,这些参数的默认值为 60 秒,而在以前的版本中为 0,表示没有超时。

      在超时时,客户端程序将收到 ORA-3135(或可能是 TNS-3135)错误:

      ORA-3135 连接丢失

      并且数据库将在其 alert.log 中记录 ORA-3136 错误:

      ... 2008 年 5 月 10 日星期六 02:21:38 警告:入站连接超时 (ORA-3136) ...

      • 身份验证 SQL

      当数据库会话处于身份验证阶段时,它将发出一系列 SQL 语句。直到所有这些都被完全解析、执行、获取后,身份验证才完成。此列表中的一些 SQL 语句,例如在 10.2 上是:

      select value$ from props$ where name = 'GLOBAL_DB_NAME'
      
      select privilege#,level from sysauth$ connect by grantee#=prior privilege# 
      and privilege#>0 start with grantee#=:1 and privilege#>0
      
      select SYS_CONTEXT('USERENV', 'SERVER_HOST'), SYS_CONTEXT('USERENV', 'DB_UNIQUE_NAME'),
      SYS_CONTEXT('USERENV', 'INSTANCE_NAME'), SYS_CONTEXT('USERENV', 'SERVICE_NAME'), 
      INSTANCE_NUMBER, STARTUP_TIME, SYS_CONTEXT('USERENV', 'DB_DOMAIN') 
      from v$instance where INSTANCE_NAME=SYS_CONTEXT('USERENV', 'INSTANCE_NAME')
      
      select privilege# from sysauth$ where (grantee#=:1 or grantee#=1) and privilege#>0
      
      ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN' NLS_TERRITORY= 'AMERICA' NLS_CURRENCY= '$'
      NLS_ISO_CURRENCY= 'AMERICA' NLS_NUMERIC_CHARACTERS= '.,' NLS_CALENDAR= 'GREGORIAN'
      NLS_DATE_FORMAT= 'DD-MON-RR' NLS_DATE_LANGUAGE= 'AMERICAN' NLS_SORT= 'BINARY' TIME_ZONE= '+02:00'
      NLS_COMP= 'BINARY' NLS_DUAL_CURRENCY= '$' NLS_TIME_FORMAT= 'HH.MI.SSXFF AM' NLS_TIMESTAMP_FORMAT=
      'DD-MON-RR HH.MI.SSXFF AM' NLS_TIME_TZ_FORMAT= 'HH.MI.SSXFF AM TZR' NLS_TIMESTAMP_TZ_FORMAT=
      'DD-MON-RR HH.MI.SSXFF AM TZR'
      

      注意:以上 SQL 列表不完整,不代表认证 SQL 的排序。版本之间也可能存在差异。

      • 身份验证期间挂起

      上述 SQL 语句需要像 Oracle 数据库中的所有 SQL 一样进行解析、执行和提取。因此,在这些阶段遇到的任何表现为挂起或性能严重下降的问题都可能导致超时。

      身份验证会话将在等待时看到此类挂起的症状: • 光标:引脚 S 在 X 上等待 • 闩锁:行缓存对象 • 行高速缓存锁 其他类型的等待事件是可能的;此列表可能不完整。

      这里的问题是身份验证会话被阻止等待获取数据库中另一个会话持有的共享资源。该阻塞会话本身被长时间运行的活动(或它自己的挂起)占用,这会阻止它及时释放身份验证会话所需的共享资源。这会导致超时最终报告给身份验证会话。

      • 身份验证挂起疑难解答

      在这种情况下,我们需要找出持有身份验证会话所需共享资源的阻塞进程,以了解它发生了什么。

      在这种情况下使用的典型诊断如下:

      1. 在一个或多个身份验证会话被阻止期间,三个连续的系统状态转储级别为 266。阻塞会话可能会导致多次连接尝试超时。因此,即使生成它们所需的时间超过了单个超时的时间,系统状态转储也会很有用,例如60 秒:
            $ sqlplus -prelim '/ as sysdba' 
      
             oradebug setmypid 
             oradebug unlimit 
             oradebug dump systemstate 266 
             ...wait 90 seconds 
             oradebug dump systemstate 266 
             ...wait 90 seconds 
             oradebug dump systemstate 266 
             quit
      
      • ASH 报告涵盖例如10-15 分钟的时间段内出现多个超时错误。
      • 如果可能,对 V$LATCHHOLDER 视图进行两次连续查询,以了解正在等待的共享资源是锁存器的情况。 从 v$latchholder 中选择 *; 系统状态转储应该有助于识别阻塞会话。 级别 266 将向我们展示它正在执行的代码,这可能有助于将任何现有的错误定位为根本原因。

      可能导致身份验证挂起的问题示例

      • 未发布的错误 6879763 共享池模拟器错误已由补丁修复 对于未发布的错误 6966286,请参阅 Note 563149.1
      • 未发布的错误 7039896 解决方法参数 _enable_shared_pool_durations=false 见注释 7039896.8

      • 避免该问题的其他方法

      在某些情况下,可以通过在实例启动后不久将此类语句固定在共享池中来避免身份验证 SQL 的问题,并且这些语句是新加载的。您可以使用以下文章对此提供建议: 文档 726780.1 如何使用 DBMS_SHARED_POOL.KEEP 将光标固定在共享池中

      固定将防止它们由于不活动和老化而被刷新,因此将防止它们在未来需要重新加载,即需要重新解析并容易受到身份验证挂起问题的影响。

      【讨论】:

        【解决方案6】:
        open sqlnet.ora  
        
        NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
        SQLNET.INBOUND_CONNECT_TIMEOUT=360
        SQLNET.RECV_TIMEOUT=10
        SQLNET.SEND_TIMEOUT=10
        

        http://docs.oracle.com/cd/B19306_01/network.102/b14213/sqlnet.htm

        【讨论】:

        • 请通过添加一些上下文和解释来改进您的答案。不要只是粘贴一些代码。
        • 虽然这真的很有用!这会延长客户端的超时时间。
        【解决方案7】:

        我在连接 ORCLPDB 的“hr”用户时遇到了同样的错误,ORCLPDB 是一个可插拔数据库。

        首先,通过在 Windows 命令提示符下键入命令 lsnrctl status 来获取主机名和端口号。就我而言,它是 127.0.0.1,端口号为 1521

        其次,使用您的主机名和端口号输入以下命令:

        sqlplus username/password@HostName:Port Number/PluggableDatabaseName.
        

        例如:

        sqlplus hr/hr@127.0.0.1:1521/ORCLPDB.
        

        【讨论】:

          【解决方案8】:

          如果您刚刚在虚拟机中的 Oracle Linux 8 上安装了 21c。(不适用于生产)

          按照下面给出的步骤:

          1. 先停止监听器

             ./lsnrctl stop
            
          2. 打开 listener.ora 文件并将 HOST 值替换为 IP 地址 #Location --> /opt/oracle/homes/OraDBHome21cEE/network/admin/listener.ora

             (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.223.130)(PORT =1521))
            
          3. 重启监听器

             ./lsnrctl start
            
          4. 现在切换到root用户,依次运行以下命令来关闭防火墙

            sudo systemctl stop firewalld
            
            sudo systemctl disable firewalld
            
            sudo systemctl status firewalld
            
          5. 最小化虚拟机并使用 Toad 或任何其他数据库浏览器工具从您的主机(或任何其他机器)连接。

          如果还是不行,可以停止数据库并重新启动

          ./sqlplus / as sysdba
          
          shutdown immediate;
          
          startup;
          

          【讨论】:

            【解决方案9】:

            我尝试更改 tnsnames.ora 文件,将服务器的 IP 而不是本地主机或环回地址,它没有工作。防火墙阻止了请求。请配置您的防火墙或将其关闭(不推荐),它会起作用。

            【讨论】:

              猜你喜欢
              • 2016-12-04
              • 1970-01-01
              • 2019-01-21
              • 2015-11-03
              • 2016-07-29
              • 2012-02-03
              • 2019-11-13
              • 2015-05-23
              • 2020-10-10
              相关资源
              最近更新 更多