ITPub博客

首页 > Linux操作系统 > Linux操作系统 > db_name,instance_name,service_name

db_name,instance_name,service_name

原创 Linux操作系统 作者:ygsun5382 时间:2011-09-14 11:04:40 0 删除 编辑

这三个参数很容易混淆,今天来说一下他们的不同:

ORACLE_SID 是实例标识符,以环境变量形式存在,同时用于对应共享内存段。


db_name 是数据库标识符,存在于control file , datafile , redo log的header中

service_name 是LISTENER上的服务标识符,以初始化参数形式存在,用于listener 对应到相应实例(可以是本地实例,或者是远程listener)
instance_name 是LISTENER上的实例标识符,以初始化参数形式存在,用于listener 对应到相应实例来看一下db_name和instance_name的联系和区别。

    简而言之:instance_name对应instance,db_name对应数据库实体。一个实例在其生命周期中只能装载并打开一个数据库,一个数据库一般情况下同一时间只能被一个实例打开,但是RAC环境下可以被多个实例打开。db_name通常限制在8个字符之内;instance_name最多应该支持21个字符。通常我们都是设置db_name和instance_name一致。但是他们之间并不强制要求一致,你可以将instanc_name设定为任意的,只要db_name参数设定为数据库创建时指定的值即可。


在Oracle9i中,使用命令lsnrctl status可以看到如下例子:

Service "lrdb" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...


下面是数据库的自我注册过程(假设在数据库启动之前,监听器已经启动并在正常运行)。无论何时启动一个数据
库,默认地都有两条信息注册到监听器中:实例和服务。


注册到监听器中的实例值从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取init.ora
文件中的db_name的值。在只有单个实例运行的情况下,您可以不必设置该参数,但最好将其设置为db_name的值,
以充分利用动态注册功能。然后,如果在RAC中配置,您必须将集群中每个实例的instance_name参数设置为一个唯
一的值。


注册到监听器中的服务值从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接
init.ora文件中的db_name和db_domain的值来注册自己。如果选择提供service_names值,您可以使用完全限定
的名称(比如lrdb.oracle.com)或缩写的名称(比如lrdb)。如果选择缩写的名称并设置了db_domain参数,注
册到监听器中的服务将是service_name值和db_domain值的拼接。

例如下面的设置将导致服务lrdb.oracle.com被注册到监听器中:
db_domain=oracle.com
service_name=lrdb


可选择的,您可以在service_names参数中指定多个服务值,值之间用逗号格开;这对于共享服务器配置是很有用的。
如果需要执行连接时故障转移或负载均衡,或者想要在RAC中配置在实例之间透明地分布连接,那么使用service_names
参数将是必要的。为启用这些功能,您只需要将每个实例的数据库参数文件中的service_names设置为同一个值,
并在客户端连接请求的service_name设置中引用该值。


为初始化参数service_names和instance_name设置显式的值是个很好的实践,尽管如果您没有设置它们,Oracle也
会为动态注册而生成默认值(基于db_name和db_domain)。这样做的原因是,如果监听器在数据库启动之后重新启动,
其动态注册行为将会有一些微妙的区别.如果监听器在数据库运行之后重新启动,你们仅当您在init.ora文件中显式
地设置了service_names和instance_name的值时,每个数据库的PMON进程才会在很短的时间之后自动注册数据库。
如果没有显式设置service_names和instance_name的值,那么仅当数据库在监听器运行之后启动时,动态注册才会
发生;在这种情况下,如果监听器后来发生了重启,动态注册信息将会丢失。


总而言之,Oracle9i通过listener.ora中的GLOBAL_DBNAME向外提供静态服务,通过PMON读初始化参数service_names、
instance_name向外提供动态(真实在运行的)服务。举例如下:

listener.ora文件内容

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(PROGRAM = extproc)
)
(SID_DESC =
(
GLOBAL_DBNAME = lrdb)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(SID_NAME = lrdb)
)
(SID_DESC =
(
GLOBAL_DBNAME = gsid)
(ORACLE_HOME = /oracle/product/9.2.0.4)
(SID_NAME = lrdb)
)
)

该文件使得这个单实例的数据库lrdb,向外提供了两个服务:lrdb和gsid

