首先介绍几个关于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 connect descriptor in a tnsnames.ora file, and in the definition of the network listener in a listener.ora file.
Specifies name of Oracle9i database instance 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的值会保存在registry(注册表)中,当你把注册表中ORACLE_SID的值清空的时候,系统的默认值是你安装Oracle时在“数据库标识”窗口所输入的SID的值。
从上面的定义,我们可以很清楚地知道:SID是Oracle数据库实例的唯一名称标识(A unique name for an Oracle instance.)。
了解了上面的概念之后,我们可以来讨论一下SID和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 registry.
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.
|
"Configuration Parameters and the Registry" in Oracle9i Database Getting Started for Windows for more information on subkey locations for multiple Oracle homes |
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:
Text description of the illustration addvalue.gif
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.
A string editor dialog box appropriate for the data type appears:
Text description of the illustration stringre.gif
5. Enter prod in the String Editor dialog box.
Registry Editor adds parameter ORACLE_SID.
7. Choose Exit from the Registry menu.
看完这段说明,我们可以看到:如果你想让你新建的数据库成为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 registry.)。从上面的表述,我们不难发现:ORACLE_SID是用来指定Oracle服务器默认的数据库(实例)的。
现在,我们可以很清楚地看到SID和ORACLE_SID的区别了。
ps:我是Oracle数据库初学者,如果上文有什么错误,欢迎各位指出。谢谢!!!
最后,附上Oracle9i Database Online Documentation
(Release 2 (9.2))的链接:http://download.oracle.com/docs/cd/B10501_01/index.htm
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的区别
Oracle实例名与ORACLE_SID的区分测试一
Hit any key to exit server:
ORA-01078: failure in processing system parameters
LRM-00109: N^7(4r?*2NJ}ND<~ \'D:\ORACLE\ORA92\DATABASE\INITJULIA.ORA\'
SQL> startup nomount;
ORACLE 例程已经启动。
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.
Usage: orapwd file=<fname> password=<password> entries=<users>
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.
alter database mount
*
ERROR 位于第 1 行:
ORA-01100: ??????
SQL> alter session set nls_language=american;
alter database mount
*
ERROR at line 1:
ORA-01100: database already mounted
SQL> alter database open;
---------
ORA
----------------
julia
------------------------------------ ----------- ------------------------------
db_name string ora
SQL> show parameter instance_name
------------------------------------ ----------- ------------------------------
instance_name string orasid
SQL> show parameter service_name
------------------------------------ ----------- ------------------------------
service_names string ora
SQL>