问题描述
Oracle数据库执行导出命令时报错如下图,提示:ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务。

报错根本原因:监听程序里没有注册连接串里写的Oracle服务,UDE-12514只是导出工具包装的外层错误。
常见原因分析:
-
数据库实例没启动,没法动态注册服务到监听;
-
监听已经启动,但数据库实例还没自动注册,自动注册有短暂等待时间间隔;
-
数据库导出命令里的服务名写错。
排查步骤
在数据库服务器执行cmd打开命令提示符窗口,执行命令:
lsnrctl status
lsnrctl是Oracle的监听管理工具,这个命令可以查看监听有没有运行起来,监听的是什么端口,已经注册的服务有哪些。
执行结果如下:

从结果可以看到,监听里只有CLRExtProc这一个服务,没有Oracle数据库实例服务注册进来,这就是ORA-12514报错的原因,监听状态是正常的,但是数据库实例没有注册到监听程序。
在cmd窗口继续执行以下命令:
sqlplus / as sysdba
以操作系统认证的方式(不需要数据库账号密码),用SYSDBA权限登录数据库服务器本机Oracle实例,结果提示:ORA-12560:TNS;协议适配器错误,说明数据库实例服务没启动。

解决办法
Win+R 输入【services.msc】打开Windows服务列表,结果发现数据库实例服务没运行,直接启动即可。

再次执行命令:lsnrctl status,发现服务实例注册成功了,READY表示动态注册正常就绪,意即监听已经识别到ORCL数据库服务。

说明:
因为之前服务一直是启动状态,数据库备份每天在定时执行,所以这次报错并没有直接怀疑数据库实例是否还在运行的问题,经过排查才发现,数据库实例服务已经停止运行了。