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

Oracle ORA-12170:TNS:发生连接超时,oracle,toad,ora-12170,Oracle,Toad,Ora 12170,我试图使用Oracle Toad连接到笔记本电脑中的数据库,但一直出现以下错误: ORA-12170:TNS:发生连接超时 我一直犯这个错误的可能原因是什么 我昨天访问了同一个数据库,并且能够访问它。[在评论中收集答案] 问题是Oracle服务在一个IP地址上运行,而主机配置了另一个IP地址 要查看Oracle服务的IP地址,请发出lsnrctl status命令并检查报告的地址(本例中为127.0.0.1,本地主机): 要查看主机IP地址,请发出ipconfig(在windows下)或ifco

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

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

我一直犯这个错误的可能原因是什么

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

[在评论中收集答案]

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

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

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

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

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

open sqlnet.ora  

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.INBOUND_CONNECT_TIMEOUT=360
SQLNET.RECV_TIMEOUT=10
SQLNET.SEND_TIMEOUT=10

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

这是因为SID冲突。例如,在Oracle12cBase\app\product\12.1.0\dbhome\u 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用户名/password@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)
    )
  )

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

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

首先,在windows命令提示符下键入命令
lsnrctlstatus
,获取主机名和端口号。在我的例子中,它是127.0.0.1,端口号是1521

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

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

sqlplus hr/hr@127.0.0.1:1521/ORCLPDB.

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

连接超时错误ORA-3135和ORA-3136 如果尝试连接到数据库的操作未在以下允许的时间段内完成其连接和身份验证阶段,则可能会发出连接超时错误: SQLNET.INBOUND\u CONNECT\u TIMEOUT和/或INBOUND\u CONNECT\u 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中的SQL语句)是:

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的顺序。不同版本之间也可能存在差异

  • 在身份验证过程中挂起
对于Oracle数据库中的所有SQL,都需要解析、执行和获取上述SQL语句。因此,在这些阶段遇到的任何出现挂起或严重性能低下的问题都可能导致超时

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

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

  • 身份验证挂起故障排除
在这种情况下,我们需要找出阻止进程持有身份验证会话所需的共享资源,以便查看它发生了什么

此类情况下使用的典型诊断方法如下:

  • 在一个或多个身份验证会话被阻止期间,在级别266处连续三次系统状态转储。阻塞会话可能会导致多个连接尝试超时。因此,即使生成systemstate转储所需的时间超过单个超时时间(例如60秒),systemstate转储也会很有用:
    • ASH报告,涵盖10-15分钟的时间段,在此期间出现了多个超时错误
    • 如果可能,在V$LATCHHOLDER视图上连续两次查询等待的共享资源是否为闩锁。 从v$latchholder中选择*; systemstate转储应有助于识别阻止程序会话。 第266级将向我们展示它正在执行的代码,这可能有助于找到任何现有的bug作为根本原因
    可能导致身份验证挂起的问题示例

    • 修补程序修复了未发布的错误6879763共享池模拟器错误 有关未发布的错误6966286,请参见注释563149.1
    • 未发布的错误7039896解决方法参数
      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'
      
            $ 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