这是一个小案例。
在windows上安装完了oracle 8.1.7.0之后,又装了个oracle11.2.0.1.0。2个版本的数据库分别装在不同的ORACLE_HOME下。登录的时候,分别手工输入ORACLE_HOME和ORACLE_SID,对于11g的数据库能顺利登录,但是对于817的那个数据库,sqlplus登录时报错:
1 2 3 |
E:\ora8i>sqlplus "/ as sysdba" SP2-1503: Message 1503 not found; product=SQLPlus; facility=SP2 SP2-0152: ORACLE may not be functioning properly |
这个报错其实不是817的问题,是11g的问题,因为在817的文档上找不到这个报错信息想error message,他其实是oracle11g的一个报错信息(见这里):
1 2 3 4 5 6 7 |
SP2-1503 Unable to initialize Oracle call interface Cause: Indicates a library used by SQL*Plus to communicate with the database failed to initialize correctly. Action: Check that the Oracle environment or registry entries are consistent and correct. If using the SQL*Plus Instant Client make sure the SQL*Plus and Oracle libraries are from the same release. Make sure you have read access to the libraries. SP2-0152 ORACLE may not be functioning properly Cause: Unable to initialize a session to the Oracle instance. Action: Make a note of the message and the number, then contact the Database Administrator. |
也是就11g的sqlplus去找lib库的时候出现了问题。但是我们在这里其实是用8i的sqlplus,为什么反而用到了11g的sqlplus呢?
这时我们就会想到环境变量path的问题。
我们去找path的设置:
1 |
E:\ora11g\app\Administrator\product\11.2.0\dbhome_1\bin;E:\ora8i\oracle\ora81\bin;E:\ora8i\oracle\ora81\Apache\Perl\5.00503\bin\mswin32-x86;C:\Program Files\Oracle\jre\1.1.7\bin;E:\oracle8i\oracle\ora81\bin;E:\oracle8i\oracle\ora81\Apache\Perl\5.00503\bin\mswin32-x86;D:\PROGRA~1\MKSTOO~1\bin;D:\PROGRA~1\MKSTOO~1\bin\X11;D:\PROGRA~1\MKSTOO~1\mksnt;C:\Program Files\Common Files\NetSarang;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Common Files\Lenovo;C:\Program Files\ThinkPad\ConnectUtilities;C:\Program Files\Lenovo\Client Security Solution;;d:\Program Files\NTP\bin;C:\WINDOWS\system32\WindowsPowerShell\v1.0;d:\Program Files\Bitvise Tunnelier;C:\Program Files\Intel\WiFi\bin\;D:\Program Files\Symantec\pcAnywhere\;d:\Program Files\OpenVPN\bin;C:\Program Files\Common Files\Teleca Shared;C:\Program Files\QuickTime\QTSystem\ |
我们看到此时oracle11g的path中的关于bin目录的路径是在oracle817之前的,也就是说,默认会去先用11g的bin目录下的sqlplus,再用817下的ORACLE_HOME和ORACLE_SID,所以就造成了上述的报错。
解决方法:
默认用8i,将8i的bin目录路径放在11g的前面。
对于11g的oracle,在使用时分别set:
1 2 3 |
set ORACLE_HOME=E:\ora11g\app\Administrator\product\11.2.0\dbhome_1 set PATH=%ORACLE_HOME%\bin;%PATH% set ORACLE_SID=ora11g |
另外,很有意思的一个事情是,如果我们用11g的ORACLE_HOME,ORACLE_SID,但是path还是8i的,那么用sqlplus的时候,就会用8i下的sqlplus.exe,但是调用的lib却是11g的,于是,就报这样的错了:
要是一开始报的是这个错,我们的troubleshooting就要困难的多,呵呵……