oracle sid,instance_name,db_name,oracle_sid之间的关系

【一】对ORACLE_SID的理解

--------------------------------------------------------------------------------
Oracle中SID的作用类似于一个“开关变量”---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例。

我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,从9i开始就默认使用spfile--即服务器端参数文件这两个文件的存放位置为:

A.pfile:名字为init<ORACLE_SID>.ora
B.spfile:名字为spfile<ORACLE_SID>.ora

我们看到init文件和spfile文件都带有ORACLE_SID的标识,这就是SID的作用了:

【1】当我们要启动一个实例时,我们首先通过:set ORACLE_SID = XXX 或者export ORACLE_SID = XXX 的方式告诉Oracle接下来要启动的实例

【2】当我们执行startup nomount时,由于已经指定了SID,那么Oracle知道了如何去默认的目录下查找该实例对应的参数文件--就是靠SID去匹配每个init/spfile文件

【3】当Oracle找到该文件后(init/spfile),就会读取该文件的内容,将一系列参数用于分配内存空间,构建后台进程等实例的启动过程

【4】当这个实例成功启动后,我们又可以重新执行 set ORACLE_SID = XXX 或 export ORACLE_SID = XXX 命令再次将“开关拨向”另一个SID,然后重复以上步骤

从上面的过程我们看到Oracle SID的作用是一个明显的“开关变量”,它拔向那一边,那么Oracle就会去找和它对应的参数文件来启动实例。其次SID也起到进程隔离的作用--即SID会在实例的一系列后台进程中得到体现,如ora_dbw0_paullin,ora_dbw0_boblin。通过SID来命名后台进程。

操作系统也必须通过SID来和Oracle实例打交道,操作系统并不知道什么INSTANCE_NAME,只知道ORACLE_SID,在Oracle内部由Oracle自己根据这个SID去识别不同的实例。所以ORACLE_SID更多的是“Oracle和外部操作系统沟通的一个窗口”。


【二】对INSTANCE_NAME的理解 
--------------------------------------------------------------------------------
相比于ORACLE_SID这样的“开关变量”,INSTANCE_NAME则是一个实实在在的参数。它是在init/pfile文件中配置的(db_name)。用于标识数据库实例的名称,其缺省值就是ORACLE_SID。

INSTANCE_NAME就像一个人的名称一样,而SID则是这个人的身份证号码。通过SID我们找到对应的init/spfile文件,而init/spfile文件中又通过instance_name这个参数告诉我们对应的实例叫什么名字。这样就把ORACLE_SID、参数文件、INSTANCE_NAME联系起来了。

造成ORACLE_SID不同,但INSTANCE_NAME相同的原因通常是因为复制了原有的参数文件,但忘记了修改其中的INSTANCE_NAME参数的值。不过在10G之后INSTANCE_NAME这个参数以及从init/spfile中消失了,以免引起混乱。


【三】对DB_NAME的理解 
--------------------------------------------------------------------------------
我们已经知道了ORACLE_SID是一个“开关变量”,INSTANCE_NAME是用来描述实例的。那么DB_NAME则是描述实例挂载的数据库名称,通过这个DB_NAME我们可以知道对应的磁盘上的控制文件、日志文件、数据文件的位置。

DB_NAME在创建数据库时被指定,默认情况下和ORACLE_SID的名字一样。但和INSTANCE_NAME一样。DB_NAME一旦被确定下来就不能修改了,因为它会同时存储在init/spfie,控制文件,日志文件,数据文件。你只能修改init/spfile文件中DB_NAME参数的值,但是不能手工修改其它文件的值。所以一旦修改后引起几个文件的值不匹配那么数据库的启动就会失败。

A.一个实例可以MOUNT并打开任何数据库(通过init/spfile中配置DB_NAME参数),但是同一时间一个实例只能打开一个数据库。
B.一个数据库可以被一个或多个实例所MOUNT并打开(只能是在RAC环境下,普通环境下一个数据库只能同时被一个实例MOUNT并打开)。

