使用cx_Oracle连接Oracle数据库遇ORA-12170:TNS连接超时求助
解决cx_Oracle连接Oracle时的ORA-12170超时错误
遇到ORA-12170: TNS:Connect timeout occurred这个错误,大概率是网络连通性或者配置参数出了问题,咱们一步步来排查:
先确认网络能通
先试试用ping *ip*测试你的机器能不能ping通Oracle服务器,如果ping不通,那就是基础网络问题,得先解决这个(比如检查路由、防火墙)。再用telnet *ip* *port*测试端口是否开放,如果telnet连不上,说明服务器的防火墙没开对应端口,或者Oracle监听没在这个端口上运行,找运维帮忙调整防火墙规则或者确认监听端口。核对TNS配置的每个参数
你写的DSN里的每个参数都得仔细核对:HOST:是不是Oracle服务器的正确IP?别写错了或者用了内网IP但你的机器不在同一个网段PORT:默认是1521,是不是和服务器上Oracle监听的端口一致?可以在服务器上执行lsnrctl status看监听的端口SERVICE_NAME:这个得和服务器上的数据库服务名完全匹配,同样用lsnrctl status能看到监听的服务名,别把SID和SERVICE_NAME搞混了
检查服务器上的Oracle监听状态
如果服务器上的监听没启动,肯定连不上。让服务器管理员执行lsnrctl start启动监听,或者lsnrctl status确认监听是正常运行的状态。试试更简单的EZCONNECT格式连接
有时候TNS描述符容易写错,换用EZCONNECT格式试试,代码更简洁,也能避免语法错误:import cx_Oracle # 格式:用户名/密码@IP:端口/服务名 db = cx_Oracle.connect('*username*/*password*@*ip*:*port*/*service_name*', encoding="UTF-8")确认Oracle客户端配置正确
如果你的机器上装的是Oracle Instant Client,得确保环境变量配置对了:- Windows:把Instant Client的路径加到
PATH环境变量里 - Linux:把Instant Client的路径加到
LD_LIBRARY_PATH里,或者在代码里指定:cx_Oracle.init_oracle_client(lib_dir="/path/to/instantclient")
- Windows:把Instant Client的路径加到
附上你提供的原代码方便参考:
import cx_Oracle dsn_tns = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=*ip*)(PORT=*port*))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=*service_name*)))' db= cx_Oracle.connect('*username*', '*password*', dsn_tns, encoding="UTF-8")
内容的提问来源于stack exchange,提问作者Kerry Driscoll
相关产品推荐
相关产品推荐

