[精华] 关于数据库名(db

来源:百度文库 编辑:神马文学网 时间:2024/05/02 13:36:06

ChinaUnix.net首页 |论坛 |博客 |Linux |人才 |培训 |精华 |Wiki |读书 |资料 |手册 |下载 |搜索

ChinaUnix首页 >精华文章 >Oracle > 正文

[精华] 关于数据库名(db_name)、实例名(instance_name)、ORACLE_SID
http://www.chinaunix.net 作者:jrlee  发表于:2006-03-18 15:23:36
【发表评论】【查看原文】【Oracle讨论区】【关闭】
最近因看到论坛有人问起这方面的东西,将自己的理解加上查阅相关资料整理如下,如果不全或不当的地方,望指正并补全它。
数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID)
在ORACLE7、8数据库中只有数据库名(db_name)和数据库实例名(instance_name)。在ORACLE8i、9i中出现了新的参数,即数据库域名(db_domain)、服务名(service_name)、以及操作系统环境变量(ORACLE_SID)。这些都存在于同一个数据库中的标识,用于区分不同数据库的参数。
一、什么是数据库名(db_name)?
数据库名是用于区分数据的内部标识,是以二进制方式存储于数据库控制文件中的参数,在数据安装或创建之后将不得修改。数据库安装完成后,该参数被写入数据库参数文件pfile中,格式如下:
.........
db_name="orcl"     #(不允许修改)
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
在每一个运行的ORACLE8i数据库中都有一个数据库名(db_name),如果一个服务器程序中创建了两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库。
二、什么是数据库实例名(instance_name)
数据库实例名则用于和操作系统之间的联系,用于对外部连接时使用。在操作系统中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库server连接,就必须知道其数据库实例名,只知道数据库名是没有用的,与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数据库安装完成后,该实例名被写入数据库参数文件pfile中,格式如下:
db_name="orcl"     #(不允许修改)
db_domain=dbcenter.toys.com
instance_name=orcl  #(可以修改,可以与db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........
数据库名与实例名之间的关系。
数据库名与实例名之间的关系一般是一一对应关系,有一个数据库名就有一个实例名,如果在一个服务器中创建两个数据库,则有两个数据库名,两个数据库实例名,用两个标识确定一个数据库,用户和实例相连接。
但在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被用于定义数据库参数文件的名称。如:
$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。
定义方法:
export ORACLE_SID=orcl
如果在同一服务器中创建了多个数据库,则必然同时存在多个数据库实例,这时可以重复上述定义过程,以选择不同实例。
还可以用
[oracle@Datacent]$ . oraenv
来切换不同的ORACLE_SID来通过操作系统来启动不同的实例(instance)
谢谢   :em03:
rollingpig 回复于:2004-06-16 11:10:27
总结的很不错哦。
PS:DB_NAME可以改的
不过,步骤颇为麻烦
jrlee 回复于:2004-06-16 11:59:14
引用:原帖由 "rollingpig" 发表:
总结的很不错哦。
PS:DB_NAME可以改的
不过,步骤颇为麻烦
对,那可是连原来的控制文件都一起得改,是很麻烦。  :P
pearaep 回复于:2004-06-19 18:16:00
service_name和以上三者又是什么关系呢?
smartlam 回复于:2004-06-20 10:47:48
service_name是在网络上用户向监听器发出连接数据库请求时,监听器向数据库实例注册时用到的一个初始化参数。服务名确定数据库服务是属于哪一个实例的。
smilebbsxp 回复于:2004-06-21 00:03:02
不错,这个方面的区别以前我很郁闷的,呵呵
一直将service-name,instance,sid等设置为一样,这样就避免了许多麻烦
zlh892 回复于:2004-06-29 22:34:51
总结得太好了 :!:
海水7890 回复于:2004-06-30 08:06:47
总结得很不错哟,非常感谢,使我这个初学者又增长了一点知识。希望以后多发点ORACLE学习方面的内容。
pearaep 回复于:2004-07-03 12:38:05
在TNSnames.ora文件中的连接串中,有时指定的是service_name,但有时必须指定SID_NAME,二者有什么区别吗?
dong_jh 回复于:2004-07-03 13:04:37
8I,9I的rac最好指定服务名,因为多个RAC实例的服务名相同而SID不同,只有指定服务名才能配置故障切换,如果要连到指定的实例,也可以用SID.我想服务名是为了RAC而设立的,不知道对不对?
另外我困惑的一个问题是:服务名可否与数据库名不同?何处指定?据说一个库还可以有几个服务名?INIT.ora中的service_names=参数是干什么的?
pearaep 回复于:2004-07-03 14:04:35
就我的体会,有时通过sql*net连接远程数据库时,有时必须指定service_name,有时需要指定sid_name但什么时候、在何种条件下需要指哪种设置好象也没什么规律,特别是Wind平台下,unix平台的基本没什么太大问题。service_name(s)和 db_name,instance_name究竟什么关系,我也没太明白。
pearaep 回复于:2004-07-03 14:28:28
----------from oracle metalink-----------
The global names is used by the oem product and needs to be in the sid_desc for oem to function correctly.
Service name is used in the tnsnames.ora file and when the connection using service name arrives at the listener, the listener checks it's tables for a registration match so it can hand of the connection to either a dedicated process or a dispatcher.
service_names in the init.ora file is set to the service_names + the db_domain and these two values should match the service_name parameter in the tnsnames.ora file or a registration error will occur if they do not match. The service_names is the parameter that registers the names listed here with the listener when the instance starts.
The global_dbname and the service name can be different names as long as the service_name matches the registration name registered with the listener.
pearaep 回复于:2004-07-03 14:28:59
--------from oracle metalink--------------
DB_NAME is the database identifier of up to eight characters. If specified, it must correspond to the name specified in the CREATE DATABASE statement. Although the use of DB_NAME is optional, it should generally be set before invoking CREATE DATABASE and then referenced in that statement. If not specified, a database name must appear on either the STARTUP OPEN db_name or ALTER DATABASE db_name MOUNT command line.
INSTANCE_NAME is a string value representing the name of the instance and is used to uniquely identify a specific instance when multiple instances share common services names.
Prior to Oracle 8i, clients connected to a database by specifying the Oracle SID (system identifier) in the connect descriptor. INSTANCE_NAME should not be confused with the SID, which actually uniquely identifies the instances shared memory on a host.
From 8i, the concept of a 'service name' has been introduced. Specifically, clients can specify 'service_name' and 'instance_name' in the connect descriptor. The SERVICE_NAMES is used to identify a database service. This parameters defaults to DB_NAME.DB_DOMAIN (the global database name). A database can be identified by more than one service name. Now INSTANCE_NAME identifies an instance of a database. This parameter is analagous to the SID of an instance, that is "SID_NAME" is now "SERVICE_NAME". Again, an instance can have only one "INSTANCE_NAME," but more than one "SERVICE_NAMES"
E.g.:
instance_name = v817
service_names = ( marketing, support, education )
One more thing to note here is, the parameter is "SERVICE_NAME" in tnsnames.ora and "SERVICE_NAMES" defined in "init;.ora".
The following articles which you could obtain using the search, will help you:
30715.1 Init.ora Parameter "DB_NAME" Reference Note
68522.1 Init.ora Parameter "INSTANCE_NAME" Reference Note
77640.1 SERVICE_NAME parameter in Oracle8i
76531.1 Service Name Usage in Net8i
69546.1 Oracle8i - Instance Registration to Listeners
dong_jh 回复于:2004-07-03 16:35:03
引用:原帖由 "dong_jh" 发表:
8I,9I的rac最好指定服务名,因为多个RAC实例的服务名相同而SID不同,只有指定服务名才能配置故障切换,如果要连到指定的实例,也可以用SID.我想服务名是为了RAC而设立的,不知道对不对?
另外我困惑的一个问题是:服务名..........
dong_jh 回复于:2004-07-03 17:36:20
我再init.ora中设了几个service_names=,中间用逗号格开,重启数据库,但好像没有用.
smartlam 回复于:2004-07-03 23:22:35
我的理解是:service_name 是在oracle net 结构下给客户端连接oracle 服务器所提供的服务用的一个标识符,(如销售部门用sales,财务部门用finance等),默认是和global database name一样。oracle推荐的service_name格式是db_name.db_domain。和instance_name一样包含在客户端连接字的connect_data中。而sid_name默认和instance_name是相同的。因为一个或多个实例可以对应一个数据库。所以在连接字中用service_name和instance_name来区分不同的连接。
dong_jh 回复于:2004-07-04 20:54:29
为何没用?
dong_jh 回复于:2004-07-05 17:08:37
This parameters(service_name) defaults to DB_NAME.DB_DOMAIN ,那么如何把默认的名称改成别的?
smartlam 回复于:2004-07-05 20:20:24
引用:原帖由 "dong_jh"]This parameters(service_name) defaults to DB_NAME.DB_DOMAIN ,那么如何把默认的名称改成别的?
发表:
alter system set service_names='new name' scope=spfile;
dong_jh 回复于:2004-07-08 13:13:16
这样客户端用这个服务名能连接吗?
wind315 回复于:2004-07-21 11:38:54
那我问个问题呀!
我在init.ora文件中同时存在db_name,instance_name和service_name时,数据库能在同一网段连入正常,而通过了路由的网络要访问数据库时,我查看了listener.log文件,当该文件中出现“09-JAN-2004 18:41:18 * service_register * ORA81 * 0”时,通过路由的就连不上!这是何原因?
问题的具体描述见:
http://bbs.chinaunix.net/forum/19/20040109/240607.html
我试着将init.ora文件的instance_name和service_name注释掉之后,这一现像解决,请问这又是为何?
盼解答!
dong_jh 回复于:2004-07-21 21:28:13
不是吧?
wind315 回复于:2004-07-22 09:19:02
引用:原帖由 "wind315" 发表:
我试着将init.ora文件的instance_name和service_name注释掉之后,这一现像解决,请问这又是为何?
盼解答!
不会都没人知道吧?
jrlee 回复于:2004-07-22 15:48:58
看看你所使用的连接方式是什么
如果你使用实例名连接,手工修改tnsname.ora文件,将service_name改为SID。如果使用service_name连接,在初使化数据库参数文件里应该要打开呀!
数据库服务名是数据库名+域名。
使用网络驱动NET8i,ORACLE9i Net services 与8i、9i服务器连接时,其主机字符串将不再使用实例名,而是使用数据库服务名,
但8i、9i的客户端要连接到ORACLE7、8数据库服务器上,则客户端连接必须使用数据库实例名,而不得使用服务名。
wind315 回复于:2004-08-04 23:44:20
引用:原帖由 "jrlee" 发表:
看看你所使用的连接方式是什么
如果你使用实例名连接,手工修改tnsname.ora文件,将service_name改为SID。如果使用service_name连接,在初使化数据库参数文件里应该要打开呀!
.........
我查了,我使用的是SID(在TNSNAME.ORA),但问题依旧,如果可能的话,连系我,我让你进我的服务器看看是咋回事?
lq52886@163.com
edeed 回复于:2004-10-17 20:07:28
说实在的,还是没有完全明白!为什么oracle喜欢弄这些容易混淆的东西啊!
ucdos2003 回复于:2004-10-21 15:52:04
我想问一下RAC中的两个node上的环境变量中的ORACLE_SID与实例之间的关系如何,RAC中两个node的两个instance对应与之相关的共用的DATABASE.如果有第二个DATABASE,两个node就有与之对应的instance,这两个instance与ORACLE_SID的对应关系如何呢?
xujf 回复于:2004-12-30 08:28:27
ding
jlqidan 回复于:2005-01-18 20:05:58
引用:原帖由 "ucdos2003"]我想问一下RAC中的两个node上的环境变量中的ORACLE_SID与实例之间的关系如何,RAC中两个node的两个instance对应与之相关的共用的DATABASE.如果有第二个DATABASE,两个node就有与之对应的instance,这两个instance与O..........
发表:
gzadams 回复于:2005-01-18 23:14:25
总结很好啊,有收获,谢谢! :em02:
gzadams 回复于:2005-01-18 23:15:35
总结很好啊,有收获,谢谢! :em02:
wangzx0729 回复于:2005-06-01 11:11:44
学习中
e_david 回复于:2006-03-18 15:23:36
好贴!

原文链接:http://bbs.chinaunix.net/viewthread.php?tid=348162
转载请注明作者名及原文出处
Copyright © 2001-2006 ChinaUnix.net   All Rights Reserved

感谢所有关心和支持过ChinaUnix的朋友们
京ICP证041476号