db-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 1774473
  • 博文数量: 413
  • 博客积分: 8399
  • 博客等级: 中将
  • 技术积分: 4325
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-09 10:44
文章分类

全部博文(413)

文章存档

2015年(1)

2014年(18)

2013年(39)

2012年(163)

2011年(192)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: oracle

2012-11-01 15:20:14

在oracle中,我们会遇到下面一系列的十分重要的参数。同时他们的含义也常常让我们混淆。这些参数有:
oracle_sid, sid, instance_name, service_name, services_names, db_name, global_dbname, sid_name,以及网络服务名(net service name),实例服务名(instance service name)等。下面我一个一个的来学习他们。

1. oracle_sid sid instance_name 以及 sid_name
oracle_sid:即oracle system identifier,它是一个环境变量。我们一般在oracle用户的home目录中的.bash_profile中进行定义,一般该文件包含下面一行:
[oracle@localhost ~]$ pwd
/home/oracle
[oracle@localhost ~]$ grep oracle_sid .bash_profile
export oracle_sid=jiagulun
其作用就是:
在我们使用在sqlplus工具中startup启动数据库时,os就是利用这个环境变量来fork创建构成oracle实例的各个进程,以及来命名一些文件的名字。如下所示:
[oracle@localhost ~]$ ps -ef | grep oracle
oracle   31707     1  0 13:41 ?        00:00:01 ora_pmon_jiagulun
oracle   31709     1  0 13:41 ?        00:00:00 ora_psp0_jiagulun
oracle   31711     1  0 13:41 ?        00:00:00 ora_mman_jiagulun
oracle   31713     1  0 13:41 ?        00:00:02 ora_dbw0_jiagulun
oracle   31715     1  0 13:42 ?        00:00:02 ora_lgwr_jiagulun
oracle   31717     1  0 13:42 ?        00:00:05 ora_ckpt_jiagulun
oracle   31719     1  0 13:42 ?        00:00:03 ora_smon_jiagulun
oracle   31721     1  0 13:42 ?        00:00:00 ora_reco_jiagulun
oracle   31723     1  0 13:42 ?        00:00:02 ora_cjq0_jiagulun
oracle   31725     1  0 13:42 ?        00:00:04 ora_mmon_jiagulun
oracle   31727     1  0 13:42 ?        00:00:01 ora_mmnl_jiagulun
oracle   31729     1  0 13:42 ?        00:00:00 ora_d000_jiagulun
oracle   31731     1  0 13:42 ?        00:00:00 ora_s000_jiagulun
oracle   31733 31704  0 13:42 ?        00:00:00 oraclejiagulun (description=(local=yes)(address=(protocol=beq)))
racle   31929     1  0 14:48 ?        00:00:00 ora_arc0_jiagulun
oracle   31931     1  0 14:48 ?        00:00:00 ora_arc1_jiagulun
oracle   31935     1  0 14:48 ?        00:00:00 ora_qmnc_jiagulun
oracle   31937     1  0 14:48 ?        00:00:01 ora_q000_jiagulun
oracle   31939     1  0 14:48 ?        00:00:00 ora_q001_jiagulun
oracle   32108     1  1 15:42 ?        00:00:00 ora_j000_jiagulun

[oracle@redhat4 bdump]$ pwd
/u01/app/oracle/admin/jiagulun/bdump
[oracle@redhat4 bdump]$ ls -l alert_jiagulun.log
-rw-r-----  1 oracle oinstall 305534 nov  2 14:01 alert_jiagulun.log

