我试图使用 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 下)命令。
但是,在我的安装中,如果在 localhost 地址上设置 Oracle 服务将不起作用,我必须设置真实的主机 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 用户名/密码@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)
)
)
检查防火墙,以允许来自客户端的服务器连接。通过允许域网络或创建规则。
问题是因为连接建立或与客户端的通信未能在分配的时间间隔内完成。这可能是网络或系统延迟的结果。
故障排除步骤(文档 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 语句(例如 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 上等待 • 闩锁:行缓存对象 • 行缓存锁 其他类型的等待事件也是可能的;此列表可能不完整。
这里的问题是身份验证会话被阻止等待获取由数据库内的另一个会话持有的共享资源。该阻塞会话本身被长时间运行的活动(或它自己的挂起)占用,这会阻止它及时释放身份验证会话所需的共享资源。这导致超时最终被报告给身份验证会话。
在这种情况下,我们需要找出持有认证会话所需共享资源的阻塞进程,以便了解它发生了什么。
在这种情况下使用的典型诊断如下:
$ 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
可能导致身份验证挂起的问题示例
未发布的错误 7039896 变通方法参数 _enable_shared_pool_durations=false 参见注释 7039896.8
避免该问题的其他方法
在某些情况下,可以通过在实例启动后不久将此类语句固定在共享池中来避免身份验证 SQL 出现问题并且它们是新加载的。您可以使用以下文章对此提供建议:文档 726780.1 How to Pin a Cursor in Shared Pool using DBMS_SHARED_POOL.KEEP
固定将防止它们由于不活动和老化而被刷新,因此将防止它们在将来需要重新加载,即需要重新解析并容易受到身份验证挂起问题的影响。
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”用户时遇到了同样的错误,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.
如果您刚刚在虚拟机中的 Oracle Linux 8 上安装了 21c。(不适用于生产)
请按照以下步骤操作:
先停止监听
./lsnrctl stop
打开 listener.ora 文件并将 HOST 值替换为 IP 地址 #Location --> /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;
我尝试更改 tnsnames.ora 文件,将服务器的 IP 而不是 localhost 或环回地址,它没有工作。防火墙阻止了请求。请配置您的防火墙或将其关闭(不推荐),它会工作。