初始化参数设置:instance_name=lrdb service_name=lrdb,gsid

所以动态注册时也会对外提供两个服务:lrdb和gsid

最后通过lsnrctl status看到的情况就是:

Service "gsid" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...

Service "lrdb" has 2 instance(s).
Instance "lrdb", status UNKNOWN, has 1 handler(s) for this service...
Instance "lrdb", status READY, has 1 handler(s) for this service...

对外提供的服务gsid和lrdb都有两个实例(一个静态注册一个动态注册),状态都分别是UNKNOWN和READY。

对于客户端来说,它不用关心数据库的名字、实例名到底是什么,它只需要知道数据库对外提供的服务名就行了,
这个名字可能和实例名一样,也可能不一样。


注:写作环境为Oracle 10g Release 2 (10.2)一、数据库名
1.数据库名的概念
数据库名(db_name)就是一个数据库的标识,就像人的身份证号一样。如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名。在数据库安装或创建完成之后,参数DB_NAME被写入参数文件之中。格式如下:
###########################################
# Database Identification
###########################################
db_domain=""
db_name=orcl
在创建数据库时就应考虑好数据库名,并且在创建完数据库之后,数据库名不宜修改,即使要修改也会很麻烦。因为,数据库名还被写入控制文件中,控制文件是以二进制型式存储的,用户无法修改控制文件的内容。假设用户修改了参数文件中的数据库名,即修改DB_NAME的值。但是在Oracle启动时,由于参数文件中的DB_NAME与控制文件中的数据库名不一致,导致数据库启动失败,将返回ORA-01103错误。

2.数据库名的作用
数据库名是在安装数据库、创建新的数据库、创建数据库控制文件、修改数据结构、备份与恢复数据库时都需要使用到的。
有很多Oracle安装文件目录是与数据库名相关的,如:
winnt: Fracleproduct10.2.0oradataDB_NAME...
Unix: /home/app/oracle/product/10.2.0/oradata/DB_NAME/...

又如参数文件pfile:
winnt: Fracleproduct10.2.0adminDB_NAMEpfileinit.ora.54200885729
Unix: /home/app/oracle/product/10.2.0/admin/DB_NAME/pfile/init$ORACLE_SID.ora

如果控制文件损坏或丢失,数据库将不能加载,这时要重新创建控制文件,方法是以nomount方式启动实例,然后以create controlfile命令创建控制文件,当然这个命令中也要指明DB_NAME。
3.修改数据库名
建议:应在创建数据库时就确定好数据库名,数据库名不应作修改,因为修改数据库名是一件比较复杂的事情。
现在就来说明一下,如何在已创建数据之后,修改数据库名。步骤如下: 
(1)关闭数据库。
(2)修改数据库参数文件中的DB_NAME参数的值为新的数据库名。
(3)以NOMOUNT方式启动实例,修建控制文件(有关创建控制文件的命令语法,请参考oracle文档)

4.查询当前数据库名
方法一: select name from v$database;
方法二:show parameter db
方法三:查看参数文件

二、数据库实例名
1.数据库实例名的概念

先来解释以下,实例是什么东西。实例是访问Oracle数据库所需的一部分计算机内存和辅助处理后台进程,是由进程和这些进程所使用的内存(SGA)所构成一个集合,它根 
本不需要一个与其相关联的数据库,没有任何数据文件也可以启动实例。下面是Oralce的启动过程:
sqlplus / as sysdba
sql>startup nomount #启动了一个实例,现在SGA分配了,进程在运行,除数据库所有的东西都启动了
sql>alter database mount #利用控制文件(init.ora文件中指定)定位重作文件、数据文件、临时文件
sql>alter database open #数据库可供任何人通过这个实例访问。
所以可以这么理解:大家访问Oracle都是访问一个实例,但这个实例如果关联了数据库文件,就是可以访问的,如果没有,就会得到实例不可用的错误。
实例名指的是用于响应某个数据库操作的数据库管理系统的名称。她同时也叫SID。实例名是由参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。

2.实例和数据库 