那么如何知道实例应该挂载到那个数据库并打开呢?就是靠init/spfile中的“control_files”参数来告诉Oracle去那里读取控制文件,而控制文件中又记录了数据文件的位置。所以最终形成一个完整的链条:

ORACLE_SID --> init/spfile文件 --> instance_name、db_name、control_files --> 实例名、数据库名、控制文件 --> 数据文件 --> 完成挂载并打开


【四】ORACLE_SID、INSTANCE_NAME、DB_NAME对应关系 
--------------------------------------------------------------------------------
我们已经知道ORACLE_SID是用来隔离同一个ORACLE_HOME下不同的实例的。但对于不同的ORACLE_HOME呢?能否有相同名称的SID呢?

实际上这就和文件系统的规则是一样的:在同一个目录下不允许有同名的文件存在,但不同的目录下可以有同名的文件。同样的在同一个ORACLE_HOME下不能有相同的SID存在,而不同的ORACLE_HOME下可以有重名的SID(即便是同一台机,只要ORACLE_HOME不同就可以)。

那么对于INSTANCE_NAME呢?默认情况下INSTANCE_NAME和ORACLE_SID是相同的,也可以是不同的;而且不同的实例可以具有相同的实例名。这听起来有点混乱是不?其实我们可以用一个简单的生活化例子来解析:

在一个班级Class_1里面,有两个学生,他们的名称都叫张三,但他们的学号肯定不同。在这里“张三”就是INSTANCE_NAME,而学号就是SID。所以INSTANCE_NAME重复没关系,只要SID不同就可以区分开来。

但是在另外一个班级Class_2里面,也有学号相同的学生,这时候就出现了我们说的SID相同的问题,那么如何区分呢?别忘了我们还有班级这个概念啊!对应于ORACLE就是ORACLE_HOME了。

至于INSTANCE_NAME和DB_NAME的对应关系,这个很好理解了,不同的实例可以挂载到不同的DB,也可以挂载到相同的DB嘛。可以把这理解为“多个进程同时对同一份磁盘文件的竞争性访问”。

A. 相同ORACLE_HOME下,INSTANCE_NAME可以相同,但ORACLE_SID必须唯一。通过ORACLE_SID来区分不同的实例
B. 不同ORACLE_HOME下,ORACLE_SID可以相同,通过ORACLE_HOME来区分不同的SID
C.不同INSTANCE_NAME可以对应不同的DB_NAME,也可以对应相同的DB_NAME。但是如果不是在RAC环境下,只能同时启动实例而不能同时挂载

【五】Oracle实例启动过程的相关参数文件 
--------------------------------------------------------------------------------
前面说到Oracle实例启动时,需要指定pfile/spfile参数,对应的就是init文件和spfile文件。那么当这两个文件同时存在时Oracle如何决定读取那个呢?

以Oracle 9i为例,由于默认采用了spfile来启动实例,所以查找的顺序是:

spfile<ORACLE_SID>.ora ---> spfile.ora ---> init<ORACLE_SID>.ora

即默认加载和SID对应的参数文件,如果找不到则采用默认的参数文件,再找不到就用旧的init文件,如果还是找不到则实例无法启动。


service Name和SID的区别

数据库名(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)
 
===================================================================================
 
数据库名:db_name
数据库实例名:instance_name
操作系统环境变量:oracle_sid
数据库服务名:service_names
数据库域名:db_domain
全局数据库名:global_db_name
 
在oracle7、oracle8数据库中只有数据库名以及实例名,在oracle8i、oracle9i中出现了数据库域名、服务名以及全局数据库名。
 
