这么多名字中,有些是初始化参数,如DB_NAME,DB_QUNIQUE_NAME,DB_DOMAIN,GLOBAL_NAME
有些则只是一种叫法或者说是概念(并没有一个地方可以去设置它),如NET SERVICE NAME
有些则是某些表/视图中的字段名,如V$INSTANCE视图的INSTANCE_NAME
有些则是环境变量中的叫法,如ORACLE_SID
亦或是监听或客户端配置文件中设置的参数,如SID,SID_NAME,SERVICE_NAME,GLOBAL_DBNAME
$lsnrctl status
......
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm_SN" has 1 instance(s).## 表示对应的SERVICE_NAME为zlm_SN
Instance "zlm", status UNKNOWN, has 1 handler(s) for this service... ##表示对应的INSTANCE_NAME为zlm,也即SID和ORACLE_SID
The command completed successfully
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.91)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
Service "zlmXDB" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
Service "zlm_SN" has 1 instance(s).
Instance "zlm", status UNKNOWN, has 1 handler(s) for this service...
Service "zlm_XPT" has 1 instance(s).
Instance "zlm", status READY, has 1 handler(s) for this service...
The command completed successfully
网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。通常当我们用DBLINK连接数据库时,使用的就是这个名字,由USING关键字指定,USING 'connect_string'这里connect_string其实就是NET SERVICE NAME。
说到DBLINK还要提一点,就是当源数据库GLOBAL_NAME=TRUE时,link_name必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。同样地,当我们用sqlplus system/oracle@xxx来连接DB SERVER时,这个xxx就是NET SERVICE NAME,我的环境中是ZLM10G,如:
那么根据tnsnames.ora的配置,这里ZLM10G就是zlm_SN这个SERVICE_NAME所对应的NET SERVICE NAME
如果用sqlplus system/oracle@zlm是连不上DB SERVER的,只有用sqlplus system/oracle@zlm10g才行
[oracle@10dg1 ~]$ sqlplus system/oracle@zlm
SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:48:39 2014
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
ERROR:
ORA-12560: TNS:protocol adapter error
Enter user-name:
[oracle@10dg1 ~]$ sqlplus system/oracle@zlm10g
SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:48:50 2014
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL>
注意,用@NET SERVICE NAME方式登录,必须保证数据库是open的,否则即便是用对了名字,也会出现这种情况:
[oracle@10dg1 ~]$ sqlplus system/oracle@zlm10g
SQL*Plus: Release 10.2.0.5.0 - Production on Tue Jul 29 14:46:16 2014
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux-x86_64 Error: 2: No such file or directory
总结:现在,了解了那么多oracle中出现的各种NAME以后,我们发现,名称确实很多,概念也很容易混淆,如,SERVICE_NAME设置错误,就会造成服务无法正确注册到监听,客户端连接不到数据库服务器等等,为了方便不出错,建议能设置的成一样的名字,尽量都用同一个,如:SID,ORACLE_SID,SID_NAME,INSTANCE_NAME,SERVICE_NAME,NET SERVICE NAME,DB_NAME,GLOBAL_DBNAME这些名字,都可以设置成zlm,DB_DOMAIN能不用就尽量不设置,除非生产环境中有很多库,为了惟一标识,如果设置了,那么GLOBAL_NAME就不再是DB_NAME了,而是DB_NAME.DB_DOMAIN,而当使用DBLINK的时候,LINK的名字也必须使用DB_NAME.DB_DOMAIN了,会带来不小麻烦。