26

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

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

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

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

4

9 回答 9

18

[收集评论中的答案]

问题是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 下)命令。

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

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

于 2014-10-30T09:26:35.540 回答
4

这是因为 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)
    )
  )
于 2017-02-08T08:45:39.503 回答
1

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

于 2016-11-10T05:20:41.417 回答
1

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

于 2017-05-23T09:23:25.280 回答
1

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

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

从 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 的补丁修复,请参见注释 563149.1
  • 未发布的错误 7039896 变通方法参数 _enable_shared_pool_durations=false 参见注释 7039896.8

  • 避免该问题的其他方法

在某些情况下,可以通过在实例启动后不久将此类语句固定在共享池中来避免身份验证 SQL 出现问题并且它们是新加载的。您可以使用以下文章对此提供建议:文档 726780.1 How to Pin a Cursor in Shared Pool using DBMS_SHARED_POOL.KEEP

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

于 2018-02-16T21:07:48.480 回答
0
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

于 2015-05-21T18:05:24.990 回答
0

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

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

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

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

例如:

sqlplus hr/hr@127.0.0.1:1521/ORCLPDB.
于 2017-09-01T03:39:49.100 回答
0

如果您刚刚在虚拟机中的 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;
于 2021-11-13T14:40:03.747 回答
-1

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

于 2020-12-08T18:13:23.367 回答