eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 《循序渐进Oracle》一书出版 | Blog首页 | 《循序渐进Oracle》第一章连载-之五 »

《循序渐进Oracle》第一章连载-之四
modb.pro

1.2.4 ORACLE_SID的含义
注意到在ORADIM创建服务之前,首先设置了ORACLE_SID:

set ORACLE_SID=eygle

在Linux/UNIX系统的创建中,同样要设置ORACLE_SID,不过Linux/UNIX上不存在服务这项内容,实例是可以通过参数文件直接启动的。
看一下Linux上正常情况下启动到nomount状态的过程:

[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs
[oracle@jumper dbs]$ ls
initconner.ora init.ora lkCONNER orapwconner spfileconner.ora spfile.ora
[oracle@jumper dbs]$ export ORACLE_SID=conner
[oracle@jumper dbs]$ sqlplus "/ as sysdba"

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Nov 3 14:57:22 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.

SQL> startup nomount
ORACLE instance started.

Total System Global Area 80811208 bytes
Fixed Size 451784 bytes
Variable Size 37748736 bytes
Database Buffers 41943040 bytes
Redo Buffers 667648 bytes


注意这里,Oracle根据参数文件的内容,创建了instance,分配了相应的内存区域,启动了相应的后台进程。
回顾一下前面的内容,注意到SID和ORACLE_SID已经多次出现,那么SID是什么?在数据库启动过程中又起到什么作用呢?

SID是System IDentifier的缩写,而ORACLE_SID就是Oracle System Identifier的缩写,在Oracle系统中,ORACLE_SID以环境变量的形式出现,在特定版本的Oracle软件安装(也就是ORACLE_HOME)下,当Oracle实例启动时,操作系统上fork的进程必须通过这个SID将实例与其他实例区分开来,这就是SID的作用。

我们知道Oracle的实例(instance)是由一块共享内存区域(SGA)和一组后台进程(background processes)共同组成;而后台进程正是数据库和操作系统进行交互的通道,这些进程的名称就是通过ORACLE_SID决定的。
实例的启动仅需要一个参数文件,而这个参数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init.ora,对于spfile文件,缺省的文件名为spfile.ora,Oracle依据ORACLE_SID来决定和寻找参数文件启动实例,参数文件的缺省位置为$ORACLE_HOME/dbs(Windows上为$ORACLE_HOME\database目录)。
spfile从Oracle 9i开始引入并成为了缺省使用的参数文件,Oracle启动实例时按照以下顺序从缺省目录查找参数文件:
spfile<ORACLE_SID>.ora→spfile.ora →init<ORACLE_SID>.ora
如果这3个文件都不存在,则Oracle实例将无法启动。

通过这些信息可以知道,在同一个ORACLE_HOME下,Oracle能够根据ORACLE_SID将实例区分开来;但是如果在不同的ORACLE_HOME下,Oracle将无法屏蔽相同名称的ORACLE_SID,也就是说即使在同一台主机上,Oracle也是能够创建相同ORACLE_SID的实例的。

以下一个测试,首先启动一个Oracle8i下ORACLE_SID为eygle的实例:

$ export ORACLE_SID=eygle
$ sqlplus "/ as sysdba"
SQL*Plus: Release 8.1.7.0.0 - Production on Fri Feb 16 10:23:58 2007
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.
<...ignore SGA info here...>

SQL> ! ps -ef|grep eygle
oracle8 11106 1 0 10:24:02 ? 0:00 ora_d000_eygle
oracle8 11090 1 0 10:24:02 ? 0:00 ora_ckpt_eygle
oracle8 11086 1 0 10:24:02 ? 0:00 ora_dbw0_eygle
oracle8 11084 1 0 10:24:02 ? 0:00 ora_pmon_eygle
oracle8 11092 1 0 10:24:02 ? 0:00 ora_smon_eygle
oracle8 11088 1 0 10:24:02 ? 0:00 ora_lgwr_eygle
......

接下来又可以启动另外ORACLE_HOME下ORACLE_SID为eygle的实例:

$ export ORACLE_SID=eygle
$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.4.0 - Production on Fri Feb 16 10:24:43 2007
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.
<...ignore SGA info here...>

SQL> ! ps -ef|grep pmon_eygle
oracle9 11214 11172 0 10:24:58 pts/1 0:00 grep pmon_eygle
oracle9 11180 1 0 10:24:48 ? 0:00 ora_pmon_eygle
oracle8 11084 1 0 10:24:02 ? 0:00 ora_pmon_eygle

现在这同一台主机上就启动了两个相同名称的实例,在操作系统上,Oracle能够通过ID标识将共享内存或信号量区分开来:

$ ipcs -i
IPC status from <running system> as of Fri Feb 16 10:30:02 CST 2007
T         ID      KEY        MODE        OWNER    GROUP
Message Queues:
q          0   0x2e781d5  --rw-r--r--     root     root
T         ID      KEY        MODE        OWNER    GROUP ISMATTCH
Shared Memory:
m       4096   0xabdc9b64 --rw-r-----  oracle8      dba       12
m       1025   0x79552064 --rw-r-----  oracle9      dba       11
Semaphores:
s    1245184   0x79978bac --ra-r-----  oracle8      dba
s     458753   0xa0e9f594 --ra-r-----  oracle9      dba

通过Oracle提供的一个小工具sysresv,我们可以找到对应于不同的ORACLE_SID,操作系统上创建的共享内存段ID(Shared Memory)和信号量ID(Semaphores)等信息。

$ sysresv -l eygle julia


IPC Resources for ORACLE_SID "eygle" :
Shared Memory:
ID              KEY
2560            0x79552064
Semaphores:
ID              KEY
720896          0xa0e9f594
Oracle Instance alive for sid "eygle"


IPC Resources for ORACLE_SID "julia" :
Shared Memory:
ID              KEY
514             0xab281214
Semaphores:
ID              KEY
196610          0xa7645a54
Oracle Instance alive for sid "julia"

在Linux/UNIX上,ORACLE_SID还和一个名为oratab的文件有关,在Solaris环境中,这个文件一般位于/var/opt/oracle目录下,在Linux及其他UNIX平台,这个文件一般位于/etc目录下。

该文件的主要内容如下:

# This file is used by ORACLE utilities. It is created by root.sh
# and updated by the Database Configuration Assistant when creating a database.

# A colon, ':', is used as the field terminator. A new line terminates
# the entry. Lines beginning with a pound sign, '#', are comments.
#
# Entries are of the form:
# $ORACLE_SID:$ORACLE_HOME::
#
# The first and second fields are the system identifier and home
# directory of the database respectively. The third filed indicates
# to the dbstart utility that the database should , "Y", or should not,
# "N", be brought up at system boot time.
#
# Multiple entries with the same $ORACLE_SID are not allowed.
#
*:/opt/oracle/product/9.2.0:N

当执行dbstart脚本时,Oracle会根据这里记录的ORACLE_SID的的设置来决定是否启动相关实例。
与Linux/UNIX上的情况类似,Windows上的Oracle环境也依赖于服务而存在,如图1-19所示。


我们注意到Oracle环境的初始化是通过ORACLE.EXE eygle来完成的,至于实例和数据库是否随服务启动要依赖于注册表中的设置。
通过手动在命令行执行类似命令,可以初始化任意的Oracle环境:

C:\>oracle julia
Press CTRL-C to exit server:

此后就可以连接到这个环境启动实例:

C:\>set ORACLE_SID=julia

C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 2月 17 10:11:13 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup nomount;
ORA-01078: failure in processing system parameters
LRM-00109: ???????????????? 'C:\ORACLE\10.2.0\DATABASE\INITJULIA.ORA'

当然还需要创建参数文件和口令文件等:

C:\>cp c:\oracle\10.2.0\database\SPFILEEYGLE.ORA c:\Oracle\10.2.0\database\spfilejulia.ora

C:\>orapwd file=c:\oracle\10.2.0\database\PWDjulia.ora password=oracle entries=5

此后,实例可以顺利启动,并可以挂接和打开数据库:

C:\>sqlplus "/ as sysdba"
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 2月 17 10:13:10 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到空闲例程。

SQL> startup nomount;
ORACLE 例程已经启动。
<...ignore SGA info here...>

SQL> set linesize 120
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ---------------------- ---------------
instance_name string julia
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------- ------------------ ------------------------------
db_name string eygle
SQL> alter database mount;
数据库已更改。
SQL> alter database open;
数据库已更改。

如果在环境窗口中按下CTRL+C组合键退出,则数据库将异常中断。
总结一下,实际上不管在Windows还是Linux/UNIX环境下,ORACLE_SID的作用就是设置一个Oracle环境窗口,通过这个环境变量来标示和命名系统进程,此后Oracle的活动可以由此展开。



历史上的今天...
    >> 2018-08-04文章:
    >> 2009-08-04文章:
           20090804 - 简报这一天
    >> 2008-08-04文章:
           墨墨恢复健康 - 病好了

By eygle on 2007-08-04 14:39 | Comments (12) | Books | 1531 |

12 Comments

spfile.ora→spfile.ora →init.ora
应该是
spfile.ora->spfile.ora->init.ora->init.ora

spfile.ora→spfile.ora →init.ora
应该是
spfilesid.ora->spfile.ora->initsid.ora->init.ora

谢谢abc,是Blog软件吞掉了特殊字符,我修正了一下:)