[oracle@redhat4 dbs]$ pwd
/u01/app/oracle/product/10.2.0/db_1/dbs
[oracle@redhat4 dbs]$ ls -l
total 108
-rw-rw----  1 oracle oinstall  1544 aug 31 13:08 hc_jiagulun.dat
-rw-rw----  1 oracle oinstall  1544 nov  1 17:07 hc_julia.dat
-rw-r-----  1 oracle oinstall 12920 may  3  2001 initdw.ora
-rw-r--r--  1 oracle oinstall  1283 nov  2 11:33 initjiagulun.ora
-rw-r--r--  1 oracle oinstall    14 nov  1 17:07 initjulia.ora
-rw-r-----  1 oracle oinstall  8385 sep 12  1998 init.ora
-rw-rw----  1 oracle oinstall    24 aug 31 13:10 lkjiagulun
-rw-rw----  1 oracle oinstall    24 nov  1 17:08 lkjulia
-rw-r-----  1 oracle oinstall  1536 oct 25 09:43 orapwjiagulun
-rw-r-----  1 oracle oinstall  3584 nov  2 14:01 spfilejiagulun.ora
-rw-r-----  1 oracle oinstall  3584 oct  3 22:17 spfilejiagulun.ora.backup

下面的命令的执行必须要有环境变量oracle_sid:
sql> startup

那么我们的环境变量oracle_sid应该设置成什么值呢?
应该是:我们想要startup哪个oracle实例,就应该将oracle_sid设置成哪个实例的sid
下面我们看看sid,在我们用dbca创建数据库时,会出现下面的gui让我们选择:

第一参数,就是要我们设置一个db_name来唯一地标识数据库
第二个参数,要我们设置一个sid来唯一地标识一个oracle实例
我们知道oracle server由oracle实例和oracle数据库两者共同组成。

所以:
1)很显然地,我们想要startup哪个oracle实例,就应该将环境变量oracle_sid设置成哪个sid
2)sid唯一地标识一个oracle实例,而oracle_sid启动该实例,启动之后我们得到一个oracle实例,这个实例有一个名字:instance_namesid==>>oracle_sid==>>instance_name这三者是一致的,是完全相同的
3)同时这个实例向外提供服务,所以又有一个service_name。

而sid_name出现在lisnter.ora文件中:
[oracle@redhat4 admin]$ cat listener.ora
# listener.ora network configuration file: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# generated by oracle configuration tools.

sid_list_listener =
  (sid_list =
    (sid_desc =
      (sid_name = pl***tproc)
      (oracle_home = /u01/app/oracle/product/10.2.0/db_1)
      (program = extproc)
    )
    (sid_desc =
      (sid_name = jiagulun)
      (oracle_home = /u01/app/oracle/product/10.2.0/db_1)
      (global_dbname = jiagulun)
    )
  )

listener =
  (description_list =
    (description =
      (address = (protocol = tcp)(host = redhat4)(port = 1521))
      (address = (protocol = ipc)(key = extproc0))
    )
  )
lisnter.ora中的sid_name的值必须与sid的值一致。通过lisnter.ora中的sid_name和global_dbname两个参数以及客户端的tnsnames.ora中的service_name,这三个参数一起作用,可以实现oracle客户端与服务端的隔离。
[oracle@redhat4 admin]$ cat tnsnames.ora
# tnsnames.ora network configuration file: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# generated by oracle configuration tools.

jiagulun =
  (description =
    (address_list =
      (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
    )
    (connect_data =
      (service_name = jiagulun)
    )
  )

extproc_connection_data =
  (description =
    (address_list =
      (address = (protocol = ipc)(key = extproc0))
    )
    (connect_data =
      (sid = pl***tproc)
      (presentation = ro)
    )
  )

客户端根据tnsname.ora中的service_name和地址(address = (protocol = tcp)(host = 192.168.0.100)(port = 1521)),到这个地址去访问监听器。然后监听器根据文件lisnter.ora文件中的global_name来判断是否有一个 global_dbname 和 service_name 相等。如果相等,则建立客户端到sid标识的服务端实例的连接。(有一个例外:tnsnames.ora中可以用参数sid来取代service_name,这时比较的是tnsnames.ora中的sid和lisnter.ora中的sid_name,但是从oracle9i开始不推荐使用sid。因为sid无法隔离客户端和服务端)

tnsnames.ora中的地址(address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))是监听器监听的地址。监听器进程一直在这个地址上监听,等待客户端的连接。

