Azure云Oracle数据库1521端口连接Oracle SQL Developer故障求助
问题概述
在Azure创建Oracle虚拟机(测试过Oracle 19c、Azure应用商店Oracle 12c版本),首日可通过家中固定IP的Oracle SQL Developer正常连接,次日连接失败,报错:
Status : Failure -Test failed: Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
(CONNECTION_ID=JlvBiUG7RNGM+9vvi3c3Sg==)
已配置Azure网络安全组(NSG)仅允许固定IP访问1521端口,封禁其他所有端口;VM与Oracle服务均设置为24小时持续运行,数据库SID未修改,怀疑/etc/init.d/dbora自启脚本配置存在问题。
排查步骤
验证Oracle监听器状态
登录Azure Oracle VM,执行以下命令检查监听器运行状态及服务注册情况:lsnrctl status如果监听器未运行,执行
lsnrctl start启动;如果输出中未显示目标数据库服务,说明服务未注册,需检查数据库实例状态。检查数据库实例状态
以sysdba身份登录数据库:sqlplus / as sysdba执行查询确认实例状态:
select status from v$instance;若实例状态不为
OPEN,执行startup启动实例,之后手动注册服务:alter system register;检查
dbora自启脚本配置
查看/etc/init.d/dbora脚本内容,确认包含监听器和数据库实例的启动逻辑,示例正确逻辑:case "$1" in start) echo "Starting Oracle Database..." su - oracle -c "lsnrctl start" su - oracle -c "sqlplus / as sysdba <<EOF startup exit EOF" ;; stop) echo "Stopping Oracle Database..." su - oracle -c "sqlplus / as sysdba <<EOF shutdown immediate exit EOF" su - oracle -c "lsnrctl stop" ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac确认脚本已设置开机自启:
- CentOS/RHEL系统:
chkconfig --list dbora,确保各运行级别均为启用状态,未启用则执行chkconfig dbora on - Ubuntu系统:执行
update-rc.d dbora defaults设置开机自启
- CentOS/RHEL系统:
验证网络规则有效性
检查Azure NSG的1521端口入站规则,确认固定IP未被移除或规则被禁用;同时检查VM操作系统防火墙(如firewalld、ufw),确保1521端口的允许规则为永久生效状态。核对TNS配置文件
查看$ORACLE_HOME/network/admin/listener.ora,确认监听器监听所有IP:LISTENER = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521)) )查看
$ORACLE_HOME/network/admin/tnsnames.ora,确保服务名与数据库实例名一致。
解决方案
修复
dbora自启脚本
补充脚本中缺失的监听器/实例启动逻辑,并设置开机自启,确保系统重启后Oracle服务自动恢复。配置监听器自动注册
执行以下SQL命令设置local_listener参数,让数据库启动后自动向监听器注册服务:alter system set local_listener='LISTENER' scope=both;(
LISTENER需与listener.ora中定义的监听器名一致)设置实例开机自启
编辑/etc/oratab文件,将目标数据库条目最后一位改为Y,示例:ORCL:/u01/app/oracle/product/19c/dbhome_1:Y这样
dbstart脚本可自动识别并启动该实例。
终端连接验证方法
端口连通性测试
在家中PC执行以下命令,验证1521端口是否可访问:telnet <VM公网IP> 1521若能建立连接,说明网络层无问题;若连接失败,重新检查NSG及防火墙规则。
SQLPlus终端连接
使用以下命令直接连接数据库:sqlplus username/password@<VM公网IP>:1521/<服务名或SID>示例:
sqlplus sys/yourpassword@20.xx.xx.xx:1521/ORCL as sysdba
内容的提问来源于stack exchange,提问作者Joanna

