在Linux下,我很少用GUI,能不用就尽量不用。在Windows下,使用纯字符界面有时候简直成了奢侈。我相信,菜单永远比命令更易令人懒惰。
今天在装standby的时候,顺手将production上的listener.ora,sqlnet.ora,tnsnames.ora拷贝过来,登录时难得遇见了ORA-12514错误。
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Sep 9 18:53:39 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12560: TNS:protocol adapter error
Enter user-name:
C:\>sqlplus sys/install@stdby as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Sep 9 18:53:49 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
tnsping一下,正常。再检查tnsname.ora,SERVICE_NAME、协议和主机名都没错。再检查listener.ora,发现SID_LIST_LISTENER这一段似乎是默认安装时的配置,没有SID_NAME:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = c:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) ) )
于是手工将其修改成:
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = STDBY) (ORACLE_HOME = c:\oracle\product\10.2.0\db_1) (SID_NAME = STDBY) ) )
再重新用sqlplus登录,OK!
接着在production机器上重新检查listener状态,没发现问题。
回过头来检查standby的机子,从oradim安装实例开始一路回忆,感觉用OUI安装数据库的时候可能修改过某些环境变量。于是检查注册表,果然发现production上的注册表中有ORACLE_SID这么一条,而standby上没有。
将listener.ora重新替换为production上的。
C:\>set oracle_sid=stdby
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Sat Sep 9 19:04:54 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
在Windows中,用户(系统)环境变量和注册表中的变量设置是等效的。
本来应该早就联想到ORACLE_SID上面的,只是出现ORA-12514错误后给转移了注意力,而以前也很少手工建数据库,用OUI建数据库的话又给自动设好了,对注册表关注也太少,所以就给忽略了。
看来,适当减少图形界面的帮助对知识的理解确实是很有帮助的。