总结一下
1)客户端和服务端的隔离是通过lisnter.ora中的global_dbname来实现的,global_dbname是一个连接客户端和服务端的桥梁:
a>client端tnsnames.ora中的service_name和server端lisnter.ora中的global_dbname相等;
b>server端的lisnter.ora中的sid_name与系统的sid相等;
2)sid==>>sid_name==>>oracle_sid==>>instance_name 四者是一致的,相等的;
3)可以在lisnter.ora中配置多个不同的global_name来供不同的客户端service_name来对应,从而实现不同的客户端使用不同的service_name来访问同一个sid实例使用,配置如下:
lisnter.ora:
    (sid_desc =
      (sid_name = jiagulun)
      (oracle_home = /u01/app/oracle/product/10.2.0/db_1)
      (global_dbname = jiagulun)
    )
    (sid_desc =
      (sid_name = jiagulun)
      (oracle_home = /u01/app/oracle/product/10.2.0/db_1)
      (global_dbname = jgl)
    )

tnsnames.ora:
jiagulun =
  (description =
    (address_list =
      (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
    )
    (connect_data =
      (service_name = jiagulun)
    )
  )

jgl =
  (description =
     (address_list =
        (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
     )
     (connect_data =
        (service_name = jgl)
     )
  )
同时设置一下参数service_names(不进行该项设置似乎也可以,无关紧要)
sql> show parameter service
name                                 type        value
------------------------------------ ----------- ------------------------------
service_names                        string      jiagulun
sql> alter system set service_names = 'jiagulun,jgl' scope=both;
system altered.
sql> show parameter service
name                                 type        value
------------------------------------ ----------- ------------------------------
service_names                        string      jiagulun,jgl
sql>

测试:
[oracle@redhat4 admin]$ tnsping jiagulun
tns ping utility for linux: version 10.2.0.1.0 - production on 01-nov-2012 20:12:22
凯发app官方网站 copyright (c) 1997, 2005, oracle.  all rights reserved.
used parameter files:
used tnsnames adapter to resolve the alias
attempting to contact (description = (address_list = (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))) (connect_data = (service_name = jiagulun)))
ok (0 msec)

[oracle@redhat4 admin]$ tnsping jgl
tns ping utility for linux: version 10.2.0.1.0 - production on 01-nov-2012 20:12:27
凯发app官方网站 copyright (c) 1997, 2005, oracle.  all rights reserved.
used parameter files:
used tnsnames adapter to resolve the alias
attempting to contact (description = (address_list = (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))) (connect_data = (service_name = jgl)))
ok (10 msec)
[oracle@redhat4 admin]$
现在我们在客户端既可以使用service_name=jiagulun来访问服务端,也可以使用service_name=jgl来访问。使用plsql develop用jgl和jiagulun都可以正常登陆。

2. sid 与 db_name
显然,db_name唯一性地标识了 oracle database,与数据库物理文件相关;而sid唯一性地标识了oracle instance,与所有进程相关。而oracle database和oracle instance一起组成了oracle server. sid和db_name在非rac环境默认是相等的。但是二者相等与否,无关紧要。在rac环境,因为一个db_name对应多个sid,所以不可能相等了。

db_name是最重要的一个参数,在dbca中填写的db_name,应该与启动参数文件pfile/spfile中的一致。在dbca中创建数据库时填写db_name被写入到了多个地方:启动参数文件、控制文件、数据文件、日志文件
所以我们不能随便地修改启动参数文件中的db_name参数:
sys@jiagulun> create pfile from spfile;
file created.

sys@jiagulun> exit
disconnected from oracle database 10g enterprise edition release 10.2.0.1.0 - production
with the partitioning, olap and data mining options
[oracle@redhat4 oradata]$ grep db_name /u01/app/oracle/product/10.2.0/db_1/dbs/initjiagulun.ora
*.db_name='jiagulun'
[oracle@redhat4 oradata]$

