错误表现:连接时报错TNS-12541: TNS:no listener(无监听器)或lsnrctl status显示“Listener is not running”。
解决方法:
lsnrctl start命令;lsnrctl status确认监听器进程是否正常运行;listener.ora配置文件(位于$ORACLE_HOME/network/admin)是否有语法错误(如主机名、端口号拼写错误)。错误表现:TNS-12541、TNS-12560或TNS-12162(网络服务名错误),常见于listener.ora或tnsnames.ora文件配置不当。
解决方法:
listener.ora:确认LISTENER段的HOST(监听器所在主机IP/DNS)、PORT(默认1521)设置正确,例如:LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
)
tnsnames.ora:确认连接描述符中的SERVICE_NAME或SID与数据库实例一致,例如:ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
lsnrctl reload(无需重启监听器)。错误表现:TNS-12541(无法访问监听器)、TNS-12537(连接关闭)或TNS-12154(无法解析连接标识符),多因网络不通或端口未开放。
解决方法:
ping <监听器IP>检查客户端与服务器之间的网络是否通畅;telnet <监听器IP> 1521或nc -zv <监听器IP> 1521测试监听器端口是否开放;sudo firewall-cmd --add-port=1521/tcp --permanent # 开放1521端口
sudo firewall-cmd --reload # 重新加载防火墙配置
sudo setenforce 0,若问题解决需调整SELinux策略。错误表现:ORA-12514: TNS:listener does not currently know of service requested(监听器不知道请求的服务)或ORA-01034: ORACLE not available(数据库不可用)。
解决方法:
sqlplus / as sysdba连接数据库,执行SELECT status FROM v$instance;,若状态为DOWN则启动实例:SQL> STARTUP;
LOCAL_LISTENER参数:SQL> SHOW PARAMETER LOCAL_LISTENER; -- 查看当前配置
SQL> ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=hostname)(PORT=1521))'; -- 若未设置则添加
lsnrctl stop && lsnrctl start让监听器重新获取实例信息。错误表现:lsnrctl: command not found(命令未找到)或TNS-12560(协议适配器错误),因ORACLE_HOME、PATH等环境变量未配置。
解决方法:
~/.bashrc或系统级/etc/profile),添加以下内容(替换为实际Oracle安装路径):export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1 # 示例路径
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl # 设置数据库实例名(可选)
source ~/.bashrc(用户级)或source /etc/profile(系统级)。错误表现:lsnrctl命令无法执行(如“Permission denied”)或无法访问listener.ora文件。
解决方法:
sudo chmod +x $(which lsnrctl);sudo -u oracle lsnrctl status运行命令(Oracle默认安装用户为oracle)。错误表现:监听器启动时报错“Address already in use”(地址已使用),因端口被其他进程占用。
解决方法:
sudo netstat -tulnp | grep 1521或sudo lsof -i :1521,获取进程ID(PID);sudo kill -9 <PID>(替换为实际PID);listener.ora文件,修改PORT值为未使用的端口(如1522),然后重启监听器。若上述步骤无法解决,可通过日志获取详细错误信息:
$ORACLE_HOME/network/log/listener.log,使用tail -f listener.log实时跟踪错误;$ORACLE_HOME/diag/rdbms/<db_name>/<instance_name>/trace/alert_<instance_name>.log,获取数据库级别的错误提示。