首先介绍几个关于Oracle的基本概念:instance、SID和ORACLE_SID。
instance(Oracle官方给出的定义)
Every running Oracle database is associated with an Oracle instance. When a database is started on a database server (regardless of the type of computer), Oracle allocates a memory area called the System Global Area (SGA) and starts an Oracle process. This combination of the SGA and an Oracle process is called an instance. The memory and the process of an instance manage the associated database's data efficiently and serve the one or more users of the database.
system identifier (SID)(同样是Oracle官方给出的定义)
A unique name for an Oracle instance.(前面的一句是重点,后面的以我们现在讨论的话题没有直接的关系) To switch between Oracle databases, users must specify the desired SID. The SID is included in theCONNECT DATA parts of the in a file, and in the definition of the in a .
(同样是Oracle官方给出的定义)
Specifies name of Oracle9i database on host computer. The value of this parameter is the SID for the instance. Default value is specified by entry in the Database Identification window of Oracle Universal Installer.(最后一句说:ORACLE_SID的)。
ORACLE_SID的值会保存在(注册表)中,当你把注册表中ORACLE_SID的值清空的时候,系统的默认值是你安装Oracle时在“数据库标识”窗口所输入的SID的值。
从上面的定义,我们可以很清楚地知道:SID是Oracle数据库实例的唯一名称标识(A unique name for an Oracle instance.)。
了解了上面的概念之后,我们可以来讨论一下和ORACLE_SID的区别了。首先,我们是通过Oracle实例来完成对Oracle数据库的管理的。而我们又知道SID是Oracle实例的唯一名字标识。换言而言之,我们是通过SID来指定我们将要进行管理的数据库是数据库系统中的哪个数据库的。这也是为什么需要SID的一个重要的原因。那么,ORACLE_SID呢?别急,让我们再来看一段Oracle的官方提供文字:
Updating ORACLE_SID in the Registry
If this is the first database on the system or if you intend to make the new database the default database, then you must make a change in the .
1. Start Registry Editor at the command prompt:
2. C:\> regedt32
The Registry Editor window appears.
2. Choose subkey \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME0 for the first Oracle home on your computer. For subsequent installations to different Oracle homes on the same computer, the path is \HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOMEID where ID is the unique number identifying the Oracle home.
See Also:
"Configuration Parameters and the Registry" in for more information on subkey locations for |
3. Locate parameter ORACLE_SID on the right side of the Registry Editor window.
4. Double-click the parameter name and change the data to the new SID, which is prod in this example.
If you do not yet have parameter ORACLE_SID, because this is the first database on your system, then you must create it.
To create parameter ORACLE_SID:
1. Choose Add Value from the Edit menu.
The Add Value dialog box appears:
2. Enter ORACLE_SID in the Value Name text box.
3. Select REG_EXPAND_SZ (for an expandable string) in the Data Type list box.
4. Click OK.
A string editor dialog box appropriate for the data type appears:
5. Enter prod in the String Editor dialog box.
6. Click OK.
Registry Editor adds parameter ORACLE_SID.
7. Choose Exit from the Registry menu.
Registry Editor exits.
看完这段说明,我们可以看到:如果你想让你新建的数据库成为Oracle服务器默认的数据库(即是当你不指定要连接的数据库(实例)时,Oracle服务器默认帮你连接的数据库(实例)),你必须修改注册表中ORACLE_SID的值——把ORACLE_SID的值设置为你新建的数据库的实例名。(if you intend to make the new database the default database, then you must make a change in the .)。从上面的表述,我们不难发现:ORACLE_SID是用来指定Oracle服务器默认的数据库(实例)的。
现在,我们可以很清楚地看到SID和ORACLE_SID的区别了。
ps:我是Oracle数据库初学者,如果上文有什么错误,欢迎各位指出。谢谢!!!
最后,附上Oracle9i Database Online Documentation
(Release 2 (9.2))的链接:
oracle sid,instance_name,db_name,oracle_sid之间的关系
【一】对ORACLE_SID的理解
--------------------------------------------------------------------------------
Oracle中SID的作用类似于一个“开关变量”---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例。
我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,从9i开始就默认使用spfile--即服务器端参数文件这两个文件的存放位置为:
A.pfile:名字为init.ora
B.spfile:名字为spfile.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.ora ---> spfile.ora ---> init.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=数据库实例名
数据库域名(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服务器的版本共同确定,即两者都支持实例名和服务名的使用服务名,否则使用实例名。
====================================================================================
1. SID是实例名,实例名指的是用于响应某个数据库操作的数据库管理系统的名称。实例名是由初始化参数文件的参数instance_name决定的。如果这个参数不被指定(即instance_name没有被指定为任何值),那么实例的名字由该用户的环境变量ORACLE_SID(注意这里是大写)决定。在windows平台下,则是注册表中oracle_sid值决定。
2. SERVICE_NAME指的是listener中的全局数据库名:这个名字是由listener.ora中GLOBAL_DBNAME参数决定的。这个名字代表的是客户端连接到数据库时,tnsnames.ora中SERVICE_NAME参数所对应的值。
3. 连接字符串
配置tnsname.ora时,可以用SID,也可以用SERVICE_NAME. 注意这两个值不一定相同,具体要看数据库服务器中的配置。
connect_str =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = xxxx
)
)
connect_str =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.xx.xx.xx)(PORT = 1521))
)
(CONNECT_DATA =
(SID = xxx)
(SERVER = DEDICATED)
)
)
Oracle实例名与ORACLE_SID的区分测试一
windows上的Oracle环境是依赖于服务而存在的。而Oracle环境的初始化是通过oracle.exe 来完成的,至于实例和数据库是否随服务启动要依赖注册表的设置。
我们可以通过手工来初始化任意的Oracle环境。
开启命令窗口1,建立操作系统服务
C:\Documents and Settings\IBM>oracle julia
Hit any key to exit server:
在命令窗口2中,就可以使用该系统服务了
C:\Documents and Settings\IBM>set oracle_sid=julia
C:\Documents and Settings\IBM>sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.1.0 - Production on 星期二 3月 11 13:53:52 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
已连接到空闲例程。
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: N^7(4r?*2NJ}ND<~ 'D:\ORACLE\ORA92\DATABASE\INITJULIA.ORA'
SQL> startup nomount;
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL> alter database mount;
alter database mount
*
ERROR 位于第 1 行:
ORA-01990: ??????'D:\oracle\ora92\DATABASE\PWDjulia.ORA'???
ORA-27041: ??????
OSD-04002: N^7(4r?*ND<~
O/S-Error: (OS 2) O5M3UR2;5=V86(5DND<~!#
SQL> host
Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.
C:\Documents and Settings\IBM>orapwd
Usage: orapwd file= password= entries=
where
file - name of password file (mand),
password - password for SYS (mand),
entries - maximum number of distinct DBA and OPERs (opt),
There are no spaces around the equal-to (=) character.
C:\Documents and Settings\IBM>orapwd file=D:\oracle\ora92\DATABASE\PWDjulia.ORA password=oracle entries=5
C:\Documents and Settings\IBM>exit
SQL> alter database mount;
alter database mount
*
ERROR 位于第 1 行:
ORA-01100: ??????
SQL> alter session set nls_language=american;
Session altered.
SQL> alter database mount;
alter database mount
*
ERROR at line 1:
ORA-01100: database already mounted
SQL> alter database open;
Database altered.
SQL> select name from v$database;
NAME
---------
ORA
SQL> select instance_name from v$instance;
INSTANCE_NAME
----------------
julia
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string ora
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string orasid
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string ora
SQL>
可见,ORACLE_SID的作用就是设置一个Oracle环境窗口,通过这个环境变量来标识和命名系统进程,此后Oracle的活动可以由此展开。
我们看一下这里所出现的所有“xx名”
操作系统服务名:julia
ORACLE_SID:julia
db_name:ora
数据字典v$instance中的instance_name:julia
PFILE中的instance_name:orasid
ORACLE_SID用于标识进程,它所对应的操作系统服务名称为OracleService;而INSTANCE_NAME用于标识实例,二者名称可以不同。而在配置NET SERVICE时,使用的是service_names。
二者的区别大致如此,只是不知道为什么数据字典v$instance中的实例名也是julia?