如果启动参数文件中的db_name与控制文件中的不一致,则在mount阶段会报错

3. service_name 与 service_names
service_name是oracle实例提供的服务名。它隔离了oracle实例,客户端仅仅需要知道service_name就可以访问实例。而不需要知道实例的sid。更不需要知道db_name等信息。
service_names为实例定义一个或多个service_name,这样可以通过多个service_name将不同的用户连接区分开来。

service name似乎应该分为两种,一种是实例服务名 instance service name,一种是网络服务名 net service name,如下tnsnames.ora所示:

net_service_name =
  (description =
     (address_list =
        (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
     )
     (connect_data =
        (service_name = instance_service_name)
     )
  )

而plsql develop登陆使用的是net_service_name,而不是instance_service_name。
而tnsping 测试的也是net_service_name,而不是instance_service_name。
[oracle@redhat4 admin]$ cat tnsnames.ora
# tnsnames.ora network configuration file: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# generated by oracle configuration tools.

jiagulun =
  (description =
    (address_list =
      (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
    )
    (connect_data =
      (service_name = jiagulun)
    )
  )

net_jgl =
  (description =
     (address_list =
        (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))
     )
     (connect_data =
        (service_name = jgl)
     )
  )

extproc_connection_data =
  (description =
    (address_list =
      (address = (protocol = ipc)(key = extproc0))
    )
    (connect_data =
      (sid = pl***tproc)
      (presentation = ro)
    )
  )

[oracle@redhat4 admin]$ tnsping net_jgl
tns ping utility for linux: version 10.2.0.1.0 - production on 02-nov-2012 14:01:55
凯发app官方网站 copyright (c) 1997, 2005, oracle.  all rights reserved.
used parameter files:

used tnsnames adapter to resolve the alias
attempting to contact (description = (address_list = (address = (protocol = tcp)(host = 192.168.0.100)(port = 1521))) (connect_data = (service_name = jgl)))
ok (10 msec)
[oracle@redhat4 admin]$ tnsping jgl
tns ping utility for linux: version 10.2.0.1.0 - production on 02-nov-2012 14:01:59
凯发app官方网站 copyright (c) 1997, 2005, oracle.  all rights reserved.
used parameter files:
tns-03505: failed to resolve name
[oracle@redhat4 admin]$

如上所示:当我们使用 tnsping instance_service_name是失败了。
而 sqlplus scott/tiger@net_jgl 使用的也是net_service_name.

所以 tnsping, sqlplus user/passwd@net_jgl, plsql develop使用的都是net_service_name,而不是instance_service_name.

[oracle@redhat4 admin]$ sqlplus scott/tiger@net_jgl
sql*plus: release 10.2.0.1.0 - production on thu nov 1 21:08:48 2012
凯发app官方网站 copyright (c) 1982, 2005, oracle.  all rights reserved.
connected to:
oracle database 10g enterprise edition release 10.2.0.1.0 - production
with the partitioning, olap and data mining options

[oracle@redhat4 admin]$ sqlplus scott/tiger@jgl
sql*plus: release 10.2.0.1.0 - production on fri nov 2 14:05:57 2012
凯发app官方网站 copyright (c) 1982, 2005, oracle.  all rights reserved.
error:
ora-12154: tns:could not resolve the connect identifier specified

所以这里提供了多层的隔离
net_service_name ==>> instance_service_name ==>> global_dbname ==>> sid_name ==>> sid
  (sid_name=sid=oracle_sid=instance_name)
1> tnsnames.ora中定义了net_service_name和instance_service_name的对应,或者说隔离。
2> lisnter.ora中定义了global_dbname和sid的对应,或者说隔离;
3> 而tnsnames.ora中的instance_service_name(service_name)又和lisnter.ora中的global_dbname相等。将两层隔离连接起来。

阅读(15213) | 评论(0) | 转发(4) |
0

上一篇:oracle中的锁概述

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图