您的位置:首页 > 数据库 > Oracle

Oracle 中 db_name / service_name / sid 三者的关系和作用

2010-08-23 12:01 330 查看
db_name
是一个实在的物理名称。service_name
时带有域名的,因为如果两个数据库不再同一个域可以有相同的名称。而sid
是数据库的实例名称,它是有SGA
和后台进程组成。一个数据库只有一个db_name
但是可以有两个实例。每个实例各有自己的SGA
和后台进程。

Db_name
:对一个数据库(Oracle database
)的唯一标识。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造
成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了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 <db_name.db_domain>
命令进行修改,然后修改相应参数。

Service_name
:该参数是oracle8i
新引进的。在8i
以前,我们用SID
来表示标识数据库的一个实例,但是在Oracle
的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name
参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain
,即等于Global_name
。一个数据库可以对应多个Service_name
,以便实现更灵活的配置。该参数与SID
没有直接关系,即不必Service name
必须与SID
一样。

Instance_name
: 数据库实例名。用于和操作系统之间的联系,用于对外部连接时使用。在操作系统中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库 server
连接,就必须知道其数据库实例名,只知道数据库名是没有用的,与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数据库名与实
例名之间的关系一般是一一对应关系,有一个数据库名就有一个实例名,如果在一个服务器中创建两个数据库,则有两个数据库名,两个数据库实例名,用两个标识 确定一个数据库,用户和实例相连接。
但在8i
、9i
的并行服务器结构中,数据库与实例之间不存在一一对应关系,而是一对多关系,(
一个数据库对应多个实例,同一时间内用户只一个实例相联系, 当某一实例出现故障,其它实例自动服务,以保证数据库安全运行。)

Oracle_SID
:操作系统环境变量。在实际中,对于数据库实例名的描述有时使用实例名(instance_name)
参数,有时使用ORACLE_SID
参数。这两个都是数据库实例名,它们有什么区别呢?(
经常弄混)

(ORACLE_SID)

OS<---------------->; ORACLE
数据库 <--------(Instance_name(
实例名))

上例表示实例名instance_name
、ORACLE_SID
与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但 instance_name
参数是ORACLE
数据库的参数,此参数可以在参数文件中查询到,而ORACLE_SID
参数则是操作系统环境变量。

操 作系统环境变量ORACLE_SID
用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID
。此参数与 ORACLE_BASE
、ORACLE_HOME
等用法相同。在数据库安装之后,ORACLE_SID
被用于定义数据库参数文件的名称。如:

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

在init.ora
中有db_name
,instance_name
,service_name

db_name
是数据库的名称,在db
安装时就已经设置了,这里不可修改,它觉得了数据库安装文件的位置。

instance_name
是实例名,是数据库运行中名称,其实在OO
中db_name
相当于类而instance_name
向当于对象,它也
是代表数据库运行中的内存及其进程,同时影响到了这些进程的名称,譬如:一个数据库db_name
=cus
,而其实例 instance_name=aking
,那么数据库起来后,其进程名可能为:Pmon_aking_1
。这里的实例名称要和PWDsid.ora
和 initSid.ora
等文件匹配上,否则,db
起动报错。从这里可以看出db_name
是类名,定义后是不可修改的,而对于instance_name
实例名向当于对象,所以我们可以设定自己喜欢的对象名称。不过话虽这样讲,但改了instance_name
后,牵扯到很多其他的设置,还是最好不要动 他,默认和db_name
是一样的,这样多好。

service_name
我觉得应该是指数据库网络连接时的名称,在listener
配置中会有所考虑的。这个值也是可以随意改动的,并且还可以有多个值。alter
system set service_name=serv1,serv2 scope=both;

在listener.ora
中有SID_NAME
,GLOBAL_DBNAME

这里SID_NAME
指数据库的运行的实例名,应该是和instance_name
一致

而对于GLOBAL_DBNAME
是listener
配置的对外网络连接名称,我们在配置tnsname.ora
时会考虑这个参数。这个参数可以任意的设置。

另外有一点需要注意,一般我们会在listener.ora
手工配置数据库实例的监听配置。但oracle
可以通过pmon
进程支持自动注册, 这时自动注册的对外网络连接名称就会用到init.ora
文件中service_name
,有多个值的话就会注册多个,对于上面的例子,在这里就会注册 serv1
和serv2
两个监听服务。如果你还手工配置了一个GLOBAL_DBNAME
=serv3
的监听服务的话,那么对于实例 instance_name=aking
就会有三个监听服务。

在tnsname.ora
中有SERVICE_NAME
,SID

下面配置客户端的tnsname.ora

对于这里的配置主要要给出要连接的数据库的IP
及其连接的实例或服务

在监听配置中我们提到了对外网络连接名称,在这里如果我们用SERVICE_NAME
的话,就需要SERVICE_NAME
= (GLOBAL_DBNAME
或者service_name
这里要求oracle
已经自动注册到了监听器中),对于SID
= (instance_name
)即可,譬如:

SERVICE_NAME
=serv1
,serv2
,serv3
都可以,或者

SID=aking

最后一个是ORACLE_SID
参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例,对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba
连接,因为这里用到了默认的实例名。

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

一直对ORACLE
中各种名字不是很清晰,这两天做了比较细致的研究,也算是小有成就吧,哈哈!

Service_name



数据库逻辑上表现为一个服务,服务名可以任意取,并且一个数据库可以有 多个服务名,名字由参数Service_names
决定,如果该参数为空,默认的服务名为全局数据库名,即db_name.db_domain


Instance_name



实例与数据库的对应关系是多对一,由参数instance_name
指定,当系统的实例与数据库为一对一关系时,通常实例名即为数据库名。

db_name



db_name
与db_domain
组成全局数据库名,唯一地标识一个Oracle
数据库,db_name
在数据库创建后就不能再更改。

ORACLE_SID



全称是Oracle System Identifier
,是以环境变量的形式出现,用于区分不同的实例。所以ORACLE_SID
其实就是当前想连接的实例名,因为实例与数据库是多对一的关系,所以确定了实例,就等于确定了要连接的数据库。

连接标识符:

下面是一个tnsnames.ora
文件的基本内容:

ORACLE =

(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT
= 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ora10g)

)

)

其中ORACLE
即是连接标识符,当使用本地命名的方式,在应用程序(如SQL*PLUS
)连接Oracle
时,使用的就是连接标识符,如

“sqlplus scott/tiger@oracle



连接标识符等号右边的内容全部为连接描述符,是使用本地命名连接Oracle
时所需的信息。

SERVICE_NAME
就是参数Service_names
中的值,必须与该参数的值对应,如果参数为空,那这里的SERVICE_NAME
只能是db_name.db_domain
,否则无法连接Oracle


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

PROTOCOL = TCP)(HOST = 192.168.0.6)(PORT
= 1521))

)

(CONNECT_DATA =

(SERVICE_NAME =
epolice

PROTOCOL --
协义

host --
数据库服务器ip

port --
数据库服务器端口

service_name --
数据库sid
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