ORA-12541: TNS无监听程序错误求助——cx_Oracle连接Oracle数据库失败
嘿,这个错误我碰到过好多次了,别着急,咱们一步步来排查解决:
1. 先确认Oracle监听器是否正在运行
这是最常见的触发原因——监听器没启动的话,数据库根本接收不到连接请求。
Windows系统:
按下Win+R输入services.msc打开「服务」面板,找到名称类似OracleOraDB[你的版本号]Home1TNSListener的服务,查看它的状态是否为「正在运行」。如果没启动,右键点击选择「启动」即可。Linux/macOS系统:
打开终端执行命令,先检查监听器状态:lsnrctl status如果提示监听器未运行,或者显示「The listener supports no services」,就执行启动命令:
lsnrctl start
2. 修正你的连接字符串
你当前用的localhost/test可能缺少了默认端口信息(Oracle监听器默认端口是1521),试试修改连接字符串,明确指定端口:
username = "labdb" password = "labdb" # 添加上默认端口1521 databaseName = "localhost:1521/test" connection = cx_Oracle.connect(username, password, databaseName)
或者用更清晰的DSN方式构建连接,可读性更强:
import cx_Oracle username = "labdb" password = "labdb" # 明确指定主机、端口和服务名 dsn = cx_Oracle.makedsn("localhost", 1521, service_name="test") connection = cx_Oracle.connect(username, password, dsn)
3. 排查防火墙是否拦截了数据库端口
如果你的本地防火墙(Windows Defender防火墙、Linux iptables等)处于开启状态,可能会阻止1521端口的通信。需要在防火墙规则里添加允许Oracle监听器端口(默认1521)的入站和出站规则。
4. 确认Oracle数据库实例是否已启动
有时候监听器运行正常,但数据库实例本身没启动,也会报这个错误。你可以用SQL*Plus登录检查:
sqlplus / as sysdba
登录成功后执行启动命令:
startup
如果实例本来就处于运行状态,会提示「ORA-01081: cannot start already-running ORACLE - shut it down first」,说明实例没问题。
按上面的步骤排查下来,基本就能解决这个问题啦!
内容的提问来源于stack exchange,提问作者Gianmarco

