使用Python连接Oracle数据库出现ORA-12170报错如何解决?
ORA-12170: TNS: Connect timeout occurred 排查解决指南
ORA-12170错误本质是Oracle客户端在超时时间内无法和服务端建立TCP连接,结合你的操作场景,按以下步骤排查即可:
1 确认基础连接信息与网络连通性
- 先明确你要连接的Oracle实例部署位置:如果Oracle就安装在当前操作的远程台式机上,优先用
127.0.0.1/localhost作为数据库地址测试,避免公网链路干扰 - 如果是连接外部服务器上的Oracle,先在远程台式机的命令行执行
ping <数据库IP>确认链路可达,再执行以下命令测试1521默认端口是否开放:
端口访问失败的话,先排查目标Oracle服务器的防火墙、安全组是否开放了1521端口的访问权限,同时确认Oracle监听器处于运行状态。telnet <数据库IP> 1521 # 或用nc命令 nc -zv <数据库IP> 1521
2 验证Oracle本地连通性(Oracle部署在远程台式机上适用)
- 在远程台式机命令行执行
lsnrctl status查看监听器运行状态,正常输出会展示监听的地址、端口、已注册的数据库服务名/SID - 如果监听器未启动,执行
lsnrctl start启动后再测试 - 用sqlplus先验证账号密码、服务名是否正确,测试命令为:
sqlplus连接失败的话先解决数据库本身的配置、权限问题,再排查Python代码逻辑。sqlplus <用户名>/<密码>@//localhost:1521/<服务名>
3 调整cx_Oracle连接参数
确认基础连通性正常后,可替换以下两种标准dsn写法测试,避免参数格式错误:
写法1:字符串格式dsn
dsn = "127.0.0.1:1521/你的服务名" connection = cx_Oracle.connect(user="你的用户名", password="你的密码", dsn=dsn, encoding="utf-8")
写法2:makedsn生成dsn
dsn = cx_Oracle.makedsn(host="127.0.0.1", port=1521, service_name="你的服务名") connection = cx_Oracle.connect(user="你的用户名", password="你的密码", dsn=dsn, encoding="utf-8")
如果网络存在波动,可新增timeout参数延长超时阈值(单位为秒):
connection = cx_Oracle.connect(user, pw, dsn, encoding='utf8', timeout=15)
4 特殊场景排查
结合你用平板远程操作台式机的场景,以上步骤都验证后仍报错可检查:
- 远程台式机的本地防火墙是否限制了Python进程访问1521端口
- 如果是跨公网连接Oracle,部分运营商会封禁1521等常见数据库端口的公网访问,可通过VPN隧道、端口映射更换对外端口的方式规避
- 确认你填写的数据库地址没有配置错误,不要误写为平板的网络IP。
内容的提问来源于stack exchange,提问作者nefi
相关产品推荐
相关产品推荐

