文章转自:http://www.blogjava.net/herongxin/archive/2011/05/31/351414.html

【一】对ORACLE_SID的理解


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来启动实例了。

转载于:https://www.cnblogs.com/david-zhang-index/archive/2012/06/11/2545553.html

【转】ORACLE_SID、INSTANCE_NAME、DB_NAME相关推荐

  1. 几个环境变量说明:ORACLE_SID、DB_NAME、INSTANCE_NAME、DB_DOMIAN、GLOBAL_NAMES

    这几天在配置DATAGUARD,进行数据复制时,一直出错,一时找不到原因. 开始以为是LISTENER.ORA的配置问题, 配置如下: SID_LIST_LISTENER =     (SID_LIS ...

  2. oracle中的service_name,instance_name,db_name,oracle_sid,sid_name的用法及区别(转)

    在init.ora中有db_name,instance_name,service_name. 在操作系统中需要配置oracle_sid. 在listener.ora中有SID_NAME,GLOBAL_ ...

  3. export Oracle_sid =asm,单实例下oracle数据库从文件系统迁移到ASM上

    第一步:启动ASM实例(+ASM) [oracle@oracle ~]$ export ORACLE_SID=+ASM [oracle@oracle ~]$ sqlplus / as sysdba S ...

  4. Oracle单实例下oracle数据库从文件系统迁移到ASM上

    第一步:启动ASM实例(+ASM) [oracle@oracle ~]$ export ORACLE_SID=+ASM [oracle@oracle ~]$ sqlplus / as sysdba S ...

  5. 使用RMAN创建复制数据库

    我的实验环境: - 源数据库A机: RHEL6.4 + Oracle 11.2.0.4 IP地址:192.168.99.159 db_name=oradb 数据库已正常运行- 复制数据库B机: RHE ...

  6. oracle进入rman报错,Oracle 11g单实例RMAN恢复到Oracle 11g RAC

    一.环境说明 操作系统版本: RHEL 6.5 x64 1. 源数据库服务器 Oracle版本: Oracle 11g 11.2.0.4 64位(单机) Oracle_SID: orcl db_nam ...

  7. 使用RMAN迁移文件系统数据库到ASM

    --================================== -- 使用RMAN迁移文件系统数据库到ASM --================================== 在实际 ...

  8. 手动删除oracle数据库

    --===================== -- 手动删除oracle数据库 --===================== 在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库. ...

  9. 基于Linux下 Oracle 备份策略(RMAN)---转自沙弥的世界

    --********************************** -- 基于Linux下 Oracle 备份策略(RMAN) --******************************* ...

  10. 使用RMAN实现异机备份恢复(WIN平台)

    --================================= -- 使用RMAN实现异机备份恢复(WIN平台) --================================= 在有些 ...

最新文章

  1. 2、程序包 Packages
  2. 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )
  3. 性能测试-Gatling(一)
  4. python tempfile自动删除_Python tempfile模块生成临时文件和临时目录
  5. Redis系列三、redis的五种数据结构和相关指令之Hash
  6. v8声卡怎么录制唱歌_V8声卡坑爹?想买的看完再决定,买了的看如何调试声卡...
  7. 现共收到 5 个分组,其目的地址分别为: (1) 128.96.40.10 (2) 128.96.41.12 (3) 128.96.41.151 (4) 192.4.123.17 (5) 192.4.
  8. vue动态设置文字布局方式_十大惊人的文字动画特效
  9. 从401航班事故调查看项目总结
  10. java doprivileged_【转】关于AccessController.doPrivileged
  11. shell解析html文件,[Shell] Shell 生成 HTML脚本,可显示表格
  12. 博客园在我的博客添加点击小心心特效
  13. spring boot中问题总结
  14. php array函数 array_keys返回数组的键值
  15. Excel-利用函数获取工作表标签名称(转)
  16. 如果禅道忘记了管理员密码怎么拯救
  17. request + bs4 爬取网易云音乐热门评论
  18. Mac DataGrip 闪退问题
  19. 京东Java岗:来自面试官的夺命连环56问,直接当场怀疑人生~
  20. Echarts3实例 map地图选中高亮显示

热门文章

  1. edge android apk下载地址,edge app下载-edge完整版v7.2.0 安卓版 - 极光下载站
  2. utf-8、unicode区别与联系
  3. onvif备忘录(1)--onvif简介及开发框架搭建
  4. 盘点一下结构体标签在Go中的应用
  5. Laravel最佳实践--API请求频率限制(Throttle中间件)
  6. OAuth2.0授权协议与客户端授权码模式详解
  7. Eclipse Java Build Path详解
  8. java 多态,接口,抽象类的认识
  9. JavaEE Tutorials (13) - 使用锁定控制对实体数据的并发访问
  10. Centos 5 手动安装yum