实例和数据库之间的区别如下:
(1)实例是临时的,它只在相关的进程和内存集合存在时存在;数据库是永久的,只要文件存在它就存在
(2)一个实例在其生存期内可安装和打开单个数据库;数据库可以被很多实例安装和打开,或者一个接一个的实例安装和打开,或者由多个实例同时安装和打开(RAC)
顺便提一下RAC,简单来说RAC就是多个实例同时打开一个数据库文件的系统,在结构上是多台机器,每天机器运行一个实例,每个实例都打开同一个数据库(这个是用磁盘共享技术实现的),这些实例之间需要同步高速缓存,这样保证多个实例是完全一致的,不会相互冲突乃至覆盖。

数据库实例名(instance_name)用于对外部连接。在操作系统中要取得与数据库的联系,必须使用数据库实例名。例如,要去连接一个数据库服务器,就必须知道其数据库实例名,只知道数据库名是没有用的。与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数据库名和实例名可以相同也可以不同。在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安全运行) 。

3.查询当前数据库实例名
方法一:select instance_name from v$instance;
方法二:show parameter instance
三、ORACLE_SID
在实际中,对于数据库实例的标识有时使用实例名,有时使用ORACLE_SID,它们有什么区别呢? 
(ORACLE_SID) 
OS<----------------> ORACLE 数据库 <--------(instance_name(实例名)) 
上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到;而ORACLE_SID参数则是操作系统环境变量,与ORACLE_BASE、ORACLE_HOME等用法相同,用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。且ORACLE_SID必须与instance_name的值一致,否则,你将会收到一个错误,在unix平台,是“ORACLE not available”,在winnt平台,是“TNS:协议适配器错误”。
四、数据库域名与全局数据库名
1.概念与联系 
使用数据库名(da_name)对一个数据库进行唯一标识,这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了db_domain参数,这样在数据库的标识是由db_name和db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将db_name和db_domain两个参数用‘.’连接起来,表示一个数据库,并将该数据库的名称称为global_name,即它扩展了db_name。db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。 
数据库域名(db_domain):定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。 
全局数据库名(global_name):对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法标识数据库。该值是在创建数据库时决定的,缺省值为db_name. db_domain。在以后对参数文件中db_name与db_domain参数的任何修改不影响global_name的值,如果要修改Global_name,只能用alter database rename global_name to 命令进行修改,然后修改相应参数。
2.查询数据库域名
方法一:select value from v$parameter where name = 'db_domain';
方法二:show parameter domain
方法三:在参数文件中查询
3.例子
全国交通GIS系统的分布式数据库,其中:
吉林节点: jl.jtgis
吉林长春节点: cc.jl.jtgis
河北节点: hb.jtgis
河北石家庄节点:sjz.hb.jtgis
这些就是数据库域名,数据库域名在存在于参数文件中,她的参数是db_domain.
全局数据库名=数据库名+数据库域名,如前述福建节点的全局数据库名是:orcl.jl.jtgis
五、数据库服务名

该参数是oracle8i新引进的。在8i以前,我们用SID来表示数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多网络服务名,设置繁琐。为了方便并行环境中的设置,引进了service_name参数。该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。
该参数的缺省值为db_name.db_domain,即等于global_name.如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同。一个数据库可以对应多个service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即service_name 不必与SID一样。
从Oracle8i开始的oracle网络组件,数据库与客户端连接的主机字符串使用的是数据库服务名。之前用的是SID,即数据库实例名。
查询数据库服务名
方法一:select value from v$parameter where name = 'service_name';
方法二:show parameter service_name
六、网络服务名
网络服务名(net_service_name),又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性。网络服务名被记录在tnsnames.ora文件中。
  网络服务名是从客户端的角度出发,当客户端连接远程数据库或其他服务时,可以指定网络服务名。因此需要使用一个或多个命名方法将此Net服务名解析为连接数据库或其他服务的连接描述符,看下面:
  [本地]——将存储在本地客户机的tnsnames.ora文件中的网络服务名解析为连接描述符。
  [Oracle Names]——由Oracle名字服务器提供为网络上的每个Oracle Net服务提供解析方法
  [主机名]——通过TCP/IP环境中的主机别名连接到Oracle数据库服务
  [Sun NIS]/[DCE CDS]——专用系统用的,在Windows 2000系统环境下不适用

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7838128/viewspace-707395/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-09-13

  • 博文量
    2
  • 访问量
    1935