现在的位置: 首页 > 综合 > 正文

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

2013年08月20日 ⁄ 综合 ⁄ 共 4319字 ⁄ 字号 评论关闭

show parameter service_names

select instance_name from v$instance;

 

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 命令进行修改,然后修改相应参数。
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

抱歉!评论已关闭.