加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle深入理解service_name

(2015-05-21 21:22:14)
标签:

oracle012514

listener

service_name

db_name

instance_name

分类: IT技术

oracle里的service_name出现在至少三个场合:

1、tnsnames

2、数据库参数service_names

3、监听器中service

 

其中tnsnames.ora中的service_name应该与监听器中的service_name一致,才能连接上,

否则,会出现ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务。

监听器中的service_name一般是PMon进程把数据库参数service_names注册过来的,每个service_name下会对应着相关的instance。

 

默认情况下:

db_unique_name=db_name。

global_name=db_name.domain

数据库参数中的service_names默认为db_unique_name.db_domain,

当domain为空时service_names=db_unique_name

 

一般情况下,db_name=instance_name=db_unique_name=service_name,

但是,在一些场合中,上面的等式是不成立的,不注意这一点,在配置oracle的时候往往会遇到ora-12514错误。

比如rac,或者在同一主机中配置dataguard,或者是自己手工修改成不一样的例子。

 

 

我的一个例子就是这种情况:

在同一主机上里物理备用数据库,

其中主库:

instance_name=orcl

db_name=crm

db_unique_name=crm

service_names=crm

对应的tnsnames.ora中service_name=crm

 

在备库上:

instance_name=crm_n

db_name=crm

db_unique_name=crm_n

service_names=crm_n

 对应的tnsnames.ora中service_name=crm_n

 

listener中显示了两个service

Service "crm" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "crm_n" has 1 instance(s).
  Instance "crm_n", status READY, has 1 handler(s) for this service...

 

====================

可以认为,如果没有在listener.ora中手动添加配置数据库服务的话客户端的service_name是必须要是数据库的service_names或其中之一.
如果在listener.ora中手动添加配置了数据库服务的话,客户端的service_name可以设置为服务器端监听器配置文件中的GLOBAL_DBNAME,也可以设置成数据库的service_names。

 

看oracle文档对GLOBAL_DBNAME 的描述
Purpose: 
Identifies the global database name of the database, a name comprised of the database name and database domain. You can obtain the GLOBAL_DBNAME value from the SERVICE_NAMES parameter in the initialization parameter file.

This parameter must be embedded under SID_DESC and should match the value of the SERVICE_NAMES parameter.

Example: 
sid_list_listener_name=
(sid_list= 
(sid_desc=
(global_dbname=oracle.com)
(sid_name=orcl)
(oracle_home=/usr/oracle)))

但实际上在配置的时候GLOBAL_DBNAME 可以为任意合法的字符,而客户端均可以通过该GLOBAL_DBNAME 连接到db server上.

 

一个具体的例子:

SQL> show parameter name
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string      jwz

db_name                              string      gbname
db_unique_name                       string      GBUNINAME
global_names                         boolean     FALSE
instance_name                        string      sidname
service_names                        string      GBUNINAME.jwz
 
SQL> select * from global_name;
 
GLOBAL_NAME
--------------------------------------------------------------------------------
GBNAME.JWZ

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有