一、问题描述
1、ORACLE服务全部打开,没有报错;
2、plsql登陆报ora-12505错;
3、监听lsnrctl status异常;
二、分析过程
1、根据之前lsnrctl status异常情况,了解到未监听到用户数据库服务实例;
2、尝试sqlplus / as sysdba登陆,可正常登陆;
3、尝试登陆状态startup,报如下错误:
4、发现在tnsname.ora里竟然存在语法错误,找不到关于LISTENER_ORCL的定义。
三、解决问题
1、找到数据库安装目录下的tnsname.ora文件,找到里面的用户数据库实例配置,发现这里我自定义的数据库描述名称为"ORCL",与刚刚错误反馈中提示的“LISTENER_ORCL”不一致。
2、打开修改Oracle安装目录下的 D:\app\XXX\admin\orcl\pfile 下的 init.ora.10142019123123 文件,找到local_listener的配置项果然是LISTENER_ORCL,这样的话系统在加载init.ora文件后根据配置项是找不到local_listener的address_list值的。
这里将LISTENER_ORCL修改成刚刚在tnsname.ora中查到的数据库描述名称ORCL。
3、修改完后,不需要重启数据库服务,直接在cmd里通过sqlplus / as sysdba登陆,
输入startup pfile=‘E:\app\XXX\admin\orcl\pfile\init.ora.1072015144527’,回车,搞定。(文件路径要是自己的路径)
4、或者网友们还有另外一种更稳定的方法,防止后续手贱又改错了报错。即修改Oracle安装目录下的 D:\app\XXX\admin\orcl\pfile 下的 init.ora.10142019123123 文件,找到 如下部分:将“LISTENER_ORCL”替换为listener.ora中监听器配置里的“(ADDRESS = (PROTOCOL = TCP)(HOST = YQ-PC)(PORT = 1521))”字段,具体就不上图示了,注意需要双引号。
注:以上方法有可能电脑重启后还是有问题,还可尝试登陆sqlplus后,执行以下命令:
create spfile from pfile = ‘E:\app\XXX\admin\orcl\pfile\init.ora.1072015144527’;
将我们刚刚更改的初始化文件映射到spfile文件中。
PS:这里可以看到之前startup报错提示找不到的LISTENER_ORCL是在这里设置的,只要保持与tnsname.ora中用户数据库实例描述名称和init.ora里的local_listener配置的值保持一致即可,(当然PLSQL和客户端中的tnsname.ora可以随便设置服务描述名,只要service_name和服务端的保持一致就行)。
PS2:后来我在测试过程中发现如果我把tnsname.ora中用户数据库实例描述名称和init.ora里的local_listener配置的值都设置成LISTENER_ORCL后,虽然两者的值一致了,但是死活还是报找不到LISTENER_ORCL的错误,难道这个名称不能用?求大牛网友解惑。