Oracle中SID的作用类似于一个“开关变量”---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例。 我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,从9i开始就默认使用spfile--即服务器端参数文件,两者的不同请参考《Oracle 10g Concept》手册,关键在于修改其中参数后是否会自动持久化)。这两个文件的存放位置为:
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文件,如果还是找不到则实例无法启动。下面我们来看看这些文件的内容(以Oracle 10g为例)
A.spfile<ORACLE_SID>.ora:
B.init<ORACLE_SID>.ora
我们看到spfile<ORACLE_SID>.ora文件的内容就是我们创建数据库时在DBCA中填写的参数,而init<ORACLE_SID>.ora文件的内容则指向了该spfile,所以不论如何都是从spfile来启动实例了
分享到:
相关推荐
修改 Oracle_sid 和 db_name 名字 在 Oracle 数据库中,sid 和 db_name 是两个非常重要的参数,分别表示数据库实例名和数据库名字。修改这两个参数需要谨慎,因为它们对数据库的运行和性能有着直接的影响。在本文中...
Oracle DB_NAME, INSTANCE_NAME, ORACLE_SID 区别 Oracle 中有三个重要的概念:DB_NAME、INSTANCE_NAME 和 ORACLE_SID,它们都是 Oracle 数据库的重要组成部分,了解它们的区别和作用非常重要。 DB_NAME DB_NAME ...
### ORACLE_SID与ORACLE_HOME环境变量详解 #### 一、引言 在UNIX/Linux平台上部署Oracle数据库时,经常会遇到两个重要的环境变量:`ORACLE_SID`与`ORACLE_HOME`。这两个变量对于数据库的正常运行至关重要。本文将...
### Oracle 10G 数据库名、实例名、ORACLE_SID 及创建数据库详解 #### 一、数据库名 **1.1 定义** 数据库名是用于唯一标识一个数据库的名称,它就像是一个人的身份证号码,对于每一套安装在机器上的数据库来说都是...
ORACLE_SID、实例名、数据库名、数据库域名、全局数据库名、服务名 数据库名是指一个数据库的标识,类似于人的身份证号,用于标识一个数据库。它由参数 DB_NAME 表示,在数据库安装或创建完成之后,参数 DB_NAME 被...
### ORACLE_SID与数据库名称概念解析 #### 一、数据库名称(Database Name) 数据库名称是Oracle数据库的一个核心概念,它代表了一个数据库的唯一标识符,类似于人的身份证号码。数据库名称通常由用户在创建数据库...
### 详解数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名 在深入了解Oracle数据库的管理及维护过程中,理解数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名和服务名等核心概念至关重要。...
详解_数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
- `ORACLE_SID`:指定Oracle服务名。 - `ORACLE_UNQNAME`:数据库的唯一名称。 #### 四、解决方案 ##### 1. 设置`ORACLE_UNQNAME` - **方法一**:直接在命令行中设置临时环境变量。 ```bash export ORACLE_...
1 、确定数据库的sid 和db_name \u3000sid='hsj' db_name='hsj' 2、设置环境变量env ORACLE_BASE=/u01/app ... export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH LD_LIBRARY_PATH 3、设置登录方法
在系统和用户环境变量中,删除与Oracle相关的路径,如`ORACLE_HOME`、`ORACLE_SID`等。 8. **重启系统**: 完成上述步骤后,重启计算机,确保所有Oracle相关的进程已被完全关闭。 9. **检查残留文件**: 最后,...
Oracle 中的全局数据库名称和 SID 的区别 Oracle 中的全局数据库名称和SID是两个不同的概念,分别用于标识数据库和实例。数据库名(DB_NAME)是用于区分数据的内部标识,是以二进制方式存储于数据库控制文件中的...
这些变量包括 ORACLE_SID、ORACLE_UNQNAME、ORACLE_BASE、ORACLE_HOME 等。例如,需要使用以下命令来设置 ORACLE_SID 变量: export ORACLE_SID=xxx 六、依赖包检查 在安装 Oracle 19c 之前,需要检查依赖包是否...
在Oracle数据库中,SID(System Identifier)是数据库实例的标识符,它代表了一个特定运行中的Oracle数据库实例。 1. 数据定义语言(DDL):DDL用于创建、修改和删除数据库对象,如表。常见的DDL命令有`CREATE ...
- 在命令行窗口中设置ORACLE_SID环境变量,例如:`SET ORACLE_SID=ORCL`(这里的`ORCL`应该替换为您实际使用的数据库SID)。 - 停止dbconsole服务:`emctl stop dbconsole` - 启动dbconsole服务:`emctl start ...
- 修改`.bash_profile`文件,设置Oracle的相关环境变量,包括`ORACLE_BASE`, `ORACLE_HOME`, `ORA_CRS_HOME`, `ORACLE_PATH`, `ORACLE_SID`等。 ```bash export ORACLE_BASE=/home/oracle export ORACLE_HOME=$...
PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin\nexport CV_JDKHOME=/usr/local/java\n# Each RAC node must have a unique ORACLE_SID. (i.e. his1, his2, )\nexport ORACLE_SID=his1" > /home/...
export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH LD_LIBRARY_PATH CLASSPATH ``` #### 安装过程 1. **复制安装包到Linux中** - 使用Xmanager或其他FTP工具将Oracle安装包复制到Linux系统中。 - 解压Oracle...
export ORACLE_SID LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH PATH=$ORACLE_HOME/bin:$PATH; export PATH ``` 然后,运行`source /u01/app/oracle/.bash_profile`以应用这些更改。 ...