数据库名(db_name):用于区分一个数据的内部标识,是oracle的内部标记,是以二进制方式存储于数据库控制文件的参数。
数据库名的作用:数据库名是数据库的内部管理标记,在安装数据库、创建新的的数据库、创建数据库控制文件、修改数据库结构、使用数据库备份与恢复工具进行数据库备份时都需要使用数据名。
数据库安装完成后,数据库名称存储在参数文件(pfile,spfile)中,同时以二进制方式存储在控制文件中,两者必须匹配。如果两者不匹配,数据库在启动时提示ORA-01103号错误。
■ 对数据名称的查询:
1、查询参数文件 db_name的数值
2、select name from v$database
3、SQL>show parameter db_name
■ 修改数据库名(修改复杂,建议不要修改)
1、修改参数文件的数据库名称。
2.重建数据库的控制文件。
 
数据库实例名(instance_name):用于和操作系统之间的联系。
操作系统与数据库之间的交互则必须使用数据库实例名。数据库安装完成后,数据库实例名称存储在参数文件中,同时存储在注册表中。
数据库名与实例名一般是一一对应的关系,即:有一个数据库名就有一个实例名,而在oracle9i的并行服务器结构中是一对多的关系,即:一个数据库对应多个实例。
■ 对数据名称的查询:
1、查询参数文件 instance_name的数值
2、select instance_name from v$instance
3、SQL>show parameter instance_name
 
操作系统环境变量(oracle_sid):用于与数据库实例名相对应。instance_name是oracle数据库参数 -oracle_sid是操做系统环境变量,即在操作系统要得到实例名必须通过操做系统环境变量oracle_sid,oracle_sid与 instance_name必须相同
是数据库和操作系统的接口,由操作系统使用,是操作系统区分多个数据库的依据。oracle_sid存储在注册表中。如果数据库的oracle_sid与实际的instance_name不同,在操作系统下运行的oracle所有命令将产生错误。
■ 对数据实例名的定义:
SQL>set oracle_sid=数据库实例名
 
Instance_name与Oracle_sid默认情况下是相同的。其实oracle_sid与instance_name本来没有什么关系。当操作系统与数据库交互时,用的是oracle_sid,而当外部连接于数
据库进行交互时用的是instance_name。当同一台服务器安装了多个数据库时,操作系统利用Oracle_sid来区分不同实例的进程,而当我们与这台服务器的不同的数据库进行连接时,用instance_name来决定具体链接哪个数据库。

  

数据库域名(db_domain):在数据库名称后增加域名构成,使得数据库的取名在整个网络环境中惟一,主要用于oralce分布式环境中数据的远程复制。数据库域名存储在参数文件中。
以下情况要考虑使用数据库域名:1、在oracle分布式环境下,两个数据库之间要通过数据链路进行数据的远程传输。2、在同一网络环境下,两个数据库名相同。
■ 对数据库域名的查询:
1、查询参数文件 db_domain的数值
2、select value from v$parameter where name='db_domain'
3、SQL>show parameter db_domain
■ 修改数据库域名:
1、关闭数据库
2、修改数据库参数文件中的db_domain、service_names。
 
数据库服务名service_names:数据库名+数据库域名,意义与全局数据库名相同。
数据库服务名存储在参数文件中。
■ 对数据库服务名的查询:
1、查询参数文件 service_names的数值
2、select value from v$parameter where name='service_names'
3、SQL>show parameter service_names
 
全局数据库名global_db_name:数据库名+数据库域名。
 
 
数据库实例名、服务名与网络连接
ORACLE服务器版本 客户端网络驱动
ORACLE7 (支持实例名) SQL_NET(支持实例名)
ORACLE8 (支持实例名) NET8 (支持实例名)
ORACLE8i
(支持实例名、服务名) NET8i (支持实例名、服务名)
ORACLE9i
(支持实例名、服务名) ORACLE NET SERVICE
(支持实例名、服务名)
对于网络连接字符串使用实例名、服务名的问题,需要根据客户端驱动的版本和oracle服务器的版本共同确定,即两者都支持实例名和服务名的使用服务名,否则使用实例名。
原文地址:https://www.cnblogs.com/sangmu/p/6723033.html