今天做练习的时候,发现一个问题,可能是很小的细节问题,但确实稍微折腾了一下,记录于此,方便以后查阅。
问题现象:
1. 配置listener.ora静态监听。
2. 使用静态监听创建EM。
3. 使用sqlplus system/oracle@XXX或EZCONNECT方式,也提示错误:
4. 使用sqlplus / as sysdba可以正常登录。
问题排查:
1. 看报错,ORA-01034错误,给出了几种可能:
(1) SGA不足。
> 我是跑着虚拟机,sqlplus / as sysdba可以登录,尝试将参数文件的memory_target改小一些,仍报错。
(2) 指向实例的操作系统变量设置不正确。
> 看看上面的listener.ora、tnsnames.ora,都没有什么明显的异常啊?奇了怪了。。。
3. 网上搜索,一般还是说ORACLE_HOME或ORACLE_SID设置不正确。
4. 参考官方文档,发现有一些非常细节的不同,
如上所示,ORACLE_HOME的路径中结尾没有“/”,而我的版本是有这个符号,
难道真是这问题?将“/”删除后再试,sqlplus system/oracle@xxx或EZCONNECT均可登录,EM可以使用静态监听继续创建。问题就在于此,ORACLE_HOME多了一个“/”。
总结:
1. 这个问题的根源就是ORACLE_HOME的路径结尾多了一个“/”,想必Oracle的解析程序在得到ORACLE_HOME的value值后,是做了直接匹配,并没有对结尾的“/”进行转换,他要找"dbhome_1/"这个文件夹,自然错了。按常理讲,结尾的“/”不会是目录名称,因此这块其实容错性可以做得更好些。而且listener.ora的官方文档中除了示例中体现了这点,并没有其他介绍(至少我未找到),想必他认为这是一个常识。
2. 其实从报错上,就可以为问题排查指明方向,ORA-01034错误给出了两个可能的原因,要么内存SGA不足,要么环境变量有问题,只是自己开始没有注意这个细节。
3. sqlplus / as sysdba可以登录,sqlplus system/oracle@xxx不能登录, 这其实和内存无关,这两者只是登录的不同认证方式,不存在和内存使用有关的问题。
4. 一个小小的“/”,虽然是细节问题,但出现问题时的错误提示,依然可以为我们指明一些方向,足以进一步体会到Oracle的精湛。还未入道,还需努力。