你这次的书才是真的叫深入浅出,我能看懂了。那本深入浅出估计要等这本看了再去看了。
感谢你的辛勤劳动。另:我们初学者不晓得哪里能够搞到正版的企业版有所谓的企业管理器的,而书中附带了不少要这个东西,我们用的express应该如何操作呢?请盖大侠明示,谢谢。

Oracle的软件产品,都可以从官方网站下载,没有限制的:
http://www.oracle.com/technology/software/index.html

那julia那套的数据文件呢

啊,那套数据文件,就不用打包了吧:)

eygle,你好,我看了上面的文章,有些不解的是:
在同一个$ORACLE_HOME下面都执行了
export ORACLE_SID=eygle之后OS怎么区分两个不同的实例呢?
还有、如果是一台机器建两个版本一样的且名字一样的实例应该不可以吧?
谢谢……
期待您的回复……

诸位好,我是一个Oracle新手,刚接触就在Linux AS4 上安装Oracle 10g 搞的头都大了,好不容易装上了,启动报
SQL>conn /as sysdba
Connected to an idle instance .
SQL>startup
ORA-01078:failure in processing system parameters
LRM-00109:could not open parameter file '/deve/oracle/app/oracle/produce/10.2.0/dbs/initoradb.ora'
我到相关目录下找 initoradb.ora 确实没有此文件,找了好多资料好像这个文件可以根据spfile.ora 生成 ,请问怎么生成呢 ???? 期待ing

你建好数据库了么?dbs目录下都有什么文件?

和楼上的一样,对这段话有点不理解:“通过这些信息可以知道,在同一个ORACLE_HOME下,Oracle能够根据ORACLE_SID将实例区分开来;但是如果在不同的ORACLE_HOME下,Oracle将无法屏蔽相同名称的ORACLE_SID,也就是说即使在同一台主机上,Oracle也是能够创建相同ORACLE_SID的实例的。”

既然无法屏蔽相同的sid,怎么又可以创建相同sid的实例呢?

不能阻止相同,所以才会出现相同SID的实例;这不是显而易见么?


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com