在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建数据库的话又给自动设好了,对注册表关注也太少,所以就给忽略了。

看来,适当减少图形界面的帮助对知识的理解确实是很有帮助的。