免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1916 | 回复: 3
打印 上一主题 下一主题

Instance_name 的作用和疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-09 18:23 |只看该作者 |倒序浏览
Instance_name 的作用

今天看了一本oracle 的书,突然堆instance_name的概念又糊涂起来

书上的意思是
一个unix操作系统上,可以有装两个Oracle数据库软件,并且ORACLE_SID都是一个名称,例如都是AAA

书上没有证明说怎么去安装两个Oracle数据库软件,但是肯定是在不同用户下安装

但是按照平时理解,转贴这段

"
三、操作系统环境变量(ORACLE_SID)
  在实际中,对于数据库实例名的描述有时使用实例名(instance_name)参数,有时使用ORACLE_SID参数。这两个都是数据库实例名,它们有什么区别呢?(经常弄混)
  代码:
  
     (ORACLE_SID)
  OS<----------------> ORACLE 数据库 <--------(Instance_name(实例名))
  
  上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到,而ORACLE_SID参数则是操作系统环境变量。
  操作系统环境变量ORACLE_SID用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME等用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文件的名称。如:
  $ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。
  定义方法:
  代码:
  
  export ORACLE_SID=orcl
  
  如果在同一服务器中创建了多个数据库,则必然同时存在多个数据库实例,这时可以重复上述定义过程,以选择不同实例。
"

即SID是用来操作系统和数据库来交互的,更专业的说法是 操作系统fork的进程根据ORACLE_SID来建立的.
这就问题来了 ,可是书上明明写着,可以同时启动两个ORACLE_SID重名的实例哦.
这不是矛盾吗?

fork的时候是否还把用户也作为了一个关键字,然后再加上ORACLE_SID,这样就区分了不同的ORACLE实例进程

  
只是我的疑问是
  
  jdbcracle:thin10.71.139.51:1521:ttt
  
  即使用 java的jdbc连接的时候,这个tttt是$ORACLE_SID还是instance_name
  
  如果是$ORACLE_SID???



另外,Instance_name 似乎也有些多余(这个理解我应当不正确)

再ZT一段
"
数据库实例名则用于和操作系统之间的联系,用于对外部连接时使用。
在操作系统中要取得与数据库之间的交互,必须使用数据库实例名。
例如,要和某一个数据库server连接,就必须知道其数据库实例名,
只知道数据库名是没有用的,与数据库名不同,
在数据安装或创建数据库之后,实例名可以被修改。数据库安装完成后,
该实例名被写入数据库参数文件pfile中,格式如下:
代码:
  
  db_name="orcl"    #(不允许修改)
  db_domain=dbcenter.toys.com
  instance_name=orcl #(可以修改,可以与db_name相同也可不同)
  service_names=orcl.dbcenter.toys.com
  control_file=(...............
  .........
  
  数据库名与实例名之间的关系。
  数据库名与实例名之间的关系一般是一一对应关系,有一个数据库名就有一个实例名,如果在一个服务器中创建两个数据库,则有两个数据库名,两个数据库实例名,用两个标识确定一个数据库,用户和实例相连接。
  但在8i、9i的并行服务器结构中,数据库与实例之间不存在一一对应关系,而是一对多关系,(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安全运行。)

"

其实操作系统通过SID就能找到对应实例了,可是现在还要一个实例名

按照那本书上的说法

在 lisener.ora这个文件中
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = aaa
      (ORACLE_HOME = /opt/oracle/oracle/product/10.2.0/db_1)
      (PROGRAM = extproc)
    )
  )
  
  这个SID_NAME是instance_name,不是$ORACLE_SID,而我一直认为是$ORACLE_SID
  
  因为我当初的理解是监听器应当监听进程啊,不应当是实例啊

  
  那么我总结一下 用户访问Oracle数据库的过程
  
  远端用户 从先访问Oracle所在主机,需要IP;然后再访问ORACLE进程,通过$ORACLE_SID,然后在访问对应的实例,通过instance_name
  ,最后访问数据库,通过db_name

  
  这样理解对吗?大虾指较啊?

论坛徽章:
0
2 [报告]
发表于 2008-08-10 17:59 |只看该作者
1个机器上可以同时运行2个相同sid的数据库实例, 但是这两个实例不能使用同一个ORACLE_HOME, 因为oracle使用sid和ORACLE_HOME的组合来标示一个运行中的实例.

2 操作系统环境变量ORACLE_SID一般情况下和初始化参数instance_name保持一致, 如果不设置instance_name, 则他的值为ORACLE_SID, 但是也可以不一致, oracle向listener注册时使用的是instance_name.

3  java的jdbc连接的时候,使用的是instance_name, 因为jdbc要通过listener 连接的数据库, 而listener只知道instance_name.

4 listener会监听主机上的一个端口, 除非做特殊的配置, 否则他不会主动的监听任何实例. 实例启动后会向本地的1521或者locale_listener中配置的地址注册service, 而注册的依据就是instance_name, 当listener收到要求连接到特定service或instance_name的请求后, 就把这个请求转给注册这个service或instance_name的实例, 然后这个实例启动特定的进程为这个连接服务. 整个过程中不涉及ORACLE_SID环境变量.

5 访问数据库通过service或者instance_name, 不需要db_name, db_name用来唯一标示数据库, 和访问无关.


通常情况下, ORACLE_SID和instance_name是一致的, 所以这两者常常会被不加区分的使用.

[ 本帖最后由 blue_stone 于 2008-8-10 18:09 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-08-10 19:54 |只看该作者
版主解释得非常好

论坛徽章:
0
4 [报告]
发表于 2008-08-11 14:06 |只看该作者
斑竹真是达人啊
昨天我把ORACLE_SID配错了,ORACLE都启动不了啊,修改好了之后,果然就OK
可见这也是初始化参数要为
init$ORACLE_SID或spfile$ORACLE_SID的原因

操作系统是通过ORACLE_SID来找到Oracle软件并启动它的

而instance_name其实是在Oracle已经启动后用的
用来接收从其他地点发送来的连接,所以监听器监听的就是这个instance_name
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP