对于在Unix/Linux平台下部署过Oracle数据库、或者熟悉Oracle的人来讲,或许对这两个环境变量并不陌生。
通常情况下,ORACLE_SID这个环境变量全称Oracle System Identifier
,,用于在一台服务器上标识不同的实例,默认情况下,实例名就是ORACLE_SID的值(即INSTANCE_NAME=$ORACLE_SID。当然实例名也可以不同于ORACLE_SID这个环境变量,只要在初始化参数文件里显示指定INSTANCE_NAME参数值不同于ORACLE_SID环境变量的值即可)。在UNIX/Linux平台下,该环境变量主要作用是同ORACLE_HOME这个环境变量做hash运算,得到一个唯一值,用来标识共享内存段,及SGA。下面,摘录一段TOM大师光辉著作《Expert Oracle Database Architecture 》的原文:
If you’re unfamiliar with the term SID or ORACLE_SID, a full definition is called for. The SID is a site identifier . It and ORACLE_HOME (where the Oracle software is installed) are hashed together in UNIX to create a unique key name for attaching an SGA. If your ORACLE_SIDor ORACLE_HOME is not set correctly, you’ll get the ORACLE NOT AVAILABLE error, since you can’t attach to a shared memory segment that is identified by this unique key. On Windows, shared memory isn’t used in the same fashion as UNIX, but the SID is still important. You can have more than one database on the same ORACLE_HOME, so you need a way to uniquely identify each one, along with their configuration files.
ORACLE_HOME环境变量是Oracle软件的安装路径,顺带ORACLE_BASE环境变量是Oracle软件安装的基目录。
知道了ORACLE_SID和ORACLE_HOME这两个环境变量的作用后,我们来看下面的案例:
首先,来看在参数文件里只用一个db_name参数来启动实例的情况,即默认情况下,INSTANCE_NAME=$ORACLE_SID的情形:
[root@localhost ~]# su - oracle [oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb10g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/oracle [oracle@localhost ~]$ ps -ef | grep ora_ oracle 17938 17904 0 15:15 pts/1 00:00:00 grep ora_ [oracle@localhost ~]$ cd $ORACLE_HOME/dbs [oracle@localhost dbs]$ pwd /u01/app/oracle/dbs [oracle@localhost dbs]$ cat initphydb10g.ora *.db_name='glndb' [oracle@localhost dbs]$ sqlplus SQL*Plus: Release 10.2.0.5.0 - Production on Thu Mar 1 15:16:15 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> set line 160 SQL> show parameter instance_name; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ instance_name string phydb10g SQL> !ps -ef | grep ora_ oracle 17946 1 0 15:16 ? 00:00:00 ora_pmon_phydb10g oracle 17948 1 0 15:16 ? 00:00:00 ora_psp0_phydb10g oracle 17950 1 0 15:16 ? 00:00:00 ora_mman_phydb10g oracle 17952 1 0 15:16 ? 00:00:00 ora_dbw0_phydb10g oracle 17954 1 0 15:16 ? 00:00:00 ora_lgwr_phydb10g oracle 17956 1 0 15:16 ? 00:00:00 ora_ckpt_phydb10g oracle 17958 1 0 15:16 ? 00:00:00 ora_smon_phydb10g oracle 17960 1 0 15:16 ? 00:00:00 ora_reco_phydb10g oracle 17962 1 0 15:16 ? 00:00:00 ora_mmon_phydb10g oracle 17964 1 0 15:16 ? 00:00:00 ora_mmnl_phydb10g oracle 17966 17943 0 15:16 pts/2 00:00:00 /bin/bash -c ps -ef | grep ora_ oracle 17968 17966 0 15:16 pts/2 00:00:00 grep ora_ SQL> shutdown immediate; ORA-01507: database not mounted ORACLE instance shut down. SQL>
然后,来看INSTANCE_NAME<>$ORACLE_SID的情形:
[oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb10g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/oracle [oracle@localhost ~]$ cat /u01/app/oracle/dbs/initphydb10g.ora *.db_name='glndb' *.instance_name='inst10g' [oracle@localhost ~]$ ps -ef | grep ora_ oracle 18033 17996 0 15:23 pts/1 00:00:00 grep ora_ [oracle@localhost ~]$ sqlplus SQL*Plus: Release 10.2.0.5.0 - Production on Thu Mar 1 15:23:19 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> set line 160 SQL> show parameter instance_name NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ instance_name string inst10g SQL> !ps -ef | grep ora_ oracle 18040 1 0 15:23 ? 00:00:00 ora_pmon_phydb10g oracle 18042 1 0 15:23 ? 00:00:00 ora_psp0_phydb10g oracle 18044 1 0 15:23 ? 00:00:00 ora_mman_phydb10g oracle 18046 1 0 15:23 ? 00:00:00 ora_dbw0_phydb10g oracle 18048 1 0 15:23 ? 00:00:00 ora_lgwr_phydb10g oracle 18050 1 0 15:23 ? 00:00:00 ora_ckpt_phydb10g oracle 18052 1 0 15:23 ? 00:00:00 ora_smon_phydb10g oracle 18054 1 0 15:23 ? 00:00:00 ora_reco_phydb10g oracle 18056 1 0 15:23 ? 00:00:00 ora_mmon_phydb10g oracle 18058 1 0 15:23 ? 00:00:00 ora_mmnl_phydb10g oracle 18060 18037 0 15:23 pts/2 00:00:00 /bin/bash -c ps -ef | grep ora_ oracle 18062 18060 0 15:23 pts/2 00:00:00 grep ora_ SQL> shutdown immediate; ORA-01507: database not mounted ORACLE instance shut down. SQL>
其次,来看在同一个ORACLE_HOME下启动两个不同实例的情形,即ORACLE_HOME相同,ORACLE_SID不同:
[oracle@localhost ~]$ pwd /home/oracle [oracle@localhost ~]$ ps -ef | grep ora_ oracle 18187 18077 0 15:28 pts/1 00:00:00 grep ora_ [oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb10g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/oracle [oracle@localhost ~]$ cat /u01/app/oracle/dbs/initphydb10g.ora *.db_name='glndb' *.instance_name='inst10g' [oracle@localhost ~]$ sqlplus SQL*Plus: Release 10.2.0.5.0 - Production on Thu Mar 1 15:29:41 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> !ps -ef | grep ora_ oracle 18199 1 0 15:29 ? 00:00:00 ora_pmon_phydb10g oracle 18201 1 0 15:29 ? 00:00:00 ora_psp0_phydb10g oracle 18203 1 0 15:29 ? 00:00:00 ora_mman_phydb10g oracle 18205 1 0 15:29 ? 00:00:00 ora_dbw0_phydb10g oracle 18207 1 0 15:29 ? 00:00:00 ora_lgwr_phydb10g oracle 18209 1 0 15:29 ? 00:00:00 ora_ckpt_phydb10g oracle 18211 1 0 15:29 ? 00:00:00 ora_smon_phydb10g oracle 18213 1 0 15:29 ? 00:00:00 ora_reco_phydb10g oracle 18215 1 0 15:29 ? 00:00:00 ora_mmon_phydb10g oracle 18217 1 0 15:29 ? 00:00:00 ora_mmnl_phydb10g oracle 18219 18196 0 15:29 pts/2 00:00:00 /bin/bash -c ps -ef | grep ora_ oracle 18221 18219 0 15:29 pts/2 00:00:00 grep ora_ SQL> ! [oracle@localhost ~]$ export ORACLE_SID=phydb11g [oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb11g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/oracle [oracle@localhost ~]$ cat /u01/app/oracle/dbs/initphydb11g.ora *.db_name='glndb' *.instance_name='inst11g' [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 10.2.0.5.0 - Production on Thu Mar 1 15:30:31 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> set line 160 SQL> show parameter instance_name; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ instance_name string inst11g SQL> !ps -ef | grep ora_ oracle 18199 1 0 15:29 ? 00:00:00 ora_pmon_phydb10g oracle 18201 1 0 15:29 ? 00:00:00 ora_psp0_phydb10g oracle 18203 1 0 15:29 ? 00:00:00 ora_mman_phydb10g oracle 18205 1 0 15:29 ? 00:00:00 ora_dbw0_phydb10g oracle 18207 1 0 15:29 ? 00:00:00 ora_lgwr_phydb10g oracle 18209 1 0 15:29 ? 00:00:00 ora_ckpt_phydb10g oracle 18211 1 0 15:29 ? 00:00:00 ora_smon_phydb10g oracle 18213 1 0 15:29 ? 00:00:00 ora_reco_phydb10g oracle 18215 1 0 15:29 ? 00:00:00 ora_mmon_phydb10g oracle 18217 1 0 15:29 ? 00:00:00 ora_mmnl_phydb10g oracle 18258 1 0 15:30 ? 00:00:00 ora_pmon_phydb11g oracle 18260 1 0 15:30 ? 00:00:00 ora_psp0_phydb11g oracle 18262 1 0 15:30 ? 00:00:00 ora_mman_phydb11g oracle 18264 1 0 15:30 ? 00:00:00 ora_dbw0_phydb11g oracle 18266 1 0 15:30 ? 00:00:00 ora_lgwr_phydb11g oracle 18268 1 0 15:30 ? 00:00:00 ora_ckpt_phydb11g oracle 18270 1 0 15:30 ? 00:00:00 ora_smon_phydb11g oracle 18272 1 0 15:30 ? 00:00:00 ora_reco_phydb11g oracle 18274 1 0 15:30 ? 00:00:00 ora_mmon_phydb11g oracle 18276 1 0 15:30 ? 00:00:00 ora_mmnl_phydb11g oracle 18306 18255 0 15:30 pts/2 00:00:00 /bin/bash -c ps -ef | grep ora_ oracle 18308 18306 0 15:30 pts/2 00:00:00 grep ora_ SQL>
最后,不同的ORACLE_HOME,相同的ORACLE_SID的情况,该情况下,在同一台服务器上分别安装了10.2.0.5.0、11gR2两套不同的Oracle软件,ORACLE_HOME不同:
[oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb10g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/oracle [oracle@localhost ~]$ ps -ef | grep ora_ oracle 18324 18077 0 15:34 pts/1 00:00:00 grep ora_ [oracle@localhost ~]$ cat /u01/app/oracle/dbs/initphydb10g.ora *.db_name='glndb' *.instance_name='inst10g' [oracle@localhost ~]$ sqlplus SQL*Plus: Release 10.2.0.5.0 - Production on Thu Mar 1 15:35:16 2012 Copyright (c) 1982, 2010, Oracle. All Rights Reserved. Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 171966464 bytes Fixed Size 2094832 bytes Variable Size 113248528 bytes Database Buffers 50331648 bytes Redo Buffers 6291456 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> set line 160 SQL> show parameter instance_name; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ instance_name string inst10g SQL> ! [oracle@localhost ~]$ ps -ef | grep ora_ oracle 18333 1 0 15:35 ? 00:00:00 ora_pmon_phydb10g oracle 18335 1 0 15:35 ? 00:00:00 ora_psp0_phydb10g oracle 18337 1 0 15:35 ? 00:00:00 ora_mman_phydb10g oracle 18339 1 0 15:35 ? 00:00:00 ora_dbw0_phydb10g oracle 18341 1 0 15:35 ? 00:00:00 ora_lgwr_phydb10g oracle 18343 1 0 15:35 ? 00:00:00 ora_ckpt_phydb10g oracle 18345 1 0 15:35 ? 00:00:00 ora_smon_phydb10g oracle 18347 1 0 15:35 ? 00:00:00 ora_reco_phydb10g oracle 18349 1 0 15:35 ? 00:00:00 ora_mmon_phydb10g oracle 18351 1 0 15:35 ? 00:00:00 ora_mmnl_phydb10g oracle 18382 18355 0 15:35 pts/2 00:00:00 grep ora_ [oracle@localhost ~]$ export ORACLE_HOME=/u01/app/product/11.2.0/dbhome_1 [oracle@localhost ~]$ env | grep ORA ORACLE_SID=phydb10g ORACLE_BASE=/u01/app ORACLE_TERM=xterm ORACLE_HOME=/u01/app/product/11.2.0/dbhome_1 [oracle@localhost ~]$ cat /u01/app/product/11.2.0/dbhome_1/dbs/initphydb10g.ora *.db_name='GLNDB' *.instance_name='inst11g' [oracle@localhost ~]$ /u01/app/product/11.2.0/dbhome_1/bin/sqlplus /nolog SQL*Plus: Release 11.2.0.1.0 Production on Thu Mar 1 15:37:41 2012 Copyright (c) 1982, 2009, Oracle. All rights reserved. SQL> conn / as sysdba; Connected to an idle instance. SQL> startup ORACLE instance started. Total System Global Area 217157632 bytes Fixed Size 2211928 bytes Variable Size 159387560 bytes Database Buffers 50331648 bytes Redo Buffers 5226496 bytes ORA-00205: error in identifying control file, check alert log for more info SQL> set line 160 SQL> show parameter instance_name; NAME TYPE VALUE ------------------------------------ --------------------------------- ------------------------------ instance_name string inst11g SQL> ! [oracle@localhost ~]$ ps -ef | grep ora_ oracle 18333 1 0 15:35 ? 00:00:00 ora_pmon_phydb10g oracle 18335 1 0 15:35 ? 00:00:00 ora_psp0_phydb10g oracle 18337 1 0 15:35 ? 00:00:00 ora_mman_phydb10g oracle 18339 1 0 15:35 ? 00:00:00 ora_dbw0_phydb10g oracle 18341 1 0 15:35 ? 00:00:00 ora_lgwr_phydb10g oracle 18343 1 0 15:35 ? 00:00:00 ora_ckpt_phydb10g oracle 18345 1 0 15:35 ? 00:00:00 ora_smon_phydb10g oracle 18347 1 0 15:35 ? 00:00:00 ora_reco_phydb10g oracle 18349 1 0 15:35 ? 00:00:00 ora_mmon_phydb10g oracle 18351 1 0 15:35 ? 00:00:00 ora_mmnl_phydb10g oracle 18402 1 0 15:37 ? 00:00:00 ora_pmon_phydb10g oracle 18404 1 0 15:37 ? 00:00:00 ora_vktm_phydb10g oracle 18408 1 0 15:37 ? 00:00:00 ora_gen0_phydb10g oracle 18410 1 0 15:37 ? 00:00:00 ora_diag_phydb10g oracle 18412 1 0 15:37 ? 00:00:00 ora_dbrm_phydb10g oracle 18414 1 0 15:37 ? 00:00:00 ora_psp0_phydb10g oracle 18416 1 0 15:37 ? 00:00:00 ora_dia0_phydb10g oracle 18418 1 0 15:37 ? 00:00:00 ora_mman_phydb10g oracle 18420 1 0 15:37 ? 00:00:00 ora_dbw0_phydb10g oracle 18422 1 0 15:37 ? 00:00:00 ora_lgwr_phydb10g oracle 18424 1 0 15:37 ? 00:00:00 ora_ckpt_phydb10g oracle 18426 1 0 15:37 ? 00:00:00 ora_smon_phydb10g oracle 18428 1 0 15:37 ? 00:00:00 ora_reco_phydb10g oracle 18430 1 0 15:37 ? 00:00:00 ora_mmon_phydb10g oracle 18432 1 0 15:37 ? 00:00:00 ora_mmnl_phydb10g oracle 18470 18441 0 15:38 pts/2 00:00:00 grep ora_ [oracle@localhost ~]$
顺带:我们甚至可以看到下述这些有趣的后台进程。
[oracle@localhost ~]$ ps -ef | grep ora_ oracle 18333 1 0 15:35 ? 00:00:00 ora_pmon_phydb10g oracle 18335 1 0 15:35 ? 00:00:00 ora_psp0_phydb10g oracle 18337 1 0 15:35 ? 00:00:00 ora_mman_phydb10g oracle 18339 1 0 15:35 ? 00:00:00 ora_dbw0_phydb10g oracle 18341 1 0 15:35 ? 00:00:00 ora_lgwr_phydb10g oracle 18343 1 0 15:35 ? 00:00:00 ora_ckpt_phydb10g oracle 18345 1 0 15:35 ? 00:00:00 ora_smon_phydb10g oracle 18347 1 0 15:35 ? 00:00:00 ora_reco_phydb10g oracle 18349 1 0 15:35 ? 00:00:00 ora_mmon_phydb10g oracle 18351 1 0 15:35 ? 00:00:00 ora_mmnl_phydb10g oracle 18402 1 0 15:37 ? 00:00:00 ora_pmon_phydb10g oracle 18404 1 0 15:37 ? 00:00:00 ora_vktm_phydb10g oracle 18408 1 0 15:37 ? 00:00:00 ora_gen0_phydb10g oracle 18410 1 0 15:37 ? 00:00:00 ora_diag_phydb10g oracle 18412 1 0 15:37 ? 00:00:00 ora_dbrm_phydb10g oracle 18414 1 0 15:37 ? 00:00:00 ora_psp0_phydb10g oracle 18416 1 0 15:37 ? 00:00:00 ora_dia0_phydb10g oracle 18418 1 0 15:37 ? 00:00:00 ora_mman_phydb10g oracle 18420 1 0 15:37 ? 00:00:00 ora_dbw0_phydb10g oracle 18422 1 0 15:37 ? 00:00:00 ora_lgwr_phydb10g oracle 18424 1 0 15:37 ? 00:00:00 ora_ckpt_phydb10g oracle 18426 1 0 15:37 ? 00:00:00 ora_smon_phydb10g oracle 18428 1 0 15:37 ? 00:00:00 ora_reco_phydb10g oracle 18430 1 0 15:37 ? 00:00:00 ora_mmon_phydb10g oracle 18432 1 0 15:37 ? 00:00:00 ora_mmnl_phydb10g oracle 18491 1 0 15:41 ? 00:00:00 ora_pmon_phydb11g oracle 18493 1 0 15:41 ? 00:00:00 ora_vktm_phydb11g oracle 18497 1 0 15:41 ? 00:00:00 ora_gen0_phydb11g oracle 18499 1 0 15:41 ? 00:00:00 ora_diag_phydb11g oracle 18501 1 0 15:41 ? 00:00:00 ora_dbrm_phydb11g oracle 18503 1 0 15:41 ? 00:00:00 ora_psp0_phydb11g oracle 18505 1 0 15:41 ? 00:00:00 ora_dia0_phydb11g oracle 18507 1 0 15:41 ? 00:00:00 ora_mman_phydb11g oracle 18509 1 0 15:41 ? 00:00:00 ora_dbw0_phydb11g oracle 18511 1 0 15:41 ? 00:00:00 ora_lgwr_phydb11g oracle 18513 1 0 15:41 ? 00:00:00 ora_ckpt_phydb11g oracle 18515 1 0 15:41 ? 00:00:00 ora_smon_phydb11g oracle 18517 1 0 15:41 ? 00:00:00 ora_reco_phydb11g oracle 18519 1 0 15:41 ? 00:00:00 ora_mmon_phydb11g oracle 18521 1 0 15:41 ? 00:00:00 ora_mmnl_phydb11g oracle 18585 1 0 15:43 ? 00:00:00 ora_pmon_phydb11g oracle 18587 1 0 15:43 ? 00:00:00 ora_psp0_phydb11g oracle 18589 1 0 15:43 ? 00:00:00 ora_mman_phydb11g oracle 18591 1 0 15:43 ? 00:00:00 ora_dbw0_phydb11g oracle 18593 1 0 15:43 ? 00:00:00 ora_lgwr_phydb11g oracle 18595 1 0 15:43 ? 00:00:00 ora_ckpt_phydb11g oracle 18597 1 0 15:43 ? 00:00:00 ora_smon_phydb11g oracle 18599 1 0 15:43 ? 00:00:00 ora_reco_phydb11g oracle 18601 1 0 15:43 ? 00:00:00 ora_mmon_phydb11g oracle 18603 1 0 15:43 ? 00:00:00 ora_mmnl_phydb11g oracle 18633 18606 0 15:43 pts/2 00:00:00 grep ora_ [oracle@localhost ~]$
ORACLE_SID | ORACLE_HOME | INSTANCE_NAME | PFILE | Process ID 范围 |
phydb11g | /u01/app/oracle | inst11g | /u01/app/oracle/initphydb11g.ora | 18585…18603 |
phydb11g | /u01/app/product/11.2.0/dbhome_1 | phydb11g | /u01/app/product/11.2.0/dbhome_1/dbs/initphydb11g.ora |
18491…18521 |
phydb10g | /u01/app/product/11.2.0/dbhome_1 | inst11g | /u01/app/product/11.2.0/dbhome_1/dbs/initphydb10g.ora | 18402…18432 |
phydb10g | /u01/app/oracle | inst10g | /u01/app/oracle/initphydb10g.ora | 18333…18351 |
结论:在UNIX、Linux平台上,相同的ORACLE_HOME下不可以同时运行ORACLE_SID相同的多个实例,不同的ORACLE_HOME下可以同时运行ORACLE_SID相同的多个实例!