ORACLE_SID, SID, INSTANCE_NAME, SERVICE_NAME, SERVICES_NAMES, DB_NAME, GLOBAL_DBNAME, SID_NAME迷糊了吗?

概念

【一】对ORACLE_SID的理解

--------------------------------------------------------------------------------

Oracle中SID的作用类似于一个“开关变量”---引导Oracle在实例启动时如何去默认位置下读取适当的参数文件并加载,以正确启动实例。

我们知道实例的启动需要指定pfile/spfile(Oracle9i之前是使用pfile--即init文件,从9i开始就默认使用spfile--即服务器端参数文件这两个文件的存放位置为:

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文件,如果还是找不到则实例无法启动。

 

测试

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  214: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 3113:08 hc_jiagulun.dat

-rw-rw----  1 oracle oinstall  1544 Nov  117:07 hc_julia.dat

-rw-r-----  1 oracle oinstall 12920 May  3 2001 initdw.ora

-rw-r--r--  1 oracle oinstall  1283 Nov  211: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 3113:10 lkJIAGULUN

-rw-rw----  1 oracle oinstall    24 Nov 1 17:08 lkJULIA

-rw-r-----  1 oracle oinstall  1536 Oct 2509:43 orapwjiagulun

-rw-r-----  1 oracle oinstall  3584 Nov  214:01 spfilejiagulun.ora

-rw-r-----  1 oracle oinstall  3584 Oct  322: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_NAME。SID==>>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相等;

2SID==>>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]$ tnspingjiagulun

TNS Ping Utility for Linux: Version 10.2.0.1.0 -Production on 01-NOV-2012 20:12:22

Copyright (c) 1997, 2005, Oracle.  All rightsreserved.

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]$ tnspingjgl

TNS Ping Utility for Linux: Version 10.2.0.1.0 -Production on 01-NOV-2012 20:12:27

Copyright (c) 1997, 2005, Oracle.  All rightsreserved.

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 EditionRelease 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 servicename,如下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

Copyright (c) 1997, 2005, Oracle.  All rightsreserved.

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

Copyright (c) 1997, 2005, Oracle.  All rightsreserved.

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 121:08:48 2012

Copyright (c) 1982, 2005, Oracle.  All rightsreserved.

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 214:05:57 2012

Copyright (c) 1982, 2005, Oracle.  All rightsreserved.

ERROR:

ORA-12154: TNS:could not resolve the connect identifierspecified

 

所以这里提供了多层的隔离

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相等。将两层隔离连接起来。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值