我试图使用Oracle Toad连接到笔记本电脑中的数据库,但一直出现以下错误:
ORA-12170:TNS:发生连接超时
我一直犯这个错误的可能原因是什么?
我昨天访问了同一个数据库,并能够访问它。
[在评论中收集答案]
问题是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地址,而是使用静态地址。
这是因为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用户名/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)
)
)
检查FIREWALL,以允许从客户端在服务器上进行连接。通过允许域网络或创建规则。
由于连接建立或与客户端的通信未能在分配的时间间隔内完成而出现问题。这可能是网络或系统延迟的结果。
故障排除步骤(文档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中的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的顺序。不同版本之间也可能存在差异。
- 身份验证期间挂起
上面的SQL语句需要像Oracle数据库中的所有SQL一样进行解析、执行和获取。因此,在这些阶段遇到的任何问题(表现为挂起或性能严重缓慢(都可能导致超时。
此类挂起的症状将由等待的身份验证会话看到:•光标:引脚S等待X•闩锁:行缓存对象•行缓存锁定其他类型的等待事件也是可能的;此列表可能不完整。
这里的问题是,身份验证会话被阻止,等待获取数据库中另一个会话持有的共享资源。该阻塞程序会话本身被长期运行的活动(或其自身的挂起(占用,这阻止了它及时释放身份验证会话所需的共享资源。这导致超时最终被报告给身份验证会话。
- 身份验证挂起故障排除
在这种情况下,我们需要找出持有认证会话所需共享资源的阻塞进程,以了解它发生了什么
在这种情况下使用的典型诊断如下:
- 在一个或多个认证会话被阻止期间,级别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$LATCHOLDER视图上连续两次查询等待的共享资源是锁存器的情况。从v$latchholder中选择*;系统状态转储应有助于识别阻止程序会话。266级将向我们展示它正在执行的代码,这可能有助于定位任何现有的错误作为根本原因
可能导致身份验证挂起的问题示例
- 未发布的Bug 6879763共享池模拟器Bug已通过补丁修复有关未发布的Bug 6966286,请参见注释563149.1
未发布Bug 7039896解决方法参数_enable_shared_pool_durations=false,请参见注释7039896.8
避免问题的其他方法
在某些情况下,通过在实例启动后不久将此类语句固定在共享池中并重新加载,可以避免身份验证SQL出现问题。您可以使用以下技巧对此提出建议:文档726780.1如何使用DBMS_Shared_Pool.KEEP 在共享池中固定光标
固定将防止它们因不活动和老化而被清除,因此将防止它们在未来需要重新加载,即需要进行修复并容易受到身份验证挂起问题的影响。
如果您刚刚在虚拟机中的Oracle Linux 8上安装了21c。(不用于生产(
遵循以下步骤:
-
首先停止侦听器
./lsnrctl stop
-
打开listener.ora文件并将HOST值替换为IP地址#位置-->opt/oracle/homes/OraDBHome21cEE/network/admin/listener.ora
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.223.130)(PORT =1521))
-
重新启动侦听器
./lsnrctl start
-
现在切换到root用户并逐个运行以下命令以禁用防火墙
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo systemctl status firewalld
-
最小化虚拟机,并使用Toad或任何其他数据库浏览器工具从主机(或任何其他机器(连接。
如果仍然无法工作,则可以停止数据库并重新启动
./sqlplus / as sysdba
shutdown immediate;
startup;
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
我在连接ORCLPDB的"hr"用户时遇到了同样的错误,ORCLPDDB是一个可插拔数据库。
首先,通过在windows命令提示符下键入命令lsnrctl status
来获取主机名和端口号。在我的情况下,它是127.0.0.1,端口号为1521
第二,输入以下命令并输入您的主机名和端口号:
sqlplus username/password@HostName:Port Number/PluggableDatabaseName.
例如:
sqlplus hr/hr@127.0.0.1:1521/ORCLPDB.
我尝试更改tnsnames.ora文件,将服务器的IP而不是localhost或环回地址,但没有成功。防火墙正在阻止这些请求。请配置防火墙或将其关闭(不推荐(,它会起作用。