在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 init
jiagulun.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 orapw
jiagulun
-rw-r----- 1 oracle oinstall 3584 Nov 2 14:01 spfile
jiagulun.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_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相等;
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
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
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
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
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
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
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相等。将两层隔离连接起来。
1.ORACLE_SID:(ORACLE SYSTEM IDENTIFIER)站点标示符
以环境变量的形式出现的。
Oracle实例是由SGA和一组后台进程组成的,实例的创建和启动需要一个参数文件,而参 数文件的名称就是由ORACLE_SID决定的。对于init文件,缺省的文件名称是init.ora,对于 spfile文件,缺省的文件名称是spfile.ora
设置不同的ORACLE_SID值,就可以默认使用不同的参数文件启动不同的数据库实例。
另外,ORACLE_SID的作用远远不是作为一个实例入口这么简单的,在实例启动后,实例名称INSTANCE_NAME也是从ORACLE_SID得到的。
2.INSTANCE_NAME:
实例名称,这是Oracle实例的名字,用来区分不同的实例。在Oracle9i之前,该名字存储在两个地方:参数文件和数据库的内部视图(V$INSTANCE).
而在Oracle10g之后的版本中,该名字不再出现在参数文件中,而是动态从系统中获得,默认是取自ORACLE_SID。
INSTANCE_NAME的作用除了区别不同实例之外,在监听器动态注册时,还会用于向监听器注册。比如instance_name=wolf,监听中将动态注册Instance "wolf",status READY信息。
3.DB_NAME:
DB_NAME概念相比于INSTANCE_NAME要重要的多,它决定实例将挂在的数据文件。它出现在数据文件,控制文件,日志文件中。在参数文件中也出现,且必须出现。这个参数涉及到系统的物理文件。
4.SERVICE_NAME和GLOBAL_DBNAME:
这两个参数之所以放在一起讲,是因为他们往往是成对出现的。SERVICE_NAME出现在Tnsnames.ora文件中,是客户端要请求的服务名。
GLOBAL_DBNAME 出现在Listener.ora文件中,是服务器提供的服务名,可以通过show paramerer service_names查看,并可以通过alter system set service_name='servicename' scope=both来修改。
SERVICE_NAMES为实例所连接的数据库定义一个或多个服务名,可以通过定义多个服务名将不同用户连接区分开来。这个参数的缺省格式为:DB_NAME.DB_DOMAIN,如果定义了DB_DOMAIN那么定义的服务名就类似:
SERVICE_NAMES = sales.eygle.com, news.eygle.com
通过这样的定义,销售用户可以通过在客户端TNSNAME定义中使用SALES服务名来建
立连接,而新闻用户则可以通过NEWS服务名进行连接,最终用户可以不必关注数据库是哪
一个,他们只需要关心服务名。
二者对应,实现了Listerner.ora/Tnsnames.ora的重要功能----监听、请求与验证。
总结:一条startup命令,究竟是如何启动庞大的oracle数据库的呢?下面我们来贯穿起来整个启动流程,一探究竟:
首先,系统接收到startup命令,立刻采取行动,取得环境变量ORACLE_SID的值,启动第一阶段--实例创建。系统根据找到的参数文件启动 ORACLE数据库实例,实例启动后,一切由实例接管:注册INSTANCE_NAME,往往INSTANCE_NAME就是来自ORACLE_SID, 接着向监听器动态注册实例自己,并将INSTANCE_NAME写入系统数据字典表,
接下来,实例进一步读取参数文件,取得DB_NAME、控制文件、检查点等信息,进入第二阶段--挂载数据库。实例从控制文件中取得DB_NAME,并取 得数据文件、日志文件等信息,进行DB_NAME的一致性检验、文件的存在性判断等工作之后,实例将挂载数据库,挂载的数据库就是DB_NAME指定的数 据库。
最后,实例进入第三阶段--启动数据库。这一阶段,实例进行了两项检查:检查点和更改点检查,之后启动数据库。
init.ora 中的instance_name是可以设置的,这个大家都知道是没有错误的,但是这个和我们ORACLE_SID又有什么区别呢?其实还是有一些区别 的,ORACLE_SID就是系统表示符,这个环境变量就是要告诉OS,我要读取那个init.ora文件或者spfile来启动我的Oracle instance,比如set ORACLE_SID=mylife,这个时候当我连入Oracle后,运行startup,那么Oracle就会寻找spfilemylife.ora 或者initmylife.ora这样的参数文件,并启动我的instance,在数据库成 功open后,我们可以通过select instance_name from v$instance来观察这个已经记录的SID,这个时候我们也可以show parameter instance_name来观察这个值,没错都是mylife,一般来讲,我们启动instance所加载的pfile或者spfile中也记录了一个 instance_name这个参数,但是这个参数一般没有显示的列出,因此我们可以手动的去加上这个参数或者修改这个参数,把这个参数的值改为和 mylife不相同的一个值mylove,这个时候再重新启动数据库,会发现show parameter和select instance_name from v$instance的方式有两个不同的值分别是mylove和mylife,如果我们的tnsnames.ora中的文件是以sid方式来寻找服务,那 么这个sid 的值就不是mylife了,而要改为mylove.恩,大体上就是这个意思。还没有深入研究太多,对于大多数用户来讲,理解这些就足够了。
再 说一下service_name,如果我们的参数文件中记录了db_domain比如是cn.ibm.com,那么service_name默认就是 db_name+db_domain,但是我们完全可以修改这个值,原先数据库的service_name=icmnlsdb.cn.ibm.com,现 在比如我在pfile中显示的指定service_names=abc,重启database后,这个service_name就变为了abc,而不是先 前的icmnlsdb.cn.ibm.com了,那么在tnsnames.ora中的service_name列,我就要指定这个值为 abc+db_domain.注意不是service_name+db_domain,因为我的service_name在修改后是不带domain标识 的,那么如果db_domain为空的话,tnsnames.ora文件中的service_name就直接可以写为abc了。大体就是这个意思,解释的 有点饶,但是总算可以从这条路中走出来了。
最后一点,lsnrctl status我们随时观察一下listener的状态,看看他到底有什么变化。很有意思的。
在init.ora中有db_name,instance_name,service_name
在操作系统中需要配置oracle_sid
在listener.ora中有SID_NAME,GLOBAL_DBNAME,
在tnsname.ora中有SERVICE_NAME,SID
这么多,是不是你也看糊涂了。先晕一个,下面慢慢道来。
在init.ora中有db_name,instance_name,service_name
db_name是数据库的名称,在db安装时就已经设置了,这里不可修改,它觉得了数据库安装文件的位置。
instance_name是实例名,是数据库运行中名称,其实在OO中db_name相当于类而instance_name向当于对象,它也 是代表数据库运行中的内存及其进程,同时影响到了这些进程的名称,譬如:一个数据库db_name=cus,而其实例instance_name= aking,那么数据库起来后,其进程名可能为:Pmon_aking_1。这里的实例名称要和PWDsid.ora和initSid.ora等文件匹配 上,否则,db起动报错。从这里可以看出db_name是类名,定义后是不可修改的,而对于instance_name实例名向当于对象,所以我们可以设 定自己喜欢的对象名称。不过话虽这样讲,但改了instance_name后,牵扯到很多其他的设置,还是最好不要动他,默认和db_name是一样的, 这样多好。
service_name我觉得应该是指数据库网络连接时的名称,在listener配置中会有所考虑的。这个值也是可以随意改动的,并且还可以有多个值。alter system set service_name=serv1,serv2 scope=both;
在listener.ora中有SID_NAME,GLOBAL_DBNAME
这里SID_NAME指数据库的运行的实例名,应该是和instance_name一致
而对于GLOBAL_DBNAME是listener配置的对外网络连接名称,我们在配置tnsname.ora时会考虑这个参数。这个参数可以任意的设置。
另外有一点需要注意,一般我们会在listener.ora手工配置数据库实例的监听配置。但oracle可以通过pmon进程支持自动注册, 这时自动注册的对外网络连接名称就会用到init.ora文件中service_name,有多个值的话就会注册多个,对于上面的例子,在这里就会注册 serv1和serv2两个监听服务。如果你还手工配置了一个GLOBAL_DBNAME=serv3的监听服务的话,那么对于实例 instance_name=aking就会有三个监听服务。
在tnsname.ora中有SERVICE_NAME,SID
下面配置客户端的tnsname.ora
对于这里的配置主要要给出要连接的数据库的IP及其连接的实例或服务
在监听配置中我们提到了对外网络连接名称,在这里如果我们用SERVICE_NAME的话,就需要SERVICE_NAME= (GLOBAL_DBNAME或者service_name这里要求oracle已经自动注册到了监听器中),对于SID= (instance_name)即可,譬如:
SERVICE_NAME=serv1,serv2,serv3都可以,或者
SID=aking
最后一个是ORACLE_SID参数,这个参数是操作系统中用到的,它是描述我们要默认连接的数据库实例,对于一个机器上有多个实例的情况下,要修改后才能通过 conn / as sysdba连接,因为这里用到了默认